diff options
Diffstat (limited to 'lib/kobject.c')
-rw-r--r-- | lib/kobject.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/lib/kobject.c b/lib/kobject.c index bbbfab4145e6..db1d23707eb1 100644 --- a/lib/kobject.c +++ b/lib/kobject.c | |||
@@ -311,13 +311,43 @@ EXPORT_SYMBOL(kobject_set_name); | |||
311 | int kobject_rename(struct kobject * kobj, const char *new_name) | 311 | int kobject_rename(struct kobject * kobj, const char *new_name) |
312 | { | 312 | { |
313 | int error = 0; | 313 | int error = 0; |
314 | const char *devpath = NULL; | ||
315 | char *devpath_string = NULL; | ||
316 | char *envp[2]; | ||
314 | 317 | ||
315 | kobj = kobject_get(kobj); | 318 | kobj = kobject_get(kobj); |
316 | if (!kobj) | 319 | if (!kobj) |
317 | return -EINVAL; | 320 | return -EINVAL; |
318 | if (!kobj->parent) | 321 | if (!kobj->parent) |
319 | return -EINVAL; | 322 | return -EINVAL; |
323 | |||
324 | devpath = kobject_get_path(kobj, GFP_KERNEL); | ||
325 | if (!devpath) { | ||
326 | error = -ENOMEM; | ||
327 | goto out; | ||
328 | } | ||
329 | devpath_string = kmalloc(strlen(devpath) + 15, GFP_KERNEL); | ||
330 | if (!devpath_string) { | ||
331 | error = -ENOMEM; | ||
332 | goto out; | ||
333 | } | ||
334 | sprintf(devpath_string, "DEVPATH_OLD=%s", devpath); | ||
335 | envp[0] = devpath_string; | ||
336 | envp[1] = NULL; | ||
337 | /* Note : if we want to send the new name alone, not the full path, | ||
338 | * we could probably use kobject_name(kobj); */ | ||
339 | |||
320 | error = sysfs_rename_dir(kobj, kobj->parent->dentry, new_name); | 340 | error = sysfs_rename_dir(kobj, kobj->parent->dentry, new_name); |
341 | |||
342 | /* This function is mostly/only used for network interface. | ||
343 | * Some hotplug package track interfaces by their name and | ||
344 | * therefore want to know when the name is changed by the user. */ | ||
345 | if (!error) | ||
346 | kobject_uevent_env(kobj, KOBJ_MOVE, envp); | ||
347 | |||
348 | out: | ||
349 | kfree(devpath_string); | ||
350 | kfree(devpath); | ||
321 | kobject_put(kobj); | 351 | kobject_put(kobj); |
322 | 352 | ||
323 | return error; | 353 | return error; |