[PATCH] Fix modprobe status reported v3

Gilles Espinasse g.esp at free.fr
Tue Jun 16 07:27:48 UTC 2009


Report modprobe status and not mostly report only EXITSUCCESS

v3
 Remove the global variable as any errror is reported from modprobe_maint
 Add a DBG message when probing module by file name
 Add an error message in case of alias error

This fix the following cases by reporting an error in status :
- when a module is not found
- unloading a module used by another module (like hid used by usbhid)
- when a module is not present in modules.dep (outdated .dep file)
- in case of alias error (try with echo "alias foo bar" >> modules.alias;modprobe foo

All that has been tested mainly with dummy.ko.gz module and rtnl-link-dummy alias
Not tested with blacklist.

Fix an old comment s/modprobe.dep/modules.dep/

Replace space with tab before 'struct module_entry *m;'

function                                             old     new   delta
modprobe_main                                        484     558     +74
.rodata                                            27199   27221     +22
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 96/0)               Total: 96 bytes
   text    data     bss     dec     hex filename
 221622    1585    8752  231959   38a17 busybox_old
 221718    1585    8752  232055   38a77 busybox_unstripped

Signed-off-by: Gilles Espinasse <g.esp at free.fr>
---
 modutils/modprobe.c |   26 ++++++++++++++++++--------
 1 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/modutils/modprobe.c b/modutils/modprobe.c
index d000c91..abd422f 100644
--- a/modutils/modprobe.c
+++ b/modutils/modprobe.c
@@ -140,7 +140,7 @@ static int FAST_FUNC config_file_action(const char *filename,
 {
 	char *tokens[3];
 	parser_t *p;
-        struct module_entry *m;
+	struct module_entry *m;
 	int rc = TRUE;
 
 	if (bb_basename(filename)[0] == '.')
@@ -209,6 +209,7 @@ static int read_config(const char *path)
 				config_file_action, NULL, NULL, 1);
 }
 
+/* Return a value >=0 or -ENOENT if module not found in modules.dep */
 static int do_modprobe(struct module_entry *m)
 {
 	struct module_entry *m2 = m2; /* for compiler */
@@ -261,6 +262,8 @@ static int do_modprobe(struct module_entry *m)
 		free(fn);
 	}
 
+	/* On 2.6 kernel, rc is alway >=0 (0 or errno).
+	 * On 2.4 kernel, that's EXIT_SUCCESS or EXIT_ERROR */
 	if (rc && !(option_mask32 & INSMOD_OPT_SILENT)) {
 		bb_error_msg("failed to %sload module %s: %s",
 			(option_mask32 & MODPROBE_OPT_REMOVE) ? "un" : "",
@@ -278,7 +281,7 @@ static void load_modules_dep(void)
 	char *colon, *tokens[2];
 	parser_t *p;
 
-	/* Modprobe does not work at all without modprobe.dep,
+	/* Modprobe does not work at all without modules.dep,
 	 * even if the full module name is given. Returning error here
 	 * was making us later confuse user with this message:
 	 * "module /full/path/to/existing/file/module.ko not found".
@@ -322,7 +325,7 @@ int modprobe_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int modprobe_main(int argc UNUSED_PARAM, char **argv)
 {
 	struct utsname uts;
-	int rc;
+	int rc = 0;
 	unsigned opt;
 	struct module_entry *me;
 
@@ -389,6 +392,7 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
 
 	while ((me = llist_pop(&G.probes)) != NULL) {
 		if (me->realnames == NULL) {
+			DBG("probing by module name");
 			/* This is not an alias. Literal names are blacklisted
 			 * only if '-b' is given.
 			 */
@@ -396,7 +400,7 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
 			 || !(me->flags & MODULE_FLAG_BLACKLISTED)
 			) {
 				rc = do_modprobe(me);
-//FIXME: what if rc > 0?
+				/* if rc > 0, do_modprobe already warn */
 				if (rc < 0 && !(opt & INSMOD_OPT_SILENT))
 					bb_error_msg("module %s not found",
 						     me->probed_name);
@@ -409,13 +413,19 @@ int modprobe_main(int argc UNUSED_PARAM, char **argv)
 
 				DBG("probing %s by realname %s", me->modname, realname);
 				m2 = get_or_add_modentry(realname);
-				if (!(m2->flags & MODULE_FLAG_BLACKLISTED))
-					do_modprobe(m2);
-//FIXME: error check?
+				if (!(m2->flags & MODULE_FLAG_BLACKLISTED)
+				 && (!(m2->flags & MODULE_FLAG_LOADED)
+					|| opt & MODPROBE_OPT_REMOVE )
+				) {
+					rc=do_modprobe(m2);
+					if (rc < 0 && !(opt & INSMOD_OPT_SILENT))
+						bb_error_msg("module %s alias error",
+							     me->modname);
+				}
 				free(realname);
 			} while (me->realnames != NULL);
 		}
 	}
 
-	return EXIT_SUCCESS;
+	return (rc != 0);
 }
-- 
1.6.0.6



More information about the busybox mailing list