diff options
Diffstat (limited to 'lib/kobject.c')
-rw-r--r-- | lib/kobject.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/lib/kobject.c b/lib/kobject.c index fbf0ae282376..0487d1f64806 100644 --- a/lib/kobject.c +++ b/lib/kobject.c | |||
@@ -387,11 +387,17 @@ EXPORT_SYMBOL_GPL(kobject_init_and_add); | |||
387 | * kobject_rename - change the name of an object | 387 | * kobject_rename - change the name of an object |
388 | * @kobj: object in question. | 388 | * @kobj: object in question. |
389 | * @new_name: object's new name | 389 | * @new_name: object's new name |
390 | * | ||
391 | * It is the responsibility of the caller to provide mutual | ||
392 | * exclusion between two different calls of kobject_rename | ||
393 | * on the same kobject and to ensure that new_name is valid and | ||
394 | * won't conflict with other kobjects. | ||
390 | */ | 395 | */ |
391 | int kobject_rename(struct kobject *kobj, const char *new_name) | 396 | int kobject_rename(struct kobject *kobj, const char *new_name) |
392 | { | 397 | { |
393 | int error = 0; | 398 | int error = 0; |
394 | const char *devpath = NULL; | 399 | const char *devpath = NULL; |
400 | const char *dup_name = NULL, *name; | ||
395 | char *devpath_string = NULL; | 401 | char *devpath_string = NULL; |
396 | char *envp[2]; | 402 | char *envp[2]; |
397 | 403 | ||
@@ -401,19 +407,6 @@ int kobject_rename(struct kobject *kobj, const char *new_name) | |||
401 | if (!kobj->parent) | 407 | if (!kobj->parent) |
402 | return -EINVAL; | 408 | return -EINVAL; |
403 | 409 | ||
404 | /* see if this name is already in use */ | ||
405 | if (kobj->kset) { | ||
406 | struct kobject *temp_kobj; | ||
407 | temp_kobj = kset_find_obj(kobj->kset, new_name); | ||
408 | if (temp_kobj) { | ||
409 | printk(KERN_WARNING "kobject '%s' cannot be renamed " | ||
410 | "to '%s' as '%s' is already in existence.\n", | ||
411 | kobject_name(kobj), new_name, new_name); | ||
412 | kobject_put(temp_kobj); | ||
413 | return -EINVAL; | ||
414 | } | ||
415 | } | ||
416 | |||
417 | devpath = kobject_get_path(kobj, GFP_KERNEL); | 410 | devpath = kobject_get_path(kobj, GFP_KERNEL); |
418 | if (!devpath) { | 411 | if (!devpath) { |
419 | error = -ENOMEM; | 412 | error = -ENOMEM; |
@@ -428,15 +421,27 @@ int kobject_rename(struct kobject *kobj, const char *new_name) | |||
428 | envp[0] = devpath_string; | 421 | envp[0] = devpath_string; |
429 | envp[1] = NULL; | 422 | envp[1] = NULL; |
430 | 423 | ||
424 | name = dup_name = kstrdup(new_name, GFP_KERNEL); | ||
425 | if (!name) { | ||
426 | error = -ENOMEM; | ||
427 | goto out; | ||
428 | } | ||
429 | |||
431 | error = sysfs_rename_dir(kobj, new_name); | 430 | error = sysfs_rename_dir(kobj, new_name); |
431 | if (error) | ||
432 | goto out; | ||
433 | |||
434 | /* Install the new kobject name */ | ||
435 | dup_name = kobj->name; | ||
436 | kobj->name = name; | ||
432 | 437 | ||
433 | /* This function is mostly/only used for network interface. | 438 | /* This function is mostly/only used for network interface. |
434 | * Some hotplug package track interfaces by their name and | 439 | * Some hotplug package track interfaces by their name and |
435 | * therefore want to know when the name is changed by the user. */ | 440 | * therefore want to know when the name is changed by the user. */ |
436 | if (!error) | 441 | kobject_uevent_env(kobj, KOBJ_MOVE, envp); |
437 | kobject_uevent_env(kobj, KOBJ_MOVE, envp); | ||
438 | 442 | ||
439 | out: | 443 | out: |
444 | kfree(dup_name); | ||
440 | kfree(devpath_string); | 445 | kfree(devpath_string); |
441 | kfree(devpath); | 446 | kfree(devpath); |
442 | kobject_put(kobj); | 447 | kobject_put(kobj); |