summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authormux <mux@FreeBSD.org>2002-08-02 20:56:07 +0000
committermux <mux@FreeBSD.org>2002-08-02 20:56:07 +0000
commita7c11c91eb4e5af89d477fbb8bfd9b7a5d42eaa7 (patch)
tree97627424d15db9766ee1cd606cc49762644c096f /sys
parent1bd16d78e2a55104eb99d69e442460fe637caab9 (diff)
downloadFreeBSD-src-a7c11c91eb4e5af89d477fbb8bfd9b7a5d42eaa7.zip
FreeBSD-src-a7c11c91eb4e5af89d477fbb8bfd9b7a5d42eaa7.tar.gz
Make the consumers of the linker_load_file() function use
linker_load_module() instead. This fixes a bug where the kernel was unable to properly locate and load a kernel module in vfs_mount() (and probably in the netgraph code as well since it was using the same function). This is because the linker_load_file() does not properly search the module path. Problem found by: peter Reviewed by: peter Thanks to: peter
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/kern_linker.c7
-rw-r--r--sys/kern/vfs_mount.c4
-rw-r--r--sys/netgraph/ng_base.c2
-rw-r--r--sys/sys/linker.h6
4 files changed, 9 insertions, 10 deletions
diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c
index f34205c..e30e52c 100644
--- a/sys/kern/kern_linker.c
+++ b/sys/kern/kern_linker.c
@@ -57,9 +57,6 @@ int kld_debug = 0;
* *verinfo);
*/
static const char *linker_basename(const char *path);
-static int linker_load_module(const char *kldname, const char *modname,
- struct linker_file *parent, struct mod_depend *verinfo,
- struct linker_file **lfpp);
/* Metadata from the static kernel */
SET_DECLARE(modmetadata_set, struct mod_metadata);
@@ -314,7 +311,7 @@ linker_init_kernel_modules(void)
SYSINIT(linker_kernel, SI_SUB_KLD, SI_ORDER_ANY, linker_init_kernel_modules, 0)
-int
+static int
linker_load_file(const char *filename, linker_file_t *result)
{
linker_class_t lc;
@@ -1626,7 +1623,7 @@ linker_basename(const char *path)
* Find a file which contains given module and load it, if "parent" is not
* NULL, register a reference to it.
*/
-static int
+int
linker_load_module(const char *kldname, const char *modname,
struct linker_file *parent, struct mod_depend *verinfo,
struct linker_file **lfpp)
diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c
index ae7f30c..3dd4b06 100644
--- a/sys/kern/vfs_mount.c
+++ b/sys/kern/vfs_mount.c
@@ -596,7 +596,7 @@ vfs_nmount(td, fsflags, fsoptions)
vput(vp);
goto bad;
}
- error = linker_load_file(fstype, &lf);
+ error = linker_load_module(NULL, fstype, NULL, NULL, &lf);
if (error || lf == NULL) {
vput(vp);
if (lf == NULL)
@@ -964,7 +964,7 @@ vfs_mount(td, fstype, fspath, fsflags, fsdata)
vput(vp);
return (error);
}
- error = linker_load_file(fstype, &lf);
+ error = linker_load_module(NULL, fstype, NULL, NULL, &lf);
if (error || lf == NULL) {
vput(vp);
if (lf == NULL)
diff --git a/sys/netgraph/ng_base.c b/sys/netgraph/ng_base.c
index ccab434..1acc6ad 100644
--- a/sys/netgraph/ng_base.c
+++ b/sys/netgraph/ng_base.c
@@ -556,7 +556,7 @@ ng_make_node(const char *typename, node_p *nodepp)
/* Not found, try to load it as a loadable module */
snprintf(filename, sizeof(filename), "ng_%s", typename);
- error = linker_load_file(filename, &lf);
+ error = linker_load_module(NULL, filename, NULL, NULL, &lf);
if (error != 0)
return (error);
lf->userrefs++; /* pretend loaded by the syscall */
diff --git a/sys/sys/linker.h b/sys/sys/linker.h
index 3b3edca..0090a5f 100644
--- a/sys/sys/linker.h
+++ b/sys/sys/linker.h
@@ -105,9 +105,11 @@ extern linker_file_t linker_kernel_file;
int linker_add_class(linker_class_t _cls);
/*
- * Load a file, trying each file class until one succeeds.
+ * Load a kernel module.
*/
-int linker_load_file(const char* _filename, linker_file_t* _result);
+int linker_load_module(const char *_kldname, const char *_modname,
+ struct linker_file *_parent, struct mod_depend *_verinfo,
+ struct linker_file **_lfpp);
/*
* Obtain a reference to a module, loading it if required.
OpenPOWER on IntegriCloud