Annotation of /trunk/kmod/patches/0001-kmod-module-lookup-search-module.builtin-file-too.patch
Parent Directory | Revision Log
Revision 1660 -
(hide annotations)
(download)
Mon Feb 20 14:25:31 2012 UTC (12 years, 7 months ago) by niro
File size: 5969 byte(s)
Mon Feb 20 14:25:31 2012 UTC (12 years, 7 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 |