DF-5011 / fix.diff
--- a/sys/dev/misc/dimm/dimm.c +++ b/sys/dev/misc/dimm/dimm.c @@ -72,7 +72,7 @@ #define DIMM_SENS_TF_TEMP_CRIT 0x1 #define DIMM_SENS_TF_ECC_CRIT 0x2 -static void dimm_mod_unload(void); +static int dimm_mod_unload(void); static void dimm_sensor_ecc(struct dimm_softc *, struct ksensor *, boolean_t); @@ -302,22 +302,23 @@ sensor_set(sens, sc->dimm_ecc_cnt, status); } -static void +static int dimm_mod_unload(void) { struct dimm_softc *sc; SYSCTL_XLOCK(); - while ((sc = TAILQ_FIRST(&dimm_softc_list)) != NULL) { - int error; - - error = dimm_destroy(sc); - KASSERT(!error, ("dimm%d is still referenced, ref %d", - sc->dimm_id, sc->dimm_ref)); + sc = TAILQ_FIRST(&dimm_softc_list); + if (sc != NULL) { + kprintf("dimm%d is still referenced (ref %d); " + "cannot unload\n", sc->dimm_id, sc->dimm_ref); + SYSCTL_XUNLOCK(); + return EBUSY; } SYSCTL_XUNLOCK(); + return 0; } static int @@ -329,8 +330,7 @@ return 0; case MOD_UNLOAD: - dimm_mod_unload(); - return 0; + return dimm_mod_unload(); default: return 0; |