Page MenuHomeFreeBSD

D53676.diff
No OneTemporary

D53676.diff

diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c
--- a/sys/kern/subr_bus.c
+++ b/sys/kern/subr_bus.c
@@ -5285,31 +5285,38 @@
kobj_class_t driver;
int error, pass;
- bus_topo_lock();
-
dmd = (struct driver_module_data *)arg;
- bus_devclass = devclass_find_internal(dmd->dmd_busname, NULL, TRUE);
error = 0;
switch (what) {
case MOD_LOAD:
+ bus_topo_lock();
+ bus_devclass = devclass_find_internal(dmd->dmd_busname, NULL,
+ TRUE);
+ bus_topo_unlock();
if (dmd->dmd_chainevh)
- error = dmd->dmd_chainevh(mod,what,dmd->dmd_chainarg);
+ error = dmd->dmd_chainevh(mod, what, dmd->dmd_chainarg);
pass = dmd->dmd_pass;
driver = dmd->dmd_driver;
PDEBUG(("Loading module: driver %s on bus %s (pass %d)",
DRIVERNAME(driver), dmd->dmd_busname, pass));
+ bus_topo_lock();
error = devclass_add_driver(bus_devclass, driver, pass,
dmd->dmd_devclass);
+ bus_topo_unlock();
break;
case MOD_UNLOAD:
PDEBUG(("Unloading module: driver %s from bus %s",
DRIVERNAME(dmd->dmd_driver),
dmd->dmd_busname));
+ bus_topo_lock();
+ bus_devclass = devclass_find_internal(dmd->dmd_busname, NULL,
+ FALSE);
error = devclass_delete_driver(bus_devclass,
dmd->dmd_driver);
+ bus_topo_unlock();
if (!error && dmd->dmd_chainevh)
error = dmd->dmd_chainevh(mod,what,dmd->dmd_chainarg);
@@ -5318,8 +5325,12 @@
PDEBUG(("Quiesce module: driver %s from bus %s",
DRIVERNAME(dmd->dmd_driver),
dmd->dmd_busname));
+ bus_topo_lock();
+ bus_devclass = devclass_find_internal(dmd->dmd_busname, NULL,
+ FALSE);
error = devclass_quiesce_driver(bus_devclass,
dmd->dmd_driver);
+ bus_topo_unlock();
if (!error && dmd->dmd_chainevh)
error = dmd->dmd_chainevh(mod,what,dmd->dmd_chainarg);
@@ -5329,8 +5340,6 @@
break;
}
- bus_topo_unlock();
-
return (error);
}

File Metadata

Mime Type
text/plain
Expires
Wed, Jun 24, 12:00 PM (16 h, 19 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
34282551
Default Alt Text
D53676.diff (1 KB)

Event Timeline