modprobe: pick up module options from /proc/cmdline too
authorDenys Vlasenko <vda.linux@googlemail.com>
Sat, 27 Feb 2010 22:15:22 +0000 (23:15 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 27 Feb 2010 22:15:22 +0000 (23:15 +0100)
Based on patch by Ozan Çağlayan (ozan AT pardus.org.tr)

function                                             old     new   delta
parse_and_add_kcmdline_module_options                  -     149    +149
do_modprobe                                          357     365      +8

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
modutils/modprobe.c

index 292f2df..0cfb365 100644 (file)
@@ -228,6 +228,39 @@ static const char *humanly_readable_name(struct module_entry *m)
        return m->probed_name ? m->probed_name : m->modname;
 }
 
+static char *parse_and_add_kcmdline_module_options(char *options, const char *modulename)
+{
+       /* defined in arch/<architecture>/include/asm/setup.h
+        * (maximum is 2048 for IA64 and SPARC) */
+       char kcmdline_buf[2048];
+       char *kcmdline;
+       char *kptr;
+       int len;
+
+       len = open_read_close("/proc/cmdline", kcmdline_buf, 2047);
+       if (len <= 0)
+               return options;
+       kcmdline_buf[len] = '\0';
+
+       len = strlen(modulename);
+       kcmdline = kcmdline_buf;
+       while ((kptr = strsep(&kcmdline, "\n\t ")) != NULL) {
+               if (strncmp(modulename, kptr, len) != 0)
+                       continue;
+               kptr += len;
+               if (*kptr != '.')
+                       continue;
+               /* It is "modulename.xxxx" */
+               kptr++;
+               if (strchr(kptr, '=') != NULL) {
+                       /* It is "modulename.opt=[val]" */
+                       options = gather_options_str(options, kptr);
+               }
+       }
+
+       return options;
+}
+
 /* Return: similar to bb_init_module:
  * 0 on success,
  * -errno on open/read error,
@@ -288,6 +321,7 @@ static int do_modprobe(struct module_entry *m)
 
                options = m2->options;
                m2->options = NULL;
+               options = parse_and_add_kcmdline_module_options(options, m2->modname);
                if (m == m2)
                        options = gather_options_str(options, G.cmdline_mopts);
                rc = bb_init_module(fn, options);