vserver 2.0 rc7
[linux-2.6.git] / drivers / base / bus.c
index 3da2405..3cb04bb 100644 (file)
@@ -65,7 +65,7 @@ static struct sysfs_ops driver_sysfs_ops = {
 static void driver_release(struct kobject * kobj)
 {
        struct device_driver * drv = to_driver(kobj);
-       up(&drv->unload_sem);
+       complete(&drv->unloaded);
 }
 
 static struct kobj_type ktype_driver = {
@@ -390,7 +390,6 @@ void device_release_driver(struct device * dev)
                sysfs_remove_link(&drv->kobj, kobject_name(&dev->kobj));
                sysfs_remove_link(&dev->kobj, "driver");
                list_del_init(&dev->driver_list);
-               device_detach_shutdown(dev);
                if (drv->remove)
                        drv->remove(dev);
                dev->driver = NULL;
@@ -405,9 +404,8 @@ void device_release_driver(struct device * dev)
 
 static void driver_detach(struct device_driver * drv)
 {
-       struct list_head * entry, * next;
-       list_for_each_safe(entry, next, &drv->devices) {
-               struct device * dev = container_of(entry, struct device, driver_list);
+       while (!list_empty(&drv->devices)) {
+               struct device * dev = container_of(drv->devices.next, struct device, driver_list);
                device_release_driver(dev);
        }
 }
@@ -465,6 +463,7 @@ int bus_add_device(struct device * dev)
                up_write(&dev->bus->subsys.rwsem);
                device_add_attrs(bus, dev);
                sysfs_create_link(&bus->devices.kobj, &dev->kobj, dev->bus_id);
+               sysfs_create_link(&dev->kobj, &dev->bus->subsys.kset.kobj, "bus");
        }
        return error;
 }
@@ -481,6 +480,7 @@ int bus_add_device(struct device * dev)
 void bus_remove_device(struct device * dev)
 {
        if (dev->bus) {
+               sysfs_remove_link(&dev->kobj, "bus");
                sysfs_remove_link(&dev->bus->devices.kobj, dev->bus_id);
                device_remove_attrs(dev->bus, dev);
                down_write(&dev->bus->subsys.rwsem);