Magellan Linux

Annotation of /trunk/kmod/patches/0001-kmod-module-lookup-search-module.builtin-file-too.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1660 - (hide annotations) (download)
Mon Feb 20 14:25:31 2012 UTC (12 years, 3 months ago) by niro
File size: 5969 byte(s)
-fixed patch
1 niro 1659 From 3805274bf5e1e0acbd072ac7d523db8c8057130c Mon Sep 17 00:00:00 2001
2     From: Lucas De Marchi <lucas.demarchi@profusion.mobi>
3     Date: Thu, 16 Feb 2012 20:43:16 -0200
4     Subject: [PATCH] kmod-module: lookup: search modules.builtin file too
5    
6     Search modules.builtin file before saying the module was not found.
7     Note: these "modules" should not appear as dependencies of other modules
8     (in modules.dep) even if they appear in modinfo. This fixes the return
9     code of modprobe with builtin modules.
10    
11     Also fixes a small coding style issue in module_is_inkernel().
12     ---
13    
14     diff --git a/libkmod/libkmod-module.c b/libkmod/libkmod-module.c
15     index 835896f..4226bbb 100644
16     --- a/libkmod/libkmod-module.c
17     +++ b/libkmod/libkmod-module.c
18     @@ -80,6 +80,13 @@ struct kmod_module {
19     * whether the module's command and softdep should be ignored
20     */
21     bool ignorecmd : 1;
22     +
23     + /*
24     + * if module was created by searching the modules.builtin file, this
25     + * is set. There's nothing much useful one can do with such a
26     + * "module", except knowing it's builtin.
27     + */
28     + bool builtin : 1;
29     };
30    
31     static inline const char *path_join(const char *path, size_t prefixlen,
32     @@ -101,12 +108,13 @@ static inline const char *path_join(const char *path, size_t prefixlen,
33     static inline bool module_is_inkernel(struct kmod_module *mod)
34     {
35     int state = kmod_module_get_initstate(mod);
36     +
37     if (state == KMOD_MODULE_LIVE ||
38     state == KMOD_MODULE_COMING ||
39     state == KMOD_MODULE_BUILTIN)
40     return true;
41     - else
42     - return false;
43     +
44     + return false;
45     }
46    
47     int kmod_module_parse_depline(struct kmod_module *mod, char *line)
48     @@ -191,6 +199,11 @@ void kmod_module_set_visited(struct kmod_module *mod, bool visited)
49     mod->visited = visited;
50     }
51    
52     +void kmod_module_set_builtin(struct kmod_module *mod, bool builtin)
53     +{
54     + mod->builtin = builtin;
55     +}
56     +
57     /*
58     * Memory layout with alias:
59     *
60     @@ -526,6 +539,10 @@ KMOD_EXPORT int kmod_module_new_from_lookup(struct kmod_ctx *ctx,
61     err = kmod_lookup_alias_from_aliases_file(ctx, alias, list);
62     CHECK_ERR_AND_FINISH(err, fail, list, finish);
63    
64     + DBG(ctx, "lookup modules.builtin %s\n", alias);
65     + err = kmod_lookup_alias_from_builtin_file(ctx, alias, list);
66     + CHECK_ERR_AND_FINISH(err, fail, list, finish);
67     +
68     finish:
69     DBG(ctx, "lookup %s=%d, list=%p\n", alias, err, *list);
70     return err;
71     @@ -1593,6 +1610,9 @@ KMOD_EXPORT int kmod_module_get_initstate(const struct kmod_module *mod)
72     if (mod == NULL)
73     return -ENOENT;
74    
75     + if (mod->builtin)
76     + return KMOD_MODULE_BUILTIN;
77     +
78     pathlen = snprintf(path, sizeof(path),
79     "/sys/module/%s/initstate", mod->name);
80     fd = open(path, O_RDONLY|O_CLOEXEC);
81     diff --git a/libkmod/libkmod-private.h b/libkmod/libkmod-private.h
82     index 0ee37d4..ebda945 100644
83     --- a/libkmod/libkmod-private.h
84     +++ b/libkmod/libkmod-private.h
85     @@ -81,6 +81,7 @@ int kmod_lookup_alias_from_config(struct kmod_ctx *ctx, const char *name, struct
86     int kmod_lookup_alias_from_symbols_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3)));
87     int kmod_lookup_alias_from_aliases_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3)));
88     int kmod_lookup_alias_from_moddep_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3)));
89     +int kmod_lookup_alias_from_builtin_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3)));
90     int kmod_lookup_alias_from_commands(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) __attribute__((nonnull(1, 2, 3)));
91     void kmod_set_modules_visited(struct kmod_ctx *ctx, bool visited) __attribute__((nonnull((1))));
92    
93     @@ -137,6 +138,7 @@ int kmod_module_parse_depline(struct kmod_module *mod, char *line) __attribute__
94     void kmod_module_set_install_commands(struct kmod_module *mod, const char *cmd) __attribute__((nonnull(1)));
95     void kmod_module_set_remove_commands(struct kmod_module *mod, const char *cmd) __attribute__((nonnull(1)));
96     void kmod_module_set_visited(struct kmod_module *mod, bool visited) __attribute__((nonnull(1)));
97     +void kmod_module_set_builtin(struct kmod_module *mod, bool builtin) __attribute__((nonnull((1))));
98    
99     /* libkmod-hash.c */
100    
101     diff --git a/libkmod/libkmod.c b/libkmod/libkmod.c
102     index 4990d3e..36af201 100644
103     --- a/libkmod/libkmod.c
104     +++ b/libkmod/libkmod.c
105     @@ -37,7 +37,7 @@
106    
107     #define KMOD_HASH_SIZE (256)
108     #define KMOD_LRU_MAX (128)
109     -#define _KMOD_INDEX_MODULES_SIZE KMOD_INDEX_MODULES_SYMBOL + 1
110     +#define _KMOD_INDEX_MODULES_SIZE KMOD_INDEX_MODULES_BUILTIN + 1
111    
112     /**
113     * SECTION:libkmod
114     @@ -54,6 +54,7 @@ static struct _index_files {
115     [KMOD_INDEX_MODULES_DEP] = { .fn = "modules.dep", .prefix = "" },
116     [KMOD_INDEX_MODULES_ALIAS] = { .fn = "modules.alias", .prefix = "alias " },
117     [KMOD_INDEX_MODULES_SYMBOL] = { .fn = "modules.symbols", .prefix = "alias "},
118     + [KMOD_INDEX_MODULES_BUILTIN] = { .fn = "modules.builtin", .prefix = ""},
119     };
120    
121     static const char *default_config_paths[] = {
122     @@ -476,6 +477,24 @@ int kmod_lookup_alias_from_aliases_file(struct kmod_ctx *ctx, const char *name,
123     name, list);
124     }
125    
126     +int kmod_lookup_alias_from_builtin_file(struct kmod_ctx *ctx, const char *name,
127     + struct kmod_list **list)
128     +{
129     + const struct kmod_list *l;
130     +
131     + int err = kmod_lookup_alias_from_alias_bin(ctx,
132     + KMOD_INDEX_MODULES_BUILTIN, name, list);
133     + if (err < 0)
134     + return err;
135     +
136     + kmod_list_foreach(l, *list) {
137     + struct kmod_module *m = l->data;
138     + kmod_module_set_builtin(m, true);
139     + }
140     +
141     + return err;
142     +}
143     +
144     char *kmod_search_moddep(struct kmod_ctx *ctx, const char *name)
145     {
146     struct index_file *idx;
147     diff --git a/libkmod/libkmod.h b/libkmod/libkmod.h
148     index 6992e77..424640a 100644
149     --- a/libkmod/libkmod.h
150     +++ b/libkmod/libkmod.h
151     @@ -69,6 +69,7 @@ enum kmod_index {
152     KMOD_INDEX_MODULES_DEP = 0,
153     KMOD_INDEX_MODULES_ALIAS,
154     KMOD_INDEX_MODULES_SYMBOL,
155     + KMOD_INDEX_MODULES_BUILTIN,
156     /* Padding to make sure enum is not mapped to char */
157     _KMOD_INDEX_PAD = (1 << 31),
158     };
159