⬢ DragonFlyBSD Kernel Audit
DF-5011 / fix.diff
← back to finding ↓ download raw
--- 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;