summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorbrian <brian@FreeBSD.org>2002-04-10 01:13:57 +0000
committerbrian <brian@FreeBSD.org>2002-04-10 01:13:57 +0000
commit8ad55476a0c93a0bcb9e3363b8a11bd9a5c02883 (patch)
tree09baefc08667f2a69a2232e92a34ddae0120a2f3 /sys
parentbb6d0ad1874d4e5dc01d944e588782bb11194dba (diff)
downloadFreeBSD-src-8ad55476a0c93a0bcb9e3363b8a11bd9a5c02883.zip
FreeBSD-src-8ad55476a0c93a0bcb9e3363b8a11bd9a5c02883.tar.gz
Change linker_reference_module() so that it's passed a struct
mod_depend * (which may be NULL). The only consumer of this function at the moment is digi_loadmoduledata(), and that passes a NULL mod_depend *. In linker_reference_module(), check to see if we've already got the required module loaded. If we have, bump the reference count and return that, otherwise continue the module search as normal.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/digi/digi.c10
-rw-r--r--sys/kern/kern_linker.c17
-rw-r--r--sys/sys/linker.h5
3 files changed, 26 insertions, 6 deletions
diff --git a/sys/dev/digi/digi.c b/sys/dev/digi/digi.c
index 90ba01c..18ea046 100644
--- a/sys/dev/digi/digi.c
+++ b/sys/dev/digi/digi.c
@@ -1028,8 +1028,14 @@ digi_loadmoduledata(struct digi_softc *sc)
modlen = strlen(sc->module);
modfile = malloc(modlen + 6, M_TEMP, M_WAITOK);
snprintf(modfile, modlen + 6, "digi_%s", sc->module);
- if ((res = linker_reference_module(modfile, &lf)) != 0)
- printf("%s: Failed %d to load module\n", modfile, res);
+ if ((res = linker_reference_module(modfile, NULL, &lf)) != 0) {
+ if (res == ENOENT && rootdev == NODEV)
+ printf("%s: Failed to autoload module: No filesystem\n",
+ modfile);
+ else
+ printf("%s: Failed %d to autoload module\n", modfile,
+ res);
+ }
free(modfile, M_TEMP);
if (res != 0)
return (res);
diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c
index bad5e1e..a88d636 100644
--- a/sys/kern/kern_linker.c
+++ b/sys/kern/kern_linker.c
@@ -98,6 +98,9 @@ struct modlist {
typedef struct modlist *modlist_t;
static modlisthead_t found_modules;
+static modlist_t modlist_lookup2(const char *name,
+ struct mod_depend *verinfo);
+
static char *
linker_strdup(const char *str)
{
@@ -345,11 +348,19 @@ out:
return (error);
}
-/* XXX: function parameters are incomplete */
int
-linker_reference_module(const char *modname, linker_file_t *result)
+linker_reference_module(const char *modname, struct mod_depend *verinfo,
+ linker_file_t *result)
{
- return (linker_load_module(NULL, modname, NULL, NULL, result));
+ modlist_t mod;
+
+ if ((mod = modlist_lookup2(modname, verinfo)) != NULL) {
+ *result = mod->container;
+ (*result)->refs++;
+ return (0);
+ }
+
+ return (linker_load_module(NULL, modname, NULL, verinfo, result));
}
linker_file_t
diff --git a/sys/sys/linker.h b/sys/sys/linker.h
index 28169d5..f138df7 100644
--- a/sys/sys/linker.h
+++ b/sys/sys/linker.h
@@ -38,6 +38,8 @@
MALLOC_DECLARE(M_LINKER);
#endif
+struct mod_depend;
+
/*
* Object representing a file which has been loaded by the linker.
*/
@@ -110,7 +112,8 @@ int linker_load_file(const char* _filename, linker_file_t* _result);
/*
* Obtain a reference to a module, loading it if required.
*/
-int linker_reference_module(const char* _modname, linker_file_t* _result);
+int linker_reference_module(const char* _modname, struct mod_depend *_verinfo,
+ linker_file_t* _result);
/*
* Find a currently loaded file given its filename.
OpenPOWER on IntegriCloud