summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_bus.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/subr_bus.c')
-rw-r--r--sys/kern/subr_bus.c11
1 files changed, 4 insertions, 7 deletions
diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c
index 22ad812..de36141 100644
--- a/sys/kern/subr_bus.c
+++ b/sys/kern/subr_bus.c
@@ -162,7 +162,10 @@ devclass_add_driver(devclass_t dc, driver_t *driver)
bzero(dl, sizeof *dl);
/*
- * Compile the driver's methods.
+ * Compile the driver's methods. Also increase the reference count
+ * so that the class doesn't get freed when the last instance
+ * goes. This means we can safely use static methods and avoids a
+ * double-free in devclass_delete_driver.
*/
kobj_class_compile((kobj_class_t) driver);
@@ -986,7 +989,6 @@ device_set_driver(device_t dev, driver_t *driver)
return ENOMEM;
}
bzero(dev->softc, driver->size);
- driver->refs++;
} else
kobj_init((kobj_t) dev, &null_class);
return 0;
@@ -1843,11 +1845,6 @@ bus_generic_driver_added(device_t dev, driver_t *driver)
{
device_t child;
- /*
- * Make sure the class has a valid ops table.
- */
- kobj_class_compile((kobj_class_t) driver);
-
DEVICE_IDENTIFY(driver, dev);
for (child = TAILQ_FIRST(&dev->children);
child; child = TAILQ_NEXT(child, link))
OpenPOWER on IntegriCloud