From: Andrew Morton Signed-off-by: Andrew Morton --- drivers/base/class.c | 35 +++++++++++++++++++++++++++++++++++ include/linux/device.h | 2 ++ 2 files changed, 37 insertions(+) diff -puN drivers/base/class.c~revert-gregkh-driver-class_device_rename-remove drivers/base/class.c --- a/drivers/base/class.c~revert-gregkh-driver-class_device_rename-remove +++ a/drivers/base/class.c @@ -786,6 +786,41 @@ void class_device_destroy(struct class * class_device_unregister(class_dev); } +int class_device_rename(struct class_device *class_dev, char *new_name) +{ + int error = 0; + char *old_class_name = NULL, *new_class_name = NULL; + + class_dev = class_device_get(class_dev); + if (!class_dev) + return -EINVAL; + + pr_debug("CLASS: renaming '%s' to '%s'\n", class_dev->class_id, + new_name); + + if (class_dev->dev) + old_class_name = make_class_name(class_dev->class->name, + &class_dev->kobj); + + strlcpy(class_dev->class_id, new_name, KOBJ_NAME_LEN); + + error = kobject_rename(&class_dev->kobj, new_name); + + if (class_dev->dev) { + new_class_name = make_class_name(class_dev->class->name, + &class_dev->kobj); + sysfs_create_link(&class_dev->dev->kobj, &class_dev->kobj, + new_class_name); + sysfs_remove_link(&class_dev->dev->kobj, old_class_name); + } + class_device_put(class_dev); + + kfree(old_class_name); + kfree(new_class_name); + + return error; +} + struct class_device * class_device_get(struct class_device *class_dev) { if (class_dev) diff -puN include/linux/device.h~revert-gregkh-driver-class_device_rename-remove include/linux/device.h --- a/include/linux/device.h~revert-gregkh-driver-class_device_rename-remove +++ a/include/linux/device.h @@ -262,6 +262,8 @@ extern void class_device_initialize(stru extern int class_device_add(struct class_device *); extern void class_device_del(struct class_device *); +extern int class_device_rename(struct class_device *, char *); + extern struct class_device * class_device_get(struct class_device *); extern void class_device_put(struct class_device *); _