From: Cornelia Huck Fix check when to create certain symlinks (the device link and some compatible links). Signed-off-by: Cornelia Huck Cc: Greg KH Signed-off-by: Andrew Morton --- drivers/base/core.c | 18 ++++++++++-------- 1 files changed, 10 insertions(+), 8 deletions(-) diff -puN drivers/base/core.c~driver-core-check-return-code-of-sysfs_create_link-fix drivers/base/core.c --- a/drivers/base/core.c~driver-core-check-return-code-of-sysfs_create_link-fix +++ a/drivers/base/core.c @@ -665,12 +665,12 @@ static int device_add_class_symlinks(str * If this is not a "fake" compatible device, then create the * symlink from the class to the device. */ - if (dev->kobj.parent == &dev->class->subsys.kobj) - return 0; - error = sysfs_create_link(&dev->class->subsys.kobj, &dev->kobj, - dev->bus_id); - if (error) - goto out_subsys; + if (dev->kobj.parent != &dev->class->subsys.kobj) { + error = sysfs_create_link(&dev->class->subsys.kobj, &dev->kobj, + dev->bus_id); + if (error) + goto out_subsys; + } /* only bus-device parents get a "device"-link */ if (dev->parent && dev->parent->bus) { error = sysfs_create_link(&dev->kobj, &dev->parent->kobj, @@ -698,7 +698,8 @@ out_device: sysfs_remove_link(&dev->kobj, "device"); #endif out_busid: - sysfs_remove_link(&dev->class->subsys.kobj, dev->bus_id); + if (dev->kobj.parent != &dev->class->subsys.kobj) + sysfs_remove_link(&dev->class->subsys.kobj, dev->bus_id); out_subsys: sysfs_remove_link(&dev->kobj, "subsystem"); out: @@ -721,7 +722,8 @@ static void device_remove_class_symlinks #endif sysfs_remove_link(&dev->kobj, "device"); } - sysfs_remove_link(&dev->class->subsys.kobj, dev->bus_id); + if (dev->kobj.parent != &dev->class->subsys.kobj) + sysfs_remove_link(&dev->class->subsys.kobj, dev->bus_id); sysfs_remove_link(&dev->kobj, "subsystem"); } _