* [PATCH 2/2] driver-core: do not register a driver with bus_type not registered
@ 2009-02-14 13:23 Dave Young
0 siblings, 0 replies; only message in thread
From: Dave Young @ 2009-02-14 13:23 UTC (permalink / raw)
To: greg; +Cc: linux-usb, linux-kernel
If the bus_type is not registerd, driver_register to that bus will cause oops.
I found this bug when test built-in usb serial drivers (ie. aircable driver)
with 'nousb' cmdline params.
In this patch:
1. set the bus->p=NULL when bus_register failed and unregisterd.
2. if bus->p is NULL, driver_register BUG_ON will be triggered.
Signed-off-by: Dave Young <hidave.darkstar@gmail.com>
---
drivers/base/bus.c | 2 ++
drivers/base/driver.c | 2 ++
2 files changed, 4 insertions(+)
diff -uprN a/drivers/base/bus.c b/drivers/base/bus.c
--- a/drivers/base/bus.c 2009-02-14 20:47:24.441149465 +0800
+++ b/drivers/base/bus.c 2009-02-14 20:49:42.350149362 +0800
@@ -932,6 +932,7 @@ bus_uevent_fail:
kset_unregister(&bus->p->subsys);
kfree(bus->p);
out:
+ bus->p = NULL;
return retval;
}
EXPORT_SYMBOL_GPL(bus_register);
@@ -953,6 +954,7 @@ void bus_unregister(struct bus_type *bus
bus_remove_file(bus, &bus_attr_uevent);
kset_unregister(&bus->p->subsys);
kfree(bus->p);
+ bus->p = NULL;
}
EXPORT_SYMBOL_GPL(bus_unregister);
diff -uprN a/drivers/base/driver.c b/drivers/base/driver.c
--- a/drivers/base/driver.c 2009-02-14 20:47:38.048149854 +0800
+++ b/drivers/base/driver.c 2009-02-14 20:47:50.692141034 +0800
@@ -216,6 +216,8 @@ int driver_register(struct device_driver
int ret;
struct device_driver *other;
+ BUG_ON(!drv->bus->p);
+
if ((drv->bus->probe && drv->probe) ||
(drv->bus->remove && drv->remove) ||
(drv->bus->shutdown && drv->shutdown))
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2009-02-14 13:23 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-14 13:23 [PATCH 2/2] driver-core: do not register a driver with bus_type not registered Dave Young
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.