driver core: Implement ns directory support for device classes.
Eric W. Biederman [Tue, 30 Mar 2010 18:31:29 +0000 (11:31 -0700)]
device_del and device_rename were modified to use
sysfs_delete_link and sysfs_rename_link respectively to ensure
when these operations happen on devices whose classes
are in namespace directories they work properly.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Benjamin Thery <benjamin.thery@bull.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

drivers/base/core.c

index f069991..17e7d50 100644 (file)
@@ -786,7 +786,7 @@ out_device:
 out_busid:
        if (dev->kobj.parent != &dev->class->p->class_subsys.kobj &&
            device_is_not_partition(dev))
-               sysfs_remove_link(&dev->class->p->class_subsys.kobj,
+               sysfs_delete_link(&dev->class->p->class_subsys.kobj, &dev->kobj,
                                  dev_name(dev));
 #else
        /* link in the class directory pointing to the device */
@@ -804,7 +804,7 @@ out_busid:
        return 0;
 
 out_busid:
-       sysfs_remove_link(&dev->class->p->class_subsys.kobj, dev_name(dev));
+       sysfs_delete_link(&dev->class->p->class_subsys.kobj, &dev->kobj, dev_name(dev));
 #endif
 
 out_subsys:
@@ -832,13 +832,13 @@ static void device_remove_class_symlinks(struct device *dev)
 
        if (dev->kobj.parent != &dev->class->p->class_subsys.kobj &&
            device_is_not_partition(dev))
-               sysfs_remove_link(&dev->class->p->class_subsys.kobj,
+               sysfs_delete_link(&dev->class->p->class_subsys.kobj, &dev->kobj,
                                  dev_name(dev));
 #else
        if (dev->parent && device_is_not_partition(dev))
                sysfs_remove_link(&dev->kobj, "device");
 
-       sysfs_remove_link(&dev->class->p->class_subsys.kobj, dev_name(dev));
+       sysfs_delete_link(&dev->class->p->class_subsys.kobj, &dev->kobj, dev_name(dev));
 #endif
 
        sysfs_remove_link(&dev->kobj, "subsystem");
@@ -1624,6 +1624,14 @@ int device_rename(struct device *dev, char *new_name)
                goto out;
        }
 
+#ifndef CONFIG_SYSFS_DEPRECATED
+       if (dev->class) {
+               error = sysfs_rename_link(&dev->class->p->class_subsys.kobj,
+                       &dev->kobj, old_device_name, new_name);
+               if (error)
+                       goto out;
+       }
+#endif
        error = kobject_rename(&dev->kobj, new_name);
        if (error)
                goto out;
@@ -1638,11 +1646,6 @@ int device_rename(struct device *dev, char *new_name)
                                                  new_class_name);
                }
        }
-#else
-       if (dev->class) {
-               error = sysfs_rename_link(&dev->class->p->class_subsys.kobj,
-                                         &dev->kobj, old_device_name, new_name);
-       }
 #endif
 
 out: