aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2006-09-18 16:24:28 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2006-09-26 00:08:40 -0400
commit81107bf531d2524afbcd61f3b4ad57a71295d591 (patch)
tree8c4f985714432bee996720c2d8e4bcfbe3d70575
parentf2eaae197f4590c4d96f31b09b0ee9067421a95c (diff)
Driver core: Remove unneeded routines from driver core
This patch (as783) simplifies the driver core slightly by removing four unnecessary _get and _put methods. It is vital that when a driver is removed from its bus's klist of registered drivers, or when a device is removed from a driver's klist of bound devices, that the klist updates complete synchronously. Otherwise the kernel might try binding an unregistered driver to a newly-registered device, or adding a device to the klist for a new driver before it has been removed from the old driver's klist. Since the removals must be synchronous, they don't need to update any reference counts. Hence the _get and _put methods can be dispensed with. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/base/bus.c18
-rw-r--r--drivers/base/driver.c16
2 files changed, 2 insertions, 32 deletions
diff --git a/drivers/base/bus.c b/drivers/base/bus.c
index 636af538a2b5..12173d16bea7 100644
--- a/drivers/base/bus.c
+++ b/drivers/base/bus.c
@@ -696,22 +696,6 @@ static void klist_devices_put(struct klist_node *n)
696 put_device(dev); 696 put_device(dev);
697} 697}
698 698
699static void klist_drivers_get(struct klist_node *n)
700{
701 struct device_driver *drv = container_of(n, struct device_driver,
702 knode_bus);
703
704 get_driver(drv);
705}
706
707static void klist_drivers_put(struct klist_node *n)
708{
709 struct device_driver *drv = container_of(n, struct device_driver,
710 knode_bus);
711
712 put_driver(drv);
713}
714
715/** 699/**
716 * bus_register - register a bus with the system. 700 * bus_register - register a bus with the system.
717 * @bus: bus. 701 * @bus: bus.
@@ -747,7 +731,7 @@ int bus_register(struct bus_type * bus)
747 goto bus_drivers_fail; 731 goto bus_drivers_fail;
748 732
749 klist_init(&bus->klist_devices, klist_devices_get, klist_devices_put); 733 klist_init(&bus->klist_devices, klist_devices_get, klist_devices_put);
750 klist_init(&bus->klist_drivers, klist_drivers_get, klist_drivers_put); 734 klist_init(&bus->klist_drivers, NULL, NULL);
751 bus_add_attrs(bus); 735 bus_add_attrs(bus);
752 736
753 pr_debug("bus type '%s' registered\n", bus->name); 737 pr_debug("bus type '%s' registered\n", bus->name);
diff --git a/drivers/base/driver.c b/drivers/base/driver.c
index 562600dd540a..1214cbd17d86 100644
--- a/drivers/base/driver.c
+++ b/drivers/base/driver.c
@@ -142,20 +142,6 @@ void put_driver(struct device_driver * drv)
142 kobject_put(&drv->kobj); 142 kobject_put(&drv->kobj);
143} 143}
144 144
145static void klist_devices_get(struct klist_node *n)
146{
147 struct device *dev = container_of(n, struct device, knode_driver);
148
149 get_device(dev);
150}
151
152static void klist_devices_put(struct klist_node *n)
153{
154 struct device *dev = container_of(n, struct device, knode_driver);
155
156 put_device(dev);
157}
158
159/** 145/**
160 * driver_register - register driver with bus 146 * driver_register - register driver with bus
161 * @drv: driver to register 147 * @drv: driver to register
@@ -175,7 +161,7 @@ int driver_register(struct device_driver * drv)
175 (drv->bus->shutdown && drv->shutdown)) { 161 (drv->bus->shutdown && drv->shutdown)) {
176 printk(KERN_WARNING "Driver '%s' needs updating - please use bus_type methods\n", drv->name); 162 printk(KERN_WARNING "Driver '%s' needs updating - please use bus_type methods\n", drv->name);
177 } 163 }
178 klist_init(&drv->klist_devices, klist_devices_get, klist_devices_put); 164 klist_init(&drv->klist_devices, NULL, NULL);
179 init_completion(&drv->unloaded); 165 init_completion(&drv->unloaded);
180 return bus_add_driver(drv); 166 return bus_add_driver(drv);
181} 167}