Module Name: src
Committed By: pgoyette
Date: Thu Jun 16 23:09:44 UTC 2016
Modified Files:
src/sys/kern: kern_module.c
Log Message:
Check for duplicate module names before loading modules that were
"pushed" by the boot loader. The boot loader pushes the module
name for the root file system (unless the root file system is ffs)
even if the file system module is built into the kernel. When
this happens, we get a lot of "redefined symbol" error messages.
This fix does not alter the behavior of pushing the file system
name. It simply avoids the redefined symbol errors by detecting
that the module is already built-in to the kernel and not trying
to load another copy.
While here, differentiate the error message text between "failed
to load" and "failed to fetch_info" conditions.
Addresses PR kern/50357
To generate a diff of this commit:
cvs rdiff -u -r1.110 -r1.111 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.110 src/sys/kern/kern_module.c:1.111
--- src/sys/kern/kern_module.c:1.110 Sat Feb 6 22:48:07 2016
+++ src/sys/kern/kern_module.c Thu Jun 16 23:09:44 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_module.c,v 1.110 2016/02/06 22:48:07 pgoyette Exp $ */
+/* $NetBSD: kern_module.c,v 1.111 2016/06/16 23:09:44 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.110 2016/02/06 22:48:07 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_module.c,v 1.111 2016/06/16 23:09:44 pgoyette Exp $");
#define _MODULE_INTERNAL
@@ -1235,6 +1235,8 @@ module_do_unload(const char *name, bool
int
module_prime(const char *name, void *base, size_t size)
{
+ __link_set_decl(modules, modinfo_t);
+ modinfo_t *const *mip;
module_t *mod;
int error;
@@ -1243,6 +1245,18 @@ module_prime(const char *name, void *bas
return ENOMEM;
}
+ /* Check for duplicate modules */
+
+ __link_set_foreach(mip, modules) {
+ if (*mip == &module_dummy)
+ continue;
+ if (strcmp((*mip)->mi_name, name) == 0) {
+ module_error("module `%s' pushed by boot loader "
+ "already exists", name);
+ kmem_free(mod, sizeof(*mod));
+ return EEXIST;
+ }
+ }
error = kobj_load_mem(&mod->mod_kobj, name, base, size);
if (error != 0) {
kmem_free(mod, sizeof(*mod));
@@ -1254,8 +1268,8 @@ module_prime(const char *name, void *bas
if (error != 0) {
kobj_unload(mod->mod_kobj);
kmem_free(mod, sizeof(*mod));
- module_error("unable to load `%s' pushed by boot loader, "
- "error %d", name, error);
+ module_error("unable to fetch_info for `%s' pushed by boot "
+ "loader, error %d", name, error);
return error;
}