diff options
author | Denys Vlasenko | 2009-06-22 00:47:18 +0200 |
---|---|---|
committer | Denys Vlasenko | 2009-06-22 00:47:18 +0200 |
commit | fbb12ddc6a53ad97ff6bcc7ed9b253c09001ad2f (patch) | |
tree | 94c82f9eac30c86a1ec4f4d06f6c17b72b47cf3e /modutils/modprobe.c | |
parent | b6bca7703bbe6aacec0bda964c82fad389a02b69 (diff) | |
download | busybox-1_14_2.zip busybox-1_14_2.tar.gz |
post 1.14.1 fixes; bump version to 1.14.21_14_2
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'modutils/modprobe.c')
-rw-r--r-- | modutils/modprobe.c | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/modutils/modprobe.c b/modutils/modprobe.c index 0339ebb..310eebc 100644 --- a/modutils/modprobe.c +++ b/modutils/modprobe.c @@ -8,12 +8,17 @@ * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ +/* Note that unlike older versions of modules.dep/depmod (busybox and m-i-t), + * we expect the full dependency list to be specified in modules.dep. Older + * versions would only export the direct dependency list. + */ + #include "libbb.h" #include "modutils.h" #include <sys/utsname.h> #include <fnmatch.h> -//#define DBG(...) bb_error_msg(__VA_ARGS__) +//#define DBG(fmt, ...) bb_error_msg("%s: " fmt, __func__, ## __VA_ARGS__) #define DBG(...) ((void)0) #define MODULE_FLAG_LOADED 0x0001 @@ -116,6 +121,7 @@ static void add_probe(const char *name) return; } + DBG("queuing %s", name); m->probed_name = name; m->flags |= MODULE_FLAG_NEED_DEPS; llist_add_to_end(&G.probes, m); @@ -205,9 +211,10 @@ static int read_config(const char *path) static int do_modprobe(struct module_entry *m) { - struct module_entry *m2; + struct module_entry *m2 = m2; /* for compiler */ char *fn, *options; - int rc = -1; + int rc, first; + llist_t *l; if (!(m->flags & MODULE_FLAG_FOUND_IN_MODDEP)) { DBG("skipping %s, not found in modules.dep", m->modname); @@ -218,13 +225,25 @@ static int do_modprobe(struct module_entry *m) if (!(option_mask32 & MODPROBE_OPT_REMOVE)) m->deps = llist_rev(m->deps); + for (l = m->deps; l != NULL; l = l->link) + DBG("dep: %s", l->data); + + first = 1; rc = 0; while (m->deps && rc == 0) { fn = llist_pop(&m->deps); m2 = get_or_add_modentry(fn); if (option_mask32 & MODPROBE_OPT_REMOVE) { - if (bb_delete_module(m->modname, O_EXCL) != 0) - rc = errno; + if (m2->flags & MODULE_FLAG_LOADED) { + if (bb_delete_module(m2->modname, O_EXCL) != 0) { + if (first) + rc = errno; + } else { + m2->flags &= ~MODULE_FLAG_LOADED; + } + } + /* do not error out if *deps* fail to unload */ + first = 0; } else if (!(m2->flags & MODULE_FLAG_LOADED)) { options = m2->options; m2->options = NULL; @@ -242,11 +261,10 @@ static int do_modprobe(struct module_entry *m) free(fn); } -//FIXME: what if rc < 0? - if (rc > 0 && !(option_mask32 & INSMOD_OPT_SILENT)) { + if (rc && !(option_mask32 & INSMOD_OPT_SILENT)) { bb_error_msg("failed to %sload module %s: %s", (option_mask32 & MODPROBE_OPT_REMOVE) ? "un" : "", - m->probed_name ? m->probed_name : m->modname, + m2->probed_name ? m2->probed_name : m2->modname, moderror(rc) ); } @@ -294,7 +312,8 @@ static void load_modules_dep(void) llist_add_to(&m->deps, xstrdup(tokens[0])); if (tokens[1]) string_to_llist(tokens[1], &m->deps, " "); - } + } else + DBG("skipping dep line"); } config_close(p); } @@ -344,10 +363,12 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv) if (opt & (MODPROBE_OPT_INSERT_ALL | MODPROBE_OPT_REMOVE)) { /* Each argument is a module name */ do { + DBG("adding module %s", *argv); add_probe(*argv++); } while (*argv); } else { /* First argument is module name, rest are parameters */ + DBG("probing just module %s", *argv); add_probe(argv[0]); G.cmdline_mopts = parse_cmdline_module_options(argv); } |