driver core fixes: bus_add_device() cleanup on error
authorCornelia Huck <cornelia.huck@de.ibm.com>
Fri, 22 Sep 2006 09:37:08 +0000 (11:37 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 18 Oct 2006 19:49:55 +0000 (12:49 -0700)
Correct cleanup in the error path of bus_add_device().

Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/base/bus.c

index b90f6e6f644263811bc736ce2401d28ea9e77254..d516f7d5f16884bca1a10bd25c40f3f7f37a1f54 100644 (file)
@@ -372,19 +372,30 @@ int bus_add_device(struct device * dev)
                pr_debug("bus %s: add device %s\n", bus->name, dev->bus_id);
                error = device_add_attrs(bus, dev);
                if (error)
-                       goto out;
+                       goto out_put;
                error = sysfs_create_link(&bus->devices.kobj,
                                                &dev->kobj, dev->bus_id);
                if (error)
-                       goto out;
+                       goto out_id;
                error = sysfs_create_link(&dev->kobj,
                                &dev->bus->subsys.kset.kobj, "subsystem");
                if (error)
-                       goto out;
+                       goto out_subsys;
                error = sysfs_create_link(&dev->kobj,
                                &dev->bus->subsys.kset.kobj, "bus");
+               if (error)
+                       goto out_deprecated;
        }
-out:
+       return 0;
+
+out_deprecated:
+       sysfs_remove_link(&dev->kobj, "subsystem");
+out_subsys:
+       sysfs_remove_link(&bus->devices.kobj, dev->bus_id);
+out_id:
+       device_remove_attrs(bus, dev);
+out_put:
+       put_bus(dev->bus);
        return error;
 }