Contents of /trunk/kmod/patches/0001-kmod-module-lookup-search-module.builtin-file-too.patch
Parent Directory | Revision Log
Revision 1660 -
(show 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 | 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 |