diff options
-rw-r--r-- | Documentation/kobject.txt | 4 | ||||
-rw-r--r-- | drivers/base/core.c | 5 | ||||
-rw-r--r-- | include/linux/sysfs.h | 4 | ||||
-rw-r--r-- | lib/kobject.c | 18 |
4 files changed, 17 insertions, 14 deletions
diff --git a/Documentation/kobject.txt b/Documentation/kobject.txt index 51a8021ee532..f5d2aad65a67 100644 --- a/Documentation/kobject.txt +++ b/Documentation/kobject.txt | |||
@@ -118,6 +118,10 @@ the name of the kobject, call kobject_rename(): | |||
118 | 118 | ||
119 | int kobject_rename(struct kobject *kobj, const char *new_name); | 119 | int kobject_rename(struct kobject *kobj, const char *new_name); |
120 | 120 | ||
121 | Note kobject_rename does perform any locking or have a solid notion of | ||
122 | what names are valid so the provide must provide their own sanity checking | ||
123 | and serialization. | ||
124 | |||
121 | There is a function called kobject_set_name() but that is legacy cruft and | 125 | There is a function called kobject_set_name() but that is legacy cruft and |
122 | is being removed. If your code needs to call this function, it is | 126 | is being removed. If your code needs to call this function, it is |
123 | incorrect and needs to be fixed. | 127 | incorrect and needs to be fixed. |
diff --git a/drivers/base/core.c b/drivers/base/core.c index 9649d1c422a4..8c2cc2648f5a 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
@@ -1327,6 +1327,11 @@ EXPORT_SYMBOL_GPL(device_destroy); | |||
1327 | * device_rename - renames a device | 1327 | * device_rename - renames a device |
1328 | * @dev: the pointer to the struct device to be renamed | 1328 | * @dev: the pointer to the struct device to be renamed |
1329 | * @new_name: the new name of the device | 1329 | * @new_name: the new name of the device |
1330 | * | ||
1331 | * It is the responsibility of the caller to provide mutual | ||
1332 | * exclusion between two different calls of device_rename | ||
1333 | * on the same device to ensure that new_name is valid and | ||
1334 | * won't conflict with other devices. | ||
1330 | */ | 1335 | */ |
1331 | int device_rename(struct device *dev, char *new_name) | 1336 | int device_rename(struct device *dev, char *new_name) |
1332 | { | 1337 | { |
diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h index b330e289d71f..39924a962207 100644 --- a/include/linux/sysfs.h +++ b/include/linux/sysfs.h | |||
@@ -20,6 +20,8 @@ | |||
20 | struct kobject; | 20 | struct kobject; |
21 | struct module; | 21 | struct module; |
22 | 22 | ||
23 | extern int kobject_set_name(struct kobject *kobj, const char *name, ...) | ||
24 | __attribute__((format(printf, 2, 3))); | ||
23 | /* FIXME | 25 | /* FIXME |
24 | * The *owner field is no longer used, but leave around | 26 | * The *owner field is no longer used, but leave around |
25 | * until the tree gets cleaned up fully. | 27 | * until the tree gets cleaned up fully. |
@@ -147,7 +149,7 @@ static inline void sysfs_remove_dir(struct kobject *kobj) | |||
147 | 149 | ||
148 | static inline int sysfs_rename_dir(struct kobject *kobj, const char *new_name) | 150 | static inline int sysfs_rename_dir(struct kobject *kobj, const char *new_name) |
149 | { | 151 | { |
150 | return 0; | 152 | return kobject_set_name(kobj, "%s", new_name); |
151 | } | 153 | } |
152 | 154 | ||
153 | static inline int sysfs_move_dir(struct kobject *kobj, | 155 | static inline int sysfs_move_dir(struct kobject *kobj, |
diff --git a/lib/kobject.c b/lib/kobject.c index fbf0ae282376..ae6bb900bfb6 100644 --- a/lib/kobject.c +++ b/lib/kobject.c | |||
@@ -387,6 +387,11 @@ 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 | { |
@@ -401,19 +406,6 @@ int kobject_rename(struct kobject *kobj, const char *new_name) | |||
401 | if (!kobj->parent) | 406 | if (!kobj->parent) |
402 | return -EINVAL; | 407 | return -EINVAL; |
403 | 408 | ||
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); | 409 | devpath = kobject_get_path(kobj, GFP_KERNEL); |
418 | if (!devpath) { | 410 | if (!devpath) { |
419 | error = -ENOMEM; | 411 | error = -ENOMEM; |