Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1660 - (show annotations) (download)
Mon Feb 20 14:25:31 2012 UTC (12 years, 2 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