modprobe: read modules.builtin
authorBen Hutchings <ben@decadent.org.uk>
Thu, 6 Apr 2017 09:54:04 +0000 (11:54 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 6 Apr 2017 09:54:04 +0000 (11:54 +0200)
This allows explicit probing to succeed when the requested module
is actually built-in, and corrects the error message for removal.

Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
modutils/modprobe.c

index a6224fa63354d74c8a9f64a0bbefee2010e5ab33..c82eaa8d85f07efae6153ca6c7e2d44b34a4cc0b 100644 (file)
@@ -171,6 +171,7 @@ static const char modprobe_longopts[] ALIGN1 =
 /* "was seen in modules.dep": */
 #define MODULE_FLAG_FOUND_IN_MODDEP     0x0004
 #define MODULE_FLAG_BLACKLISTED         0x0008
+#define MODULE_FLAG_BUILTIN             0x0010
 
 struct globals {
        llist_t *probes; /* MEs of module(s) requested on cmdline */
@@ -217,7 +218,7 @@ static void add_probe(const char *name)
 
        m = get_or_add_modentry(name);
        if (!(option_mask32 & (OPT_REMOVE | OPT_SHOW_DEPS))
-        && (m->flags & MODULE_FLAG_LOADED)
+        && (m->flags & (MODULE_FLAG_LOADED | MODULE_FLAG_BUILTIN))
        ) {
                DBG("skipping %s, it is already loaded", name);
                return;
@@ -413,8 +414,10 @@ static int do_modprobe(struct module_entry *m)
 
        if (!(m->flags & MODULE_FLAG_FOUND_IN_MODDEP)) {
                if (!(option_mask32 & INSMOD_OPT_SILENT))
-                       bb_error_msg("module %s not found in modules.dep",
-                               humanly_readable_name(m));
+                       bb_error_msg((m->flags & MODULE_FLAG_BUILTIN) ?
+                                    "module %s is builtin" :
+                                    "module %s not found in modules.dep",
+                                    humanly_readable_name(m));
                return -ENOENT;
        }
        DBG("do_modprob'ing %s", m->modname);
@@ -618,6 +621,11 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
                while (config_read(parser, &s, 1, 1, "# \t", PARSE_NORMAL & ~PARSE_GREEDY))
                        get_or_add_modentry(s)->flags |= MODULE_FLAG_LOADED;
                config_close(parser);
+
+               parser = config_open2("modules.builtin", fopen_for_read);
+               while (config_read(parser, &s, 1, 1, "# \t", PARSE_NORMAL))
+                       get_or_add_modentry(s)->flags |= MODULE_FLAG_BUILTIN;
+               config_close(parser);
        }
 
        if (opt & (OPT_INSERT_ALL | OPT_REMOVE)) {