Module Name: src Committed By: pgoyette Date: Mon May 24 03:50:25 UTC 2010
Modified Files: src/sys/kern: kern_module.c vfs_subr.c src/sys/sys: module.h Log Message: Protect against attempting to load modules from the filesystem until we have mounted the root file-system. This allows us to load built-in and boot-loader-provided modules much earlier during startup. To generate a diff of this commit: cvs rdiff -u -r1.65 -r1.66 src/sys/kern/kern_module.c cvs rdiff -u -r1.400 -r1.401 src/sys/kern/vfs_subr.c cvs rdiff -u -r1.22 -r1.23 src/sys/sys/module.h 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.65 src/sys/kern/kern_module.c:1.66 --- src/sys/kern/kern_module.c:1.65 Sun May 2 11:01:03 2010 +++ src/sys/kern/kern_module.c Mon May 24 03:50:25 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_module.c,v 1.65 2010/05/02 11:01:03 pooka Exp $ */ +/* $NetBSD: kern_module.c,v 1.66 2010/05/24 03:50:25 pgoyette 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.65 2010/05/02 11:01:03 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_module.c,v 1.66 2010/05/24 03:50:25 pgoyette Exp $"); #define _MODULE_INTERNAL @@ -97,16 +97,26 @@ static bool module_merge_dicts(prop_dictionary_t, const prop_dictionary_t); -int module_eopnotsupp(void); +int module_eopnotsupp(const char *, int, bool, module_t *, + prop_dictionary_t *); + +int (*module_load_vfs_vec)(const char *, int, bool, module_t *, + prop_dictionary_t *); int -module_eopnotsupp(void) +module_eopnotsupp(const char *name, int flags, bool autoload, module_t *mod, + prop_dictionary_t *filedictp) { - return EOPNOTSUPP; } __weak_alias(module_load_vfs,module_eopnotsupp); +void +module_load_vfs_init(void) +{ + module_load_vfs_vec = module_load_vfs; +} + /* * module_error: * @@ -314,6 +324,8 @@ mutex_init(&module_lock, MUTEX_DEFAULT, IPL_NONE); cv_init(&module_thread_cv, "modunload"); mutex_init(&module_thread_lock, MUTEX_DEFAULT, IPL_NONE); + module_load_vfs_vec = module_eopnotsupp; + #ifdef MODULAR /* XXX */ module_init_md(); #endif @@ -846,7 +858,8 @@ return ENOMEM; } - error = module_load_vfs(name, flags, autoload, mod, &filedict); + error = (*module_load_vfs_vec)(name, flags, autoload, mod, + &filedict); if (error != 0) { kmem_free(mod, sizeof(*mod)); depth--; Index: src/sys/kern/vfs_subr.c diff -u src/sys/kern/vfs_subr.c:1.400 src/sys/kern/vfs_subr.c:1.401 --- src/sys/kern/vfs_subr.c:1.400 Fri Apr 30 10:03:13 2010 +++ src/sys/kern/vfs_subr.c Mon May 24 03:50:25 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_subr.c,v 1.400 2010/04/30 10:03:13 pooka Exp $ */ +/* $NetBSD: vfs_subr.c,v 1.401 2010/05/24 03:50:25 pgoyette Exp $ */ /*- * Copyright (c) 1997, 1998, 2004, 2005, 2007, 2008 The NetBSD Foundation, Inc. @@ -91,7 +91,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.400 2010/04/30 10:03:13 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.401 2010/05/24 03:50:25 pgoyette Exp $"); #include "opt_ddb.h" #include "opt_compat_netbsd.h" @@ -119,6 +119,7 @@ #include <sys/atomic.h> #include <sys/kthread.h> #include <sys/wapbl.h> +#include <sys/module.h> #include <miscfs/genfs/genfs.h> #include <miscfs/specfs/specdev.h> @@ -2617,6 +2618,11 @@ initproc->p_cwdi->cwdi_cdir = rootvnode; vref(initproc->p_cwdi->cwdi_cdir); initproc->p_cwdi->cwdi_rdir = NULL; + /* + * Enable loading of modules from the filesystem + */ + module_load_vfs_init(); + } return (error); } Index: src/sys/sys/module.h diff -u src/sys/sys/module.h:1.22 src/sys/sys/module.h:1.23 --- src/sys/sys/module.h:1.22 Mon Apr 26 23:18:51 2010 +++ src/sys/sys/module.h Mon May 24 03:50:25 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: module.h,v 1.22 2010/04/26 23:18:51 pooka Exp $ */ +/* $NetBSD: module.h,v 1.23 2010/05/24 03:50:25 pgoyette Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -135,11 +135,15 @@ void module_rele(const char *); int module_find_section(const char *, void **, size_t *); void module_thread_kick(void); +void module_load_vfs_init(void); void module_whatis(uintptr_t, void (*)(const char *, ...)); void module_print_list(void (*)(const char *, ...)); #ifdef _MODULE_INTERNAL +extern +int (*module_load_vfs_vec)(const char *, int, bool, module_t *, + prop_dictionary_t *); int module_load_vfs(const char *, int, bool, module_t *, prop_dictionary_t *); void module_error(const char *, ...)