diff options
Diffstat (limited to 'modutils/modprobe-small.c')
-rw-r--r-- | modutils/modprobe-small.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/modutils/modprobe-small.c b/modutils/modprobe-small.c index b61651621..77e42e3fb 100644 --- a/modutils/modprobe-small.c +++ b/modutils/modprobe-small.c | |||
@@ -33,6 +33,9 @@ | |||
33 | #define delete_module(mod, flags) syscall(__NR_delete_module, mod, flags) | 33 | #define delete_module(mod, flags) syscall(__NR_delete_module, mod, flags) |
34 | #ifdef __NR_finit_module | 34 | #ifdef __NR_finit_module |
35 | # define finit_module(fd, uargs, flags) syscall(__NR_finit_module, fd, uargs, flags) | 35 | # define finit_module(fd, uargs, flags) syscall(__NR_finit_module, fd, uargs, flags) |
36 | # ifndef MODULE_INIT_COMPRESSED_FILE | ||
37 | # define MODULE_INIT_COMPRESSED_FILE 4 | ||
38 | # endif | ||
36 | #endif | 39 | #endif |
37 | /* linux/include/linux/module.h has limit of 64 chars on module names */ | 40 | /* linux/include/linux/module.h has limit of 64 chars on module names */ |
38 | #undef MODULE_NAME_LEN | 41 | #undef MODULE_NAME_LEN |
@@ -272,7 +275,14 @@ static int load_module(const char *fname, const char *options) | |||
272 | { | 275 | { |
273 | int fd = open(fname, O_RDONLY | O_CLOEXEC); | 276 | int fd = open(fname, O_RDONLY | O_CLOEXEC); |
274 | if (fd >= 0) { | 277 | if (fd >= 0) { |
275 | r = finit_module(fd, options, 0) != 0; | 278 | int flags = is_suffixed_with(fname, ".ko") ? 0 : MODULE_INIT_COMPRESSED_FILE; |
279 | for (;;) { | ||
280 | r = finit_module(fd, options, flags); | ||
281 | if (r == 0 || flags == 0) | ||
282 | break; | ||
283 | /* Loading non-.ko named uncompressed module? Not likely, but let's try it */ | ||
284 | flags = 0; | ||
285 | } | ||
276 | close(fd); | 286 | close(fd); |
277 | } | 287 | } |
278 | } | 288 | } |