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); |
