Commit 663a4743 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

kobject: fix up kobject_set_name to use kvasprintf



Kay pointed out that kobject_set_name was being very stupid, doing two
allocations for every call, when it should just be using the kernel
function kvasprintf() instead.

This change adds the internal kobject_set_name_vargs() function, which
other follow-on patches will be using.

Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 15f2bbb2
Loading
Loading
Loading
Loading
+32 −39
Original line number Diff line number Diff line
@@ -232,10 +232,37 @@ int kobject_register(struct kobject * kobj)
	return error;
}

/**
 * kobject_set_name_vargs - Set the name of an kobject
 * @kobj: struct kobject to set the name of
 * @fmt: format string used to build the name
 * @vargs: vargs to format the string.
 */
static int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,
				  va_list vargs)
{
	va_list aq;
	char *name;

	va_copy(aq, vargs);
	name = kvasprintf(GFP_KERNEL, fmt, vargs);
	va_end(aq);

	if (!name)
		return -ENOMEM;

	/* Free the old name, if necessary. */
	kfree(kobj->k_name);

	/* Now, set the new name */
	kobj->k_name = name;

	return 0;
}

/**
 * kobject_set_name - Set the name of a kobject
 * @kobj: kobject to name
 * @kobj: struct kobject to set the name of
 * @fmt: format string used to build the name
 *
 * This sets the name of the kobject.  If you have already added the
@@ -244,48 +271,14 @@ int kobject_register(struct kobject * kobj)
 */
int kobject_set_name(struct kobject *kobj, const char *fmt, ...)
{
	int error = 0;
	int limit;
	int need;
	va_list args;
	char *name;
	int retval;

	/* find out how big a buffer we need */
	name = kmalloc(1024, GFP_KERNEL);
	if (!name) {
		error = -ENOMEM;
		goto done;
	}
	va_start(args, fmt);
	need = vsnprintf(name, 1024, fmt, args);
	retval = kobject_set_name_vargs(kobj, fmt, args);
	va_end(args);
	kfree(name);

	/* Allocate the new space and copy the string in */
	limit = need + 1;
	name = kmalloc(limit, GFP_KERNEL);
	if (!name) {
		error = -ENOMEM;
		goto done;
	}
	va_start(args, fmt);
	need = vsnprintf(name, limit, fmt, args);
	va_end(args);

	/* something wrong with the string we copied? */
	if (need >= limit) {
		kfree(name);
		error = -EFAULT;
		goto done;
	}

	/* Free the old name, if necessary. */
	kfree(kobj->k_name);

	/* Now, set the new name */
	kobj->k_name = name;
done:
	return error;
	return retval;
}
EXPORT_SYMBOL(kobject_set_name);