[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