vapier      15/02/15 08:37:41

  Added:                busybox-1.23.1-modprobe-small.patch
  Log:
  Pull in patch from upstream.
  
  (Portage version: 2.2.15/cvs/Linux x86_64, signed Manifest commit with key 
D2E96200)

Revision  Changes    Path
1.1                  sys-apps/busybox/files/busybox-1.23.1-modprobe-small.patch

file : 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/sys-apps/busybox/files/busybox-1.23.1-modprobe-small.patch?rev=1.1&view=markup
plain: 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/sys-apps/busybox/files/busybox-1.23.1-modprobe-small.patch?rev=1.1&content-type=text/plain

Index: busybox-1.23.1-modprobe-small.patch
===================================================================
--- busybox-1.23.1/modutils/modprobe-small.c
+++ busybox-1.23.1-modprobe-small/modutils/modprobe-small.c
@@ -552,9 +552,23 @@ static int already_loaded(const char *na
        return ret;
 }
 #else
-#define already_loaded(name) is_rmmod
+#define already_loaded(name) 0
 #endif
 
+static int rmmod(const char *filename)
+{
+       int r;
+       char modname[MODULE_NAME_LEN];
+
+       filename2modname(filename, modname);
+       r = delete_module(modname, O_NONBLOCK | O_EXCL);
+       dbg1_error_msg("delete_module('%s', O_NONBLOCK | O_EXCL):%d", modname, 
r);
+       if (r != 0 && !(option_mask32 & OPT_q)) {
+               bb_perror_msg("remove '%s'", modname);
+       }
+       return r;
+}
+
 /*
  * Given modules definition and module name (or alias, or symbol)
  * load/remove the module respecting dependencies.
@@ -571,26 +585,36 @@ static void process_module(char *name, c
        module_info **infovec;
        module_info *info;
        int infoidx;
-       int is_rmmod = (option_mask32 & OPT_r) != 0;
+       int is_remove = (option_mask32 & OPT_r) != 0;
 
        dbg1_error_msg("process_module('%s','%s')", name, cmdline_options);
 
        replace(name, '-', '_');
 
-       dbg1_error_msg("already_loaded:%d is_rmmod:%d", already_loaded(name), 
is_rmmod);
+       dbg1_error_msg("already_loaded:%d is_remove:%d", already_loaded(name), 
is_remove);
+
+       if (applet_name[0] == 'r') {
+               /* rmmod.
+                * Does not remove dependencies, no need to scan, just remove.
+                * (compat note: this allows and strips .ko suffix)
+                */
+               rmmod(name);
+               return;
+       }
+
        /*
-        * We used to have "is_rmmod != already_loaded(name)" check here, but
+        * We used to have "is_remove != already_loaded(name)" check here, but
         *  modprobe -r pci:v00008086d00007010sv00000000sd00000000bc01sc01i80
         * won't unload modules (there are more than one)
         * which have this alias.
         */
-       if (!is_rmmod && already_loaded(name)) {
+       if (!is_remove && already_loaded(name)) {
                dbg1_error_msg("nothing to do for '%s'", name);
                return;
        }
 
        options = NULL;
-       if (!is_rmmod) {
+       if (!is_remove) {
                char *opt_filename = xasprintf("/etc/modules/%s", name);
                options = xmalloc_open_read_close(opt_filename, NULL);
                if (options)
@@ -624,7 +648,7 @@ static void process_module(char *name, c
                        0 /* depth */
                );
                dbg1_error_msg("dirscan complete");
-               /* Module was not found, or load failed, or is_rmmod */
+               /* Module was not found, or load failed, or is_remove */
                if (module_found_idx >= 0) { /* module was found */
                        infovec = xzalloc(2 * sizeof(infovec[0]));
                        infovec[0] = &modinfo[module_found_idx];
@@ -637,7 +661,7 @@ static void process_module(char *name, c
 
        if (!infovec) {
                /* both dirscan and find_alias found nothing */
-               if (!is_rmmod && applet_name[0] != 'd') /* it wasn't rmmod or 
depmod */
+               if (!is_remove && applet_name[0] != 'd') /* it wasn't rmmod or 
depmod */
                        bb_error_msg("module '%s' not found", name);
 //TODO: _and_die()? or should we continue (un)loading modules listed on 
cmdline?
                goto ret;
@@ -651,29 +675,15 @@ static void process_module(char *name, c
         * a *list* of modinfo pointers from find_alias().
         */
 
-       /* rmmod or modprobe -r? unload module(s) */
-       if (is_rmmod) {
+       /* modprobe -r? unload module(s) */
+       if (is_remove) {
                infoidx = 0;
                while ((info = infovec[infoidx++]) != NULL) {
-                       int r;
-                       char modname[MODULE_NAME_LEN];
-
-                       filename2modname(
-                               
bb_get_last_path_component_nostrip(info->pathname), modname);
-                       r = delete_module(modname, O_NONBLOCK | O_EXCL);
-                       dbg1_error_msg("delete_module('%s', O_NONBLOCK | 
O_EXCL):%d", modname, r);
+                       int r = 
rmmod(bb_get_last_path_component_nostrip(info->pathname));
                        if (r != 0) {
-                               if (!(option_mask32 & OPT_q))
-                                       bb_perror_msg("remove '%s'", modname);
-                               goto ret;
+                               goto ret; /* error */
                        }
                }
-
-               if (applet_name[0] == 'r') {
-                       /* rmmod: do not remove dependencies, exit */
-                       goto ret;
-               }
-
                /* modprobe -r: we do not stop here -
                 * continue to unload modules on which the module depends:
                 * "-r --remove: option causes modprobe to remove a module.
@@ -694,7 +704,7 @@ static void process_module(char *name, c
                }
                free(deps);
 
-               if (is_rmmod)
+               if (is_remove)
                        continue;
 
                /* We are modprobe: load it */
@@ -897,10 +907,10 @@ int modprobe_main(int argc UNUSED_PARAM,
        }
 
 #if ENABLE_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE
-       /* If not rmmod, parse possible module options given on command line.
+       /* If not rmmod/-r, parse possible module options given on command line.
         * insmod/modprobe takes one module name, the rest are parameters. */
        options = NULL;
-       if ('r' != applet0) {
+       if (!(option_mask32 & OPT_r)) {
                char **arg = argv;
                while (*++arg) {
                        /* Enclose options in quotes */
@@ -911,7 +921,7 @@ int modprobe_main(int argc UNUSED_PARAM,
                }
        }
 #else
-       if ('r' != applet0)
+       if (!(option_mask32 & OPT_r))
                argv[1] = NULL;
 #endif
 
@@ -935,10 +945,11 @@ int modprobe_main(int argc UNUSED_PARAM,
        }
 
        /* Try to load modprobe.dep.bb */
-       load_dep_bb();
+       if ('r' != applet0) /* not rmmod */
+               load_dep_bb();
 
        /* Load/remove modules.
-        * Only rmmod loops here, modprobe has only argv[0] */
+        * Only rmmod/modprobe -r loops here, insmod/modprobe has only argv[0] 
*/
        do {
                process_module(*argv, options);
        } while (*++argv);




Reply via email to