]> Pileus Git - ~andy/linux/blobdiff - drivers/base/bus.c
driver core fixes: sysfs_create_group() retval in topology.c
[~andy/linux] / drivers / base / bus.c
index aa685a20b64931ecad43549f98b953178a2e8626..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;
 }
 
@@ -392,6 +403,7 @@ out:
  *     bus_attach_device - add device to bus
  *     @dev:   device tried to attach to a driver
  *
+ *     - Add device to bus's list of devices.
  *     - Try to attach to driver.
  */
 int bus_attach_device(struct device * dev)
@@ -400,11 +412,13 @@ int bus_attach_device(struct device * dev)
        int ret = 0;
 
        if (bus) {
+               dev->is_registered = 1;
                ret = device_attach(dev);
                if (ret >= 0) {
                        klist_add_tail(&dev->knode_bus, &bus->klist_devices);
                        ret = 0;
-               }
+               } else
+                       dev->is_registered = 0;
        }
        return ret;
 }
@@ -425,7 +439,8 @@ void bus_remove_device(struct device * dev)
                sysfs_remove_link(&dev->kobj, "bus");
                sysfs_remove_link(&dev->bus->devices.kobj, dev->bus_id);
                device_remove_attrs(dev->bus, dev);
-               klist_remove(&dev->knode_bus);
+               dev->is_registered = 0;
+               klist_del(&dev->knode_bus);
                pr_debug("bus %s: remove device %s\n", dev->bus->name, dev->bus_id);
                device_release_driver(dev);
                put_bus(dev->bus);
@@ -692,22 +707,6 @@ static void klist_devices_put(struct klist_node *n)
        put_device(dev);
 }
 
-static void klist_drivers_get(struct klist_node *n)
-{
-       struct device_driver *drv = container_of(n, struct device_driver,
-                                                knode_bus);
-
-       get_driver(drv);
-}
-
-static void klist_drivers_put(struct klist_node *n)
-{
-       struct device_driver *drv = container_of(n, struct device_driver,
-                                                knode_bus);
-
-       put_driver(drv);
-}
-
 /**
  *     bus_register - register a bus with the system.
  *     @bus:   bus.
@@ -743,12 +742,16 @@ int bus_register(struct bus_type * bus)
                goto bus_drivers_fail;
 
        klist_init(&bus->klist_devices, klist_devices_get, klist_devices_put);
-       klist_init(&bus->klist_drivers, klist_drivers_get, klist_drivers_put);
-       bus_add_attrs(bus);
+       klist_init(&bus->klist_drivers, NULL, NULL);
+       retval = bus_add_attrs(bus);
+       if (retval)
+               goto bus_attrs_fail;
 
        pr_debug("bus type '%s' registered\n", bus->name);
        return 0;
 
+bus_attrs_fail:
+       kset_unregister(&bus->drivers);
 bus_drivers_fail:
        kset_unregister(&bus->devices);
 bus_devices_fail: