]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
kmod-module: lookup: search modules.builtin file too
authorLucas De Marchi <lucas.demarchi@profusion.mobi>
Thu, 16 Feb 2012 22:43:16 +0000 (20:43 -0200)
committerLucas De Marchi <lucas.demarchi@profusion.mobi>
Thu, 16 Feb 2012 23:18:00 +0000 (21:18 -0200)
Search modules.builtin file before saying the module was not found.
Note: these "modules" should not appear as dependencies of other modules
(in modules.dep) even if they appear in modinfo. This fixes the return
code of modprobe with builtin modules.

Also fixes a small coding style issue in module_is_inkernel().

TODO
libkmod/libkmod-module.c
libkmod/libkmod-private.h
libkmod/libkmod.c
libkmod/libkmod.h
testsuite/test-modprobe.c

diff --git a/TODO b/TODO
index 315878ea0dcecdc491540054a62ecc9bfadd9ffb..4aa6f7abe81e2f1b0131868628f53837e3a3422b 100644 (file)
--- a/TODO
+++ b/TODO
@@ -49,9 +49,6 @@ Features:
 * add quirk so we don't calculate dependencies for modules already loaded -
   that shall fix the bug of vboxdrv and alsa above
 
-* search /lib/modules/$(uname -r)/modules.builtin.bin before returning error
-  that module was not found
-
 Known Bugs:
 ===========
 
index 835896f6c5348f09adb465701836b02fd00c6729..4226bbb16b6d74c0aa2652d5f3c84267fe735e7f 100644 (file)
@@ -80,6 +80,13 @@ struct kmod_module {
         * whether the module's command and softdep should be ignored
         */
        bool ignorecmd : 1;
+
+       /*
+        * if module was created by searching the modules.builtin file, this
+        * is set. There's nothing much useful one can do with such a
+        * "module", except knowing it's builtin.
+        */
+       bool builtin : 1;
 };
 
 static inline const char *path_join(const char *path, size_t prefixlen,
@@ -101,12 +108,13 @@ static inline const char *path_join(const char *path, size_t prefixlen,
 static inline bool module_is_inkernel(struct kmod_module *mod)
 {
        int state = kmod_module_get_initstate(mod);
+
        if (state == KMOD_MODULE_LIVE ||
                        state == KMOD_MODULE_COMING ||
                        state == KMOD_MODULE_BUILTIN)
                return true;
-       else
-               return false;
+
+       return false;
 }
 
 int kmod_module_parse_depline(struct kmod_module *mod, char *line)
@@ -191,6 +199,11 @@ void kmod_module_set_visited(struct kmod_module *mod, bool visited)
        mod->visited = visited;
 }
 
+void kmod_module_set_builtin(struct kmod_module *mod, bool builtin)
+{
+       mod->builtin = builtin;
+}
+
 /*
  * Memory layout with alias:
  *
@@ -526,6 +539,10 @@ KMOD_EXPORT int kmod_module_new_from_lookup(struct kmod_ctx *ctx,
        err = kmod_lookup_alias_from_aliases_file(ctx, alias, list);
        CHECK_ERR_AND_FINISH(err, fail, list, finish);
 
+       DBG(ctx, "lookup modules.builtin %s\n", alias);
+       err = kmod_lookup_alias_from_builtin_file(ctx, alias, list);
+       CHECK_ERR_AND_FINISH(err, fail, list, finish);
+
 finish:
        DBG(ctx, "lookup %s=%d, list=%p\n", alias, err, *list);
        return err;
@@ -1593,6 +1610,9 @@ KMOD_EXPORT int kmod_module_get_initstate(const struct kmod_module *mod)
        if (mod == NULL)
                return -ENOENT;
 
+       if (mod->builtin)
+               return KMOD_MODULE_BUILTIN;
+
        pathlen = snprintf(path, sizeof(path),
                                "/sys/module/%s/initstate", mod->name);
        fd = open(path, O_RDONLY|O_CLOEXEC);
index 0ee37d4987605e648fd04bdb097cd3c127079579..ebda9453a4cff8f117abb8eca28f785dbfed6ac3 100644 (file)
@@ -81,6 +81,7 @@ int kmod_lookup_alias_from_config(struct kmod_ctx *ctx, const char *name, struct
 int kmod_lookup_alias_from_symbols_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3)));
 int kmod_lookup_alias_from_aliases_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3)));
 int kmod_lookup_alias_from_moddep_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3)));
+int kmod_lookup_alias_from_builtin_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3)));
 int kmod_lookup_alias_from_commands(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3)));
 void kmod_set_modules_visited(struct kmod_ctx *ctx, bool visited) __attribute__((nonnull((1))));
 
@@ -137,6 +138,7 @@ int kmod_module_parse_depline(struct kmod_module *mod, char *line) __attribute__
 void kmod_module_set_install_commands(struct kmod_module *mod, const char *cmd) __attribute__((nonnull(1)));
 void kmod_module_set_remove_commands(struct kmod_module *mod, const char *cmd) __attribute__((nonnull(1)));
 void kmod_module_set_visited(struct kmod_module *mod, bool visited) __attribute__((nonnull(1)));
+void kmod_module_set_builtin(struct kmod_module *mod, bool builtin) __attribute__((nonnull((1))));
 
 /* libkmod-hash.c */
 
index 4990d3e5faf7d57f6a275271caf5fe5acce89f82..36af20109961b29fbb8f50ab2db4ab26fc0b6345 100644 (file)
@@ -37,7 +37,7 @@
 
 #define KMOD_HASH_SIZE (256)
 #define KMOD_LRU_MAX (128)
-#define _KMOD_INDEX_MODULES_SIZE KMOD_INDEX_MODULES_SYMBOL + 1
+#define _KMOD_INDEX_MODULES_SIZE KMOD_INDEX_MODULES_BUILTIN + 1
 
 /**
  * SECTION:libkmod
@@ -54,6 +54,7 @@ static struct _index_files {
        [KMOD_INDEX_MODULES_DEP] = { .fn = "modules.dep", .prefix = "" },
        [KMOD_INDEX_MODULES_ALIAS] = { .fn = "modules.alias", .prefix = "alias " },
        [KMOD_INDEX_MODULES_SYMBOL] = { .fn = "modules.symbols", .prefix = "alias "},
+       [KMOD_INDEX_MODULES_BUILTIN] = { .fn = "modules.builtin", .prefix = ""},
 };
 
 static const char *default_config_paths[] = {
@@ -476,6 +477,24 @@ int kmod_lookup_alias_from_aliases_file(struct kmod_ctx *ctx, const char *name,
                                                                name, list);
 }
 
+int kmod_lookup_alias_from_builtin_file(struct kmod_ctx *ctx, const char *name,
+                                               struct kmod_list **list)
+{
+       const struct kmod_list *l;
+
+       int err = kmod_lookup_alias_from_alias_bin(ctx,
+                                       KMOD_INDEX_MODULES_BUILTIN, name, list);
+       if (err < 0)
+               return err;
+
+       kmod_list_foreach(l, *list) {
+               struct kmod_module *m = l->data;
+               kmod_module_set_builtin(m, true);
+       }
+
+       return err;
+}
+
 char *kmod_search_moddep(struct kmod_ctx *ctx, const char *name)
 {
        struct index_file *idx;
index 6992e77d5b7ae340c138d659106a34621c398e88..424640af33b93642ebef95f4b8b881c978cfc884 100644 (file)
@@ -69,6 +69,7 @@ enum kmod_index {
        KMOD_INDEX_MODULES_DEP = 0,
        KMOD_INDEX_MODULES_ALIAS,
        KMOD_INDEX_MODULES_SYMBOL,
+       KMOD_INDEX_MODULES_BUILTIN,
        /* Padding to make sure enum is not mapped to char */
        _KMOD_INDEX_PAD = (1 << 31),
 };
index 0022c06a04f706ace37505fd979d3f1fd1dcbaeb..3aebcaec82cb102a705211eafafebd392055f001 100644 (file)
@@ -83,7 +83,6 @@ static __noreturn int modprobe_builtin(const struct test *t)
 }
 static DEFINE_TEST(modprobe_builtin,
        .description = "check if modprobe return 0 for builtin",
-       .expected_fail = true,
        .config = {
                [TC_UNAME_R] = "4.4.4",
                [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/builtin",