|
@@ -397,6 +397,7 @@ int kobject_rename(struct kobject *kobj, const char *new_name)
|
|
|
{
|
|
|
int error = 0;
|
|
|
const char *devpath = NULL;
|
|
|
+ const char *dup_name = NULL, *name;
|
|
|
char *devpath_string = NULL;
|
|
|
char *envp[2];
|
|
|
|
|
@@ -420,15 +421,27 @@ int kobject_rename(struct kobject *kobj, const char *new_name)
|
|
|
envp[0] = devpath_string;
|
|
|
envp[1] = NULL;
|
|
|
|
|
|
+ name = dup_name = kstrdup(new_name, GFP_KERNEL);
|
|
|
+ if (!name) {
|
|
|
+ error = -ENOMEM;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
error = sysfs_rename_dir(kobj, new_name);
|
|
|
+ if (error)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ /* Install the new kobject name */
|
|
|
+ dup_name = kobj->name;
|
|
|
+ kobj->name = name;
|
|
|
|
|
|
/* This function is mostly/only used for network interface.
|
|
|
* Some hotplug package track interfaces by their name and
|
|
|
* therefore want to know when the name is changed by the user. */
|
|
|
- if (!error)
|
|
|
- kobject_uevent_env(kobj, KOBJ_MOVE, envp);
|
|
|
+ kobject_uevent_env(kobj, KOBJ_MOVE, envp);
|
|
|
|
|
|
out:
|
|
|
+ kfree(dup_name);
|
|
|
kfree(devpath_string);
|
|
|
kfree(devpath);
|
|
|
kobject_put(kobj);
|