Patch: module-init-tools-0.6/modprobe.c - support subdirectories

Adam J. Richter (adam@yggdrasil.com)
Mon, 18 Nov 2002 07:32:47 -0800


--y0ulUmNC+osPPQO6
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

The following untested patch adds subdirectory support to
module-init-tools-0.6/modprobe.c. I really need this for tools that I
use for building initial ramdisks to do things like select all SCSI
and IDE drivers without having to release a new version of the ramdisk
maker every time a new SCSI or IDE driver is added. The patch is a net
addition of four lines to modprobe.c.

I am sorry I was not able to test this change, but it would be
a lot of work for me to bring up a system without module device ID
table support. I know your ChangeLog says that support is coming. I
wonder if it would break your module utilities to leave the old macros
device ID macros in place and let people run the existing depmod.

I also worry about about the latency of reading the
kernel symbols for all modules every time modprobe is called. If I
want to have all of the modules installed, that's at least 1143
modules on x86, and this might be the standard installation of a Linux
distribution. Here again, the existing depmod program could be used.
What would be needed would be some code to make modprobe try
modules.dep first if it exists.

Finally, I am skeptical of the benefits being worth the cost
of putting an ELF relocator and symbol table parser in the kernel. We
don't need to do that just have try_mod_inc_use_count or to lock
modules during a load that a new module depends on. I'd much
apportioning this complexity to user space, where it does not consume
unswappable memory, where it is easier to make changes, where there is
slightly more protection against bugs. The user space code already
has to do a little ELF parsing to figure out the dependecies. I would
be interested in knowing what new thing I can do with my computer, or
what performance gain or other real benefit all of this additional
kernel code will buy.

-- 
Adam J. Richter     __     ______________   575 Oroville Road
adam@yggdrasil.com     \ /                  Milpitas, California 95035
+1 408 309-6081         | g g d r a s i l   United States of America
                         "Free Software For The Rest Of Us."

--y0ulUmNC+osPPQO6 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="modprobe.diff"

--- module-init-tools-0.6/modprobe.c 2002-10-30 20:03:06.000000000 -0800 +++ module-init-tools-0.6.ajr/modprobe.c 2002-11-18 07:20:59.000000000 -0800 @@ -36,7 +36,7 @@ #include "backwards_compat.c" -#define MODULE_DIR "/lib/modules/%s/kernel/" +#define MODULE_DIR "/lib/modules" #define MODULE_EXTENSION ".o" #define MODULE_NAME_LEN (64 - ELF_TYPE / 8) @@ -227,14 +227,14 @@ return new; } -static struct module *load_all_exports(const char *revision) +static struct module *load_all_exports(const char *parent, const char *subdir, + struct module *mods) { - struct module *mods = NULL; struct dirent *dirent; DIR *dir; - char dirname[strlen(revision) + sizeof(MODULE_DIR)]; + char dirname[strlen(parent) + strlen(subdir) + 2]; - sprintf(dirname, MODULE_DIR, revision); + sprintf(dirname, "%s/%s", parent, subdir); dir = opendir(dirname); if (dir) { while ((dirent = readdir(dir)) != NULL) { @@ -242,6 +242,9 @@ if (ends_in(dirent->d_name, MODULE_EXTENSION)) mods = add_module(dirname, dirent->d_name, mods); + else + mods = load_all_exports(dirname, + dirent->d_name, mods); } closedir(dir); } @@ -440,12 +443,13 @@ struct module *modules; struct module *i; char pathname[strlen(revision) + sizeof(MODULE_DIR) + strlen(modname) - + sizeof(MODULE_EXTENSION)]; + + sizeof(MODULE_EXTENSION) + 1]; /* Create path name */ - sprintf(pathname, MODULE_DIR "%s" MODULE_EXTENSION, revision, modname); + sprintf(pathname, "%s/%s/%s%s", MODULE_DIR, + revision, modname, MODULE_EXTENSION); - modules = load_all_exports(revision); + modules = load_all_exports(MODULE_DIR, revision, NULL); order = 1; if (get_deps(order, pathname, modules, verbose)) { /* We need some other modules. */

--y0ulUmNC+osPPQO6-- - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/