Module Name:    src
Committed By:   pgoyette
Date:           Sat Nov 28 22:41:36 UTC 2015

Modified Files:
        src/external/cddl/osnet/dev/dtrace: dtrace_modevent.c

Log Message:
When loading the module, if devsw_attach() fails, call dtrace_unload()
to undo the effects of dtrace_load().  And if dtrace_unload() fails,
panic (since we can't get the system back to its earlier stable state).

When unloading the module, call devsw_detach() first, to lock out any
new access.  Then call dtrace_unload().  If dgtrace_unload() fails,
reattach the devsw, and if that fails, panic.

Implements fixes described in PR kern/43032


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/external/cddl/osnet/dev/dtrace/dtrace_modevent.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/cddl/osnet/dev/dtrace/dtrace_modevent.c
diff -u src/external/cddl/osnet/dev/dtrace/dtrace_modevent.c:1.4 src/external/cddl/osnet/dev/dtrace/dtrace_modevent.c:1.5
--- src/external/cddl/osnet/dev/dtrace/dtrace_modevent.c:1.4	Thu Feb 26 09:10:52 2015
+++ src/external/cddl/osnet/dev/dtrace/dtrace_modevent.c	Sat Nov 28 22:41:36 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: dtrace_modevent.c,v 1.4 2015/02/26 09:10:52 ozaki-r Exp $	*/
+/*	$NetBSD: dtrace_modevent.c,v 1.5 2015/11/28 22:41:36 pgoyette Exp $	*/
 
 /*
  * CDDL HEADER START
@@ -34,13 +34,26 @@ dtrace_modcmd(modcmd_t cmd, void *data)
 	switch (cmd) {
 	case MODULE_CMD_INIT:
 		dtrace_load(NULL);
-		return devsw_attach("dtrace", NULL, &bmajor,
+		error = devsw_attach("dtrace", NULL, &bmajor,
 		    &dtrace_cdevsw, &cmajor);
+		if (error != 0)
+			if (dtrace_unload() != 0)
+				panic("failed to unload dtrace");
+		return error;
+
 	case MODULE_CMD_FINI:
-		error = dtrace_unload();
+		error = devsw_detach(NULL, &dtrace_cdevsw);
 		if (error != 0)
 			return error;
-		return devsw_detach(NULL, &dtrace_cdevsw);
+
+		error = dtrace_unload();
+		if (error != 0) {
+			if (devsw_attach("dtrace", NULL, &bmajor,
+					 &dtrace_cdevsw, &cmajor) != 0)
+				panic("failed to reattach dtrace_devsw");
+		}
+		return error;
+
 	case MODULE_CMD_AUTOUNLOAD:
 		return EBUSY;
 	default:

Reply via email to