]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
modprobe: show if module is in kernel
authorLucas De Marchi <lucas.demarchi@profusion.mobi>
Wed, 11 Jan 2012 23:48:08 +0000 (21:48 -0200)
committerLucas De Marchi <lucas.demarchi@profusion.mobi>
Wed, 11 Jan 2012 23:54:25 +0000 (21:54 -0200)
Now with './tools/modprobe --show-depends ahci' (ahci is builtin) we have the following
output:

$ ./tools/modprobe --show-depends ahci
builtin ahci

Just like modprobe from m-i-t. Previously we had:

$ ./tools/modprobe --show-depends ahci
FATAL: Module ahci not found.

TODO
tools/kmod-modprobe.c

diff --git a/TODO b/TODO
index bd29f25b9fe0850af1acf2380d1f856ebd781fbc..ad908539120911daf9f11c8d2bf8acbd0099cdfd 100644 (file)
--- a/TODO
+++ b/TODO
@@ -19,8 +19,16 @@ Features:
 * provide 1:1 compatibility with module-init-tools's modprobe
    - dump configuration
    - deal with dependency loop
-   - break dependency loop when all it needs is to check if the module is
-     already loaded
+   - fix dependency listing in --show-depends
+       $ modprobe -S 3.2.0-2-ARCH --show-depends ahci
+       insmod /lib/modules/3.2.0-2-ARCH/kernel/drivers/scsi/scsi_mod.ko.gz
+       insmod /lib/modules/3.2.0-2-ARCH/kernel/drivers/scsi/scsi_mod.ko.gz
+       insmod /lib/modules/3.2.0-2-ARCH/kernel/drivers/ata/libata.ko.gz
+       insmod /lib/modules/3.2.0-2-ARCH/kernel/drivers/scsi/scsi_mod.ko.gz
+       insmod /lib/modules/3.2.0-2-ARCH/kernel/drivers/scsi/scsi_mod.ko.gz
+       insmod /lib/modules/3.2.0-2-ARCH/kernel/drivers/ata/libata.ko.gz
+       insmod /lib/modules/3.2.0-2-ARCH/kernel/drivers/ata/libahci.ko.gz
+       insmod /lib/modules/3.2.0-2-ARCH/kernel/drivers/ata/ahci.ko.gz
 
 * Add manpages: copy them from module-init-tools and make the necessary changes
 
@@ -84,6 +92,10 @@ modprobe
 * kmod-modprobe doesn't parse 'config' and 'include' commands in configuration
   files.
 
+* we don't use <module-dir>/modules.builtin{,.bin} indexes. Instead we rely on
+  module appearing on /sys/modules/* without a initstate file to determine if
+  it is builtin.
+
 depmod
 ------
 
index 6ed605c8557f8afc572750f9d29182c170f18cbb..863d2c18da3e25d12616ae871b702689f5bd498c 100644 (file)
@@ -869,6 +869,34 @@ static int insmod_path(struct kmod_ctx *ctx, const char *path,
        return err;
 }
 
+static int handle_failed_lookup(struct kmod_ctx *ctx, const char *alias)
+{
+       struct kmod_module *mod;
+       int state, err;
+
+       DBG("lookup failed - trying to check if it's builtin\n");
+
+       err = kmod_module_new_from_name(ctx, alias, &mod);
+       if (err < 0)
+               return err;
+
+       state = kmod_module_get_initstate(mod);
+       kmod_module_unref(mod);
+
+       if (state != KMOD_MODULE_BUILTIN) {
+               LOG("Module %s not found.\n", alias);
+               return -ENOENT;
+       }
+
+       if (first_time) {
+               LOG("Module %s already in kernel (builtin).\n", alias);
+               return -ENOENT;
+       }
+
+       SHOW("builtin %s\n", alias);
+       return 0;
+}
+
 static int insmod_alias(struct kmod_ctx *ctx, const char *alias,
                                                const char *extra_options)
 {
@@ -879,10 +907,8 @@ static int insmod_alias(struct kmod_ctx *ctx, const char *alias,
        if (err < 0)
                return err;
 
-       if (list == NULL) {
-               LOG("Module %s not found.\n", alias);
-               return -ENOENT;
-       }
+       if (list == NULL)
+               return handle_failed_lookup(ctx, alias);
 
        if (use_blacklist) {
                struct kmod_list *filtered = NULL;