modprobe: call finit_module with MODULE_INIT_COMPRESSED_FILE if module name doesn't end with .ko
IOW: if name doesn't end with .ko, assume it's .gz/.xz or similar, and ask kernel to uncompress it. If finit_module(MODULE_INIT_COMPRESSED_FILE) fails, retry with finit_module(0). function old new delta bb_init_module 151 197 +46 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
470fa7b364
commit
af5277f883
2 changed files with 22 additions and 2 deletions
|
@ -33,6 +33,9 @@
|
|||
#define delete_module(mod, flags) syscall(__NR_delete_module, mod, flags)
|
||||
#ifdef __NR_finit_module
|
||||
# define finit_module(fd, uargs, flags) syscall(__NR_finit_module, fd, uargs, flags)
|
||||
# ifndef MODULE_INIT_COMPRESSED_FILE
|
||||
# define MODULE_INIT_COMPRESSED_FILE 4
|
||||
# endif
|
||||
#endif
|
||||
/* linux/include/linux/module.h has limit of 64 chars on module names */
|
||||
#undef MODULE_NAME_LEN
|
||||
|
@ -272,7 +275,14 @@ static int load_module(const char *fname, const char *options)
|
|||
{
|
||||
int fd = open(fname, O_RDONLY | O_CLOEXEC);
|
||||
if (fd >= 0) {
|
||||
r = finit_module(fd, options, 0) != 0;
|
||||
int flags = is_suffixed_with(fname, ".ko") ? 0 : MODULE_INIT_COMPRESSED_FILE;
|
||||
for (;;) {
|
||||
r = finit_module(fd, options, flags);
|
||||
if (r == 0 || flags == 0)
|
||||
break;
|
||||
/* Loading non-.ko named uncompressed module? Not likely, but let's try it */
|
||||
flags = 0;
|
||||
}
|
||||
close(fd);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,6 +12,9 @@
|
|||
#define init_module(mod, len, opts) syscall(__NR_init_module, mod, len, opts)
|
||||
#if defined(__NR_finit_module)
|
||||
# define finit_module(fd, uargs, flags) syscall(__NR_finit_module, fd, uargs, flags)
|
||||
# ifndef MODULE_INIT_COMPRESSED_FILE
|
||||
# define MODULE_INIT_COMPRESSED_FILE 4
|
||||
# endif
|
||||
#endif
|
||||
#define delete_module(mod, flags) syscall(__NR_delete_module, mod, flags)
|
||||
|
||||
|
@ -217,7 +220,14 @@ int FAST_FUNC bb_init_module(const char *filename, const char *options)
|
|||
{
|
||||
int fd = open(filename, O_RDONLY | O_CLOEXEC);
|
||||
if (fd >= 0) {
|
||||
rc = finit_module(fd, options, 0) != 0;
|
||||
int flags = is_suffixed_with(filename, ".ko") ? 0 : MODULE_INIT_COMPRESSED_FILE;
|
||||
for (;;) {
|
||||
rc = finit_module(fd, options, flags);
|
||||
if (rc == 0 || flags == 0)
|
||||
break;
|
||||
/* Loading non-.ko named uncompressed module? Not likely, but let's try it */
|
||||
flags = 0;
|
||||
}
|
||||
close(fd);
|
||||
if (rc == 0)
|
||||
return rc;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue