On 9/10/09, Michal Marek <mmarek@xxxxxxx> wrote: > The kernel installs a modules.builtin file listing all builtin > modules. Let depmod generate a modules.builtin.bin file and use > this in modprobe: If a module is not found in modules.dep or > modules.alias, check if the module is builtin and either do nothing, > or print "builtin <module>" if --show-depends was given. > > Signed-off-by: Michal Marek <mmarek@xxxxxxx> > --- > depmod.c | 46 +++++++++++++++++++++++++++++++++++++++++++++- > modprobe.c | 31 +++++++++++++++++++++++++++++++ > 2 files changed, 76 insertions(+), 1 deletions(-) > > diff --git a/depmod.c b/depmod.c > index 3ac5070..43ff28f 100644 > --- a/depmod.c > +++ b/depmod.c > @@ -825,6 +825,49 @@ static int output_symbols_bin(struct module *unused, > FILE *out, char *dirname) > return 1; > } > > +static int output_builtin_bin(struct module *unused, FILE *out, char > *dirname) > +{ > + struct index_node *index; > + char *textfile, *line; > + unsigned int linenum; > + FILE *f; > + > + nofail_asprintf(&textfile, "%s/modules.builtin", dirname); > + if (!(f = fopen(textfile, "r"))) { > + if (errno != ENOENT) > + fatal("Could not open '%s': %s\n", > + textfile, strerror(errno)); > + free(textfile); > + return 0; > + } > + free(textfile); > + index = index_create(); > + > + while ((line = getline_wrapped(f, &linenum)) != NULL) { > + char *module = strrchr(line, '/'); > + > + if (!*line || *line == '#') { > + free(line); > + continue; > + } > + module = strrchr(line, '/'); this duplicates the assignment in the declaration of module. But I wonder why this whole chunk of code is needed... > + if (module) > + module++; > + else > + module = line; > + if (ends_in(module, ".ko")) > + module[strlen(module) - 3] = '\0'; > + underscores(module); ...because we already have filename2modname(). I think you can just do filename2modname(module, module). > + index_insert(index, module, "", 0); > + free(line); > + } > + fclose(f); > + index_write(index, out); > + index_destroy(index); > + > + return 1; > +} > + > static int output_aliases(struct module *modules, FILE *out, char *dirname) > { > struct module *i; > @@ -1331,6 +1349,19 @@ int do_modprobe(char *modname, > modname, 0, flags & mit_remove, > &modoptions, &commands, > &aliases, &blacklist); > + /* builtin module? */ > + if (!aliases && !(flags & mit_remove) && > + module_builtin(dirname, modname) == 1) { > + if (flags & mit_first_time) { > + error("Module %s already in kernel (builtin).\n", > + modname); > + return 1; > + } else if (flags & mit_ignore_loaded) { > + /* --show-depends given */ > + info("builtin %s\n", modname); > + } > + return 0; > + } Better. Let's see, if mit_remove is set, we treat it as a normal module, find that it is not present, and return success. "modprobe -r --first-time $builtin-module" will fail as expected... but the error message will be wrong "FATAL: Module $builtin-module is not in kernel." How about this (not tested, may exceed 80 cols): if (!aliases && module_builtin(dirname, modname) == 1) { if (flags & mit_remove) { if (flags & mit_first_time) error("Module %s is builtin\n", modname); return 1; } else if (flags & mit_first_time) { error("Module %s already in kernel (builtin).\n", modname); return 1; } else if (flags & mit_ignore_loaded) { /* --show-depends given */ info("builtin %s\n", modname); } return 0; } Regards Alan -- To unsubscribe from this list: send the line "unsubscribe linux-modules" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html