Module Name:    src
Committed By:   pooka
Date:           Fri Apr 16 11:51:23 UTC 2010

Modified Files:
        src/sys/kern: kern_module.c

Log Message:
Don't loop eternal if init of a builtin module fails.


To generate a diff of this commit:
cvs rdiff -u -r1.62 -r1.63 src/sys/kern/kern_module.c

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

Modified files:

Index: src/sys/kern/kern_module.c
diff -u src/sys/kern/kern_module.c:1.62 src/sys/kern/kern_module.c:1.63
--- src/sys/kern/kern_module.c:1.62	Thu Mar 18 18:25:45 2010
+++ src/sys/kern/kern_module.c	Fri Apr 16 11:51:23 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_module.c,v 1.62 2010/03/18 18:25:45 pooka Exp $	*/
+/*	$NetBSD: kern_module.c,v 1.63 2010/04/16 11:51:23 pooka Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_module.c,v 1.62 2010/03/18 18:25:45 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_module.c,v 1.63 2010/04/16 11:51:23 pooka Exp $");
 
 #define _MODULE_INTERNAL
 
@@ -395,6 +395,7 @@
 void
 module_init_class(modclass_t class)
 {
+	TAILQ_HEAD(, module) bi_fail = TAILQ_HEAD_INITIALIZER(bi_fail);
 	module_t *mod;
 	modinfo_t *mi;
 
@@ -408,7 +409,16 @@
 			mi = mod->mod_info;
 			if (class != MODULE_CLASS_ANY && class != mi->mi_class)
 				continue;
-			(void)module_do_builtin(mi->mi_name, NULL);
+			/*
+			 * If initializing a builtin module fails, don't try
+			 * to load it again.  But keep it around and queue it
+			 * on the disabled list after we're done with module
+			 * init.
+			 */
+			if (module_do_builtin(mi->mi_name, NULL) != 0) {
+				TAILQ_REMOVE(&module_builtins, mod, mod_chain);
+				TAILQ_INSERT_TAIL(&bi_fail, mod, mod_chain);
+			}
 			break;
 		}
 	} while (mod != NULL);
@@ -427,6 +437,13 @@
 			break;
 		}
 	} while (mod != NULL);
+
+	/* failed builtin modules remain disabled */
+	while ((mod = TAILQ_FIRST(&bi_fail)) != NULL) {
+		TAILQ_REMOVE(&bi_fail, mod, mod_chain);
+		TAILQ_INSERT_TAIL(&module_builtins, mod, mod_chain);
+	}
+
 	mutex_exit(&module_lock);
 }
 

Reply via email to