From fd1c14f1b944db2970e1022ae4693f12807e6b6c Mon Sep 17 00:00:00 2001 From: Vitaly Kuznetsov Date: Thu, 3 Oct 2024 17:25:54 +0200 Subject: [PATCH 1/8] shared: Export is_dir() Make it possible to use is_dir() helper outside of util.c. Signed-off-by: Vitaly Kuznetsov --- shared/util.c | 2 +- shared/util.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/shared/util.c b/shared/util.c index 5102879f..1cd7fc81 100644 --- a/shared/util.c +++ b/shared/util.c @@ -377,7 +377,7 @@ char *path_make_absolute_cwd(const char *p) return r; } -static inline int is_dir(const char *path) +int is_dir(const char *path) { struct stat st; diff --git a/shared/util.h b/shared/util.h index bcd834e5..3e0ece32 100644 --- a/shared/util.h +++ b/shared/util.h @@ -44,6 +44,7 @@ _nonnull_(1) char *freadline_wrapped(FILE *fp, unsigned int *linenum); /* path handling functions */ /* ************************************************************************ */ _must_check_ _nonnull_all_ char *path_make_absolute_cwd(const char *p); +int is_dir(const char *path); int mkdir_p(const char *path, int len, mode_t mode); int mkdir_parents(const char *path, mode_t mode); unsigned long long stat_mstamp(const struct stat *st); From 5fdaf03a2e338f948edd4dd59f6f3711e87fade1 Mon Sep 17 00:00:00 2001 From: Vitaly Kuznetsov Date: Thu, 3 Oct 2024 15:31:59 +0200 Subject: [PATCH 2/8] libkmod: Introduce fallback module directory Currently, traditional Linux systems using initramfs are forced to keep two copies of the modules which may be needed both during early boot and for normal system operation. This seems to be inevitable for the case when initramfs is built locally but with the rise of distro shipped UKIs the question whether it would be possible to avoid the redundancy arises. To make it possible to reuse modules from initramfs without copying them to the root filesystem (which may be read-only), the suggested approach is to preserve them on tmpfs, e.g. in /run/modules/`uname -r` but the challenge is to make kmod search there. It would certainly be possible to e.g. bind mount /run/modules/`uname -r` to /lib/modules/`uname -r` but this will make the destination read-only and traditional tools which are used to install packages with modules (e.g. rpm) will break. Instead, a 'fallback' directory approach is suggested: in case main /lib/modules/`uname -r` is completely missing, kmod tools will check whether /run/modules/`uname -r` exist and search there. In theory, it would've been possible to replace this fallback option with a dedicated config for kmod making modules location dynamic but this seems to be a more intrusive change and it will also require additional external actions to switch from 'fallback' to 'main' if/when modules get installed to the main system. Note, no merging of /run/modules/`uname -r` and /lib/modules/`uname -r` is performed. It is expected, that in case /lib/modules/`uname -r` exists, it is a superset and modules from initramfs are no longer needed. Signed-off-by: Vitaly Kuznetsov --- Makefile.am | 1 + configure.ac | 7 ++++++- libkmod/libkmod.c | 8 ++++++++ man/Makefile.am | 1 + meson.build | 6 ++++++ meson_options.txt | 6 ++++++ 6 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 213a1fe6..449dbf5a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -32,6 +32,7 @@ AM_CPPFLAGS = \ -DSYSCONFDIR=\""$(sysconfdir)"\" \ -DDISTCONFDIR=\""$(distconfdir)"\" \ -DMODULE_DIRECTORY=\""$(module_directory)"\" \ + -DMODULE_FALLBACK_DIRECTORY=\""$(module_fallback_directory)"\" \ ${zlib_CFLAGS} AM_CFLAGS = $(OUR_CFLAGS) diff --git a/configure.ac b/configure.ac index c204570d..b62882f1 100644 --- a/configure.ac +++ b/configure.ac @@ -85,8 +85,13 @@ AC_ARG_WITH([module_directory], [], [with_module_directory=/lib/modules]) AC_SUBST([module_directory], [$with_module_directory]) +AC_ARG_WITH([module_fallback_directory], + AS_HELP_STRING([--with-module-fallback_directory=DIR], [alternative directory in which to look for kernel modules @<:@default=/run/modules@:>@]), + [], [with_module_fallback_directory=/run/modules]) +AC_SUBST([module_fallback_directory], [$with_module_fallback_directory]) + # Check all directory arguments for consistency. -for ac_var in distconfdir module_directory +for ac_var in distconfdir module_directory module_fallback_directory do eval ac_val=\$$ac_var # Remove trailing slashes. diff --git a/libkmod/libkmod.c b/libkmod/libkmod.c index d1e5a82c..4ebd4f35 100644 --- a/libkmod/libkmod.c +++ b/libkmod/libkmod.c @@ -164,6 +164,7 @@ static int log_priority(const char *priority) } static const char *dirname_default_prefix = MODULE_DIRECTORY; +static const char *dirname_fallback_prefix = MODULE_FALLBACK_DIRECTORY; static char *get_kernel_release(const char *dirname) { @@ -179,6 +180,13 @@ static char *get_kernel_release(const char *dirname) if (asprintf(&p, "%s/%s", dirname_default_prefix, u.release) < 0) return NULL; + /* If main path doesn't exist, try fallback */ + if (is_dir(p) <= 0) { + free(p); + if (asprintf(&p, "%s/%s", dirname_fallback_prefix, u.release) < 0) + return NULL; + } + return p; } diff --git a/man/Makefile.am b/man/Makefile.am index 6356d878..2f9fa6ee 100644 --- a/man/Makefile.am +++ b/man/Makefile.am @@ -18,6 +18,7 @@ define generate_manpage sed -e 's|@SYSCONFDIR@|$(sysconfdir)|g' | \ sed -e 's|@DISTCONFDIR@|$(distconfdir)|g' | \ sed -e 's|@MODULE_DIRECTORY@|$(module_directory)|g' | \ + sed -e 's|@MODULE_FALLBACK_DIRECTORY@|$(module_fallback_directory)|g' | \ $(SCDOC) > $@ endef diff --git a/meson.build b/meson.build index 1c87fe0e..7b199ba8 100644 --- a/meson.build +++ b/meson.build @@ -191,6 +191,12 @@ if moduledir == '' endif cdata.set_quoted('MODULE_DIRECTORY', moduledir) +moduledir = get_option('modulefallbackdir') +if moduledir == '' + moduledir = '/run/modules' +endif +cdata.set_quoted('MODULE_FALLBACK_DIRECTORY', moduledir) + _completiondirs = [ ['bashcompletiondir', 'bash-completion', 'bash-completion/completions', 'shell-completion/bash/@0@'], ['fishcompletiondir', 'fish', 'fish/vendor_functions.d', 'shell-completion/fish/@0@.fish'], diff --git a/meson_options.txt b/meson_options.txt index 4a25fb0e..9b5e341b 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -12,6 +12,12 @@ option( description : 'Directory to look for kernel modules. Default: /lib/modules', ) +option( + 'modulefallbackdir', + type : 'string', + description : 'Alternative directory to look for kernel modules. Default: /run/modules', +) + option( 'bashcompletiondir', type : 'string', From bcc38fcda52d4d76fa850b464cf6a45b01fca0a2 Mon Sep 17 00:00:00 2001 From: Vitaly Kuznetsov Date: Fri, 18 Oct 2024 17:42:39 +0200 Subject: [PATCH 3/8] modprobe: support fallback module directory with -d/-S By default, modprobe relies on libkmod to set up module search path (kmod_new(NULL, ...)) but in case -d/-S options are used, modprobe explicitly defines search path using MODULE_DIRECTORY. Add support for MODULE_FALLBACK_DIRECTORY when the main one is missing. Signed-off-by: Vitaly Kuznetsov --- tools/modprobe.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tools/modprobe.c b/tools/modprobe.c index 26b252c5..f027c01f 100644 --- a/tools/modprobe.c +++ b/tools/modprobe.c @@ -983,6 +983,18 @@ static int do_modprobe(int argc, char **orig_argv) err = -1; goto done; } + + if (is_dir(dirname_buf) <= 0) { + n = snprintf(dirname_buf, sizeof(dirname_buf), + "%s" MODULE_FALLBACK_DIRECTORY "/%s", root, kversion); + if (n >= (int)sizeof(dirname_buf)) { + ERR("bad directory %s" MODULE_FALLBACK_DIRECTORY "/%s: path too long\n", + root, kversion); + err = -1; + goto done; + } + } + dirname = dirname_buf; } From 41738f50b35f920189d133f1eac0685f8d29ce07 Mon Sep 17 00:00:00 2001 From: Vitaly Kuznetsov Date: Fri, 18 Oct 2024 17:24:15 +0200 Subject: [PATCH 4/8] testsuite: add modprobe fallback test Check whether modprobe is able to load modules from /run/modules/`uname -r` when /lib/modules/`uname -r` is missing. Signed-off-by: Vitaly Kuznetsov --- Makefile.am | 2 +- scripts/setup-rootfs.sh | 2 ++ .../test-modprobe/fallback/proc/modules | 0 .../fallback/run/modules/4.4.4/modules.alias | 1 + .../run/modules/4.4.4/modules.alias.bin | Bin 0 -> 12 bytes .../run/modules/4.4.4/modules.builtin.bin | 0 .../fallback/run/modules/4.4.4/modules.dep | 1 + .../run/modules/4.4.4/modules.dep.bin | Bin 0 -> 58 bytes .../run/modules/4.4.4/modules.devname | 1 + .../run/modules/4.4.4/modules.softdep | 1 + .../run/modules/4.4.4/modules.symbols | 1 + .../run/modules/4.4.4/modules.symbols.bin | Bin 0 -> 12 bytes testsuite/test-modprobe.c | 23 ++++++++++++++++++ 13 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback/proc/modules create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.alias create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.alias.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.builtin.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.dep create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.devname create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.softdep create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.symbols create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.symbols.bin diff --git a/Makefile.am b/Makefile.am index 449dbf5a..e27f366b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -197,7 +197,7 @@ MODULE_PLAYGROUND = testsuite/module-playground BUILD_MODULES = $(AM_V_GEN) $(top_srcdir)/scripts/setup-modules.sh $(top_srcdir) $(top_builddir) $(MODULE_PLAYGROUND) ROOTFS = testsuite/rootfs ROOTFS_PRISTINE = $(top_srcdir)/testsuite/rootfs-pristine -CREATE_ROOTFS = $(AM_V_GEN) $(top_srcdir)/scripts/setup-rootfs.sh $(ROOTFS_PRISTINE) $(ROOTFS) $(MODULE_PLAYGROUND) $(top_builddir)/config.h $(sysconfdir) $(module_directory) +CREATE_ROOTFS = $(AM_V_GEN) $(top_srcdir)/scripts/setup-rootfs.sh $(ROOTFS_PRISTINE) $(ROOTFS) $(MODULE_PLAYGROUND) $(top_builddir)/config.h $(sysconfdir) $(module_directory) $(module_fallback_directory) build-module-playground: $(BUILD_MODULES) diff --git a/scripts/setup-rootfs.sh b/scripts/setup-rootfs.sh index 92c5d2dd..1b6c5a94 100755 --- a/scripts/setup-rootfs.sh +++ b/scripts/setup-rootfs.sh @@ -8,6 +8,7 @@ MODULE_PLAYGROUND=$3 CONFIG_H=$4 SYSCONFDIR=$5 MODULE_DIRECTORY=$6 +MODULE_FALLBACK_DIRECTORY=$7 ANOTHER_MODULE_DIRECTORY=/foobar # create rootfs from rootfs-pristine @@ -98,6 +99,7 @@ map=( ["test-modprobe/external/lib/modules/external/"]="mod-simple.ko" ["test-modprobe/module-from-abspath/home/foo/"]="mod-simple.ko" ["test-modprobe/module-from-relpath/home/foo/"]="mod-simple.ko" + ["test-modprobe/fallback$MODULE_FALLBACK_DIRECTORY/4.4.4/kernel/"]="mod-simple.ko" ["test-depmod/modules-order-compressed$MODULE_DIRECTORY/4.4.4/kernel/drivers/block/cciss.ko"]="mod-fake-cciss.ko" ["test-depmod/modules-order-compressed$MODULE_DIRECTORY/4.4.4/kernel/drivers/scsi/hpsa.ko"]="mod-fake-hpsa.ko" ["test-depmod/modules-order-compressed$MODULE_DIRECTORY/4.4.4/kernel/drivers/scsi/scsi_mod.ko"]="mod-fake-scsi-mod.ko" diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/proc/modules b/testsuite/rootfs-pristine/test-modprobe/fallback/proc/modules new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.alias b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.alias new file mode 100644 index 00000000..ba76e181 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.alias.bin b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.alias.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.builtin.bin b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.builtin.bin new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.dep b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.dep new file mode 100644 index 00000000..54766537 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.dep @@ -0,0 +1 @@ +kernel/mod-simple.ko: diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.dep.bin b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..b09a85432309c43f99500d6cc3473bcb1ef0a80e GIT binary patch literal 58 zcmdnM{w17&iGfjpfx#p{CB8T_w;(5#0SFjDM0RRXUTThhZhnd`L`E+=--;nO_W%O} F4*<8l52gSB literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.devname b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.devname new file mode 100644 index 00000000..58f6d6d6 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.devname @@ -0,0 +1 @@ +# Device nodes to trigger on-demand module loading. diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.softdep b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.softdep new file mode 100644 index 00000000..5554ccca --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.symbols b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.symbols new file mode 100644 index 00000000..618c345f --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.symbols @@ -0,0 +1 @@ +# Aliases for symbols, used by symbol_request(). diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.symbols.bin b/testsuite/rootfs-pristine/test-modprobe/fallback/run/modules/4.4.4/modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/test-modprobe.c b/testsuite/test-modprobe.c index cbdd9c75..3e5b7ab2 100644 --- a/testsuite/test-modprobe.c +++ b/testsuite/test-modprobe.c @@ -484,4 +484,27 @@ DEFINE_TEST(modprobe_module_from_relpath, .modules_loaded = "mod-simple", ); +static noreturn int modprobe_fallback(const struct test *t) +{ + const char *progname = TOOLS_DIR "/modprobe"; + const char *const args[] = { + progname, + "mod-simple", + NULL, + }; + + test_spawn_prog(progname, args); + exit(EXIT_FAILURE); +} +DEFINE_TEST(modprobe_fallback, + .description = "check modprobe able to load module from fallback path", + .config = { + [TC_UNAME_R] = "4.4.4", + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/fallback", + [TC_INIT_MODULE_RETCODES] = "", + }, + .need_spawn = true, + .modules_loaded = "mod-simple", + ); + TESTSUITE_MAIN(); From 4e9f5794b42c45dc4d9f1d3e502f9e4846d6ad8e Mon Sep 17 00:00:00 2001 From: Vitaly Kuznetsov Date: Mon, 21 Oct 2024 13:52:06 +0200 Subject: [PATCH 5/8] testsuite: add modprobe fallback custom ver test Check whether modprobe --set-version is able to load modules from /run/modules/ when /lib/modules/ is missing. Signed-off-by: Vitaly Kuznetsov --- scripts/setup-rootfs.sh | 1 + .../fallback-custom/proc/modules | 0 .../run/modules/3.3.3/modules.alias | 1 + .../run/modules/3.3.3/modules.alias.bin | Bin 0 -> 12 bytes .../run/modules/3.3.3/modules.builtin.bin | 0 .../run/modules/3.3.3/modules.dep | 1 + .../run/modules/3.3.3/modules.dep.bin | Bin 0 -> 58 bytes .../run/modules/3.3.3/modules.devname | 1 + .../run/modules/3.3.3/modules.softdep | 1 + .../run/modules/3.3.3/modules.symbols | 1 + .../run/modules/3.3.3/modules.symbols.bin | Bin 0 -> 12 bytes testsuite/test-modprobe.c | 24 ++++++++++++++++++ 12 files changed, 30 insertions(+) create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback-custom/proc/modules create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.alias create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.alias.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.builtin.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.dep create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.devname create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.softdep create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.symbols create mode 100644 testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.symbols.bin diff --git a/scripts/setup-rootfs.sh b/scripts/setup-rootfs.sh index 1b6c5a94..8f473253 100755 --- a/scripts/setup-rootfs.sh +++ b/scripts/setup-rootfs.sh @@ -100,6 +100,7 @@ map=( ["test-modprobe/module-from-abspath/home/foo/"]="mod-simple.ko" ["test-modprobe/module-from-relpath/home/foo/"]="mod-simple.ko" ["test-modprobe/fallback$MODULE_FALLBACK_DIRECTORY/4.4.4/kernel/"]="mod-simple.ko" + ["test-modprobe/fallback-custom$MODULE_FALLBACK_DIRECTORY/3.3.3/kernel/"]="mod-simple.ko" ["test-depmod/modules-order-compressed$MODULE_DIRECTORY/4.4.4/kernel/drivers/block/cciss.ko"]="mod-fake-cciss.ko" ["test-depmod/modules-order-compressed$MODULE_DIRECTORY/4.4.4/kernel/drivers/scsi/hpsa.ko"]="mod-fake-hpsa.ko" ["test-depmod/modules-order-compressed$MODULE_DIRECTORY/4.4.4/kernel/drivers/scsi/scsi_mod.ko"]="mod-fake-scsi-mod.ko" diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/proc/modules b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/proc/modules new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.alias b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.alias new file mode 100644 index 00000000..ba76e181 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.alias.bin b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.alias.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.builtin.bin b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.builtin.bin new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.dep b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.dep new file mode 100644 index 00000000..54766537 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.dep @@ -0,0 +1 @@ +kernel/mod-simple.ko: diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.dep.bin b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..b09a85432309c43f99500d6cc3473bcb1ef0a80e GIT binary patch literal 58 zcmdnM{w17&iGfjpfx#p{CB8T_w;(5#0SFjDM0RRXUTThhZhnd`L`E+=--;nO_W%O} F4*<8l52gSB literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.devname b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.devname new file mode 100644 index 00000000..58f6d6d6 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.devname @@ -0,0 +1 @@ +# Device nodes to trigger on-demand module loading. diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.softdep b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.softdep new file mode 100644 index 00000000..5554ccca --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.symbols b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.symbols new file mode 100644 index 00000000..618c345f --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.symbols @@ -0,0 +1 @@ +# Aliases for symbols, used by symbol_request(). diff --git a/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.symbols.bin b/testsuite/rootfs-pristine/test-modprobe/fallback-custom/run/modules/3.3.3/modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/test-modprobe.c b/testsuite/test-modprobe.c index 3e5b7ab2..d36ede9b 100644 --- a/testsuite/test-modprobe.c +++ b/testsuite/test-modprobe.c @@ -507,4 +507,28 @@ DEFINE_TEST(modprobe_fallback, .modules_loaded = "mod-simple", ); +static noreturn int modprobe_fallback_custom(const struct test *t) +{ + const char *progname = TOOLS_DIR "/modprobe"; + const char *const args[] = { + progname, + "--set-version", + "3.3.3", + "mod-simple", + NULL, + }; + + test_spawn_prog(progname, args); + exit(EXIT_FAILURE); +} +DEFINE_TEST(modprobe_fallback_custom, + .description = "check modprobe able to load module from fallback path with --set-version", + .config = { + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/fallback-custom", + [TC_INIT_MODULE_RETCODES] = "", + }, + .need_spawn = true, + .modules_loaded = "mod-simple", + ); + TESTSUITE_MAIN(); From d8a60300a3e35c6216605ea6db8efad960ab080f Mon Sep 17 00:00:00 2001 From: Vitaly Kuznetsov Date: Mon, 21 Oct 2024 17:56:41 +0200 Subject: [PATCH 6/8] modinfo: support fallback module directory with -b/-k By default, modinfo relies on libkmod to set up module search path (kmod_new(NULL, ...)) but in case -b/-k options are used, modinfo explicitly defines search path using MODULE_DIRECTORY. Add support for MODULE_FALLBACK_DIRECTORY when the main one is missing. Signed-off-by: Vitaly Kuznetsov --- tools/modinfo.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tools/modinfo.c b/tools/modinfo.c index f1323c50..cc0fd538 100644 --- a/tools/modinfo.c +++ b/tools/modinfo.c @@ -443,6 +443,17 @@ static int do_modinfo(int argc, char *argv[]) root, kversion); return EXIT_FAILURE; } + + if (is_dir(dirname_buf) <= 0) { + n = snprintf(dirname_buf, sizeof(dirname_buf), + "%s" MODULE_FALLBACK_DIRECTORY "/%s", root, kversion); + if (n >= (int)sizeof(dirname_buf)) { + ERR("bad directory %s" MODULE_FALLBACK_DIRECTORY "/%s: path too long\n", + root, kversion); + return EXIT_FAILURE; + } + } + dirname = dirname_buf; } From 0155e2eb9851996e4af28abf78a1a0c4da05617d Mon Sep 17 00:00:00 2001 From: Vitaly Kuznetsov Date: Mon, 21 Oct 2024 18:03:44 +0200 Subject: [PATCH 7/8] testsuite: add modinfo fallback test Check whether modinfo is able to find modules in /run/modules/`uname -r` when /lib/modules/`uname -r` is missing. Signed-off-by: Vitaly Kuznetsov --- scripts/setup-rootfs.sh | 1 + .../test-modinfo/correct-fallback.txt | 1 + .../test-modinfo/fallback/proc/modules | 0 .../fallback/run/modules/4.4.4/modules.alias | 1 + .../run/modules/4.4.4/modules.alias.bin | Bin 0 -> 12 bytes .../run/modules/4.4.4/modules.builtin.bin | 0 .../fallback/run/modules/4.4.4/modules.dep | 1 + .../run/modules/4.4.4/modules.dep.bin | Bin 0 -> 58 bytes .../run/modules/4.4.4/modules.devname | 1 + .../run/modules/4.4.4/modules.softdep | 1 + .../run/modules/4.4.4/modules.symbols | 1 + .../run/modules/4.4.4/modules.symbols.bin | Bin 0 -> 12 bytes testsuite/test-modinfo.c | 24 ++++++++++++++++++ 13 files changed, 31 insertions(+) create mode 100644 testsuite/rootfs-pristine/test-modinfo/correct-fallback.txt create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback/proc/modules create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.alias create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.alias.bin create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.builtin.bin create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.dep create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.devname create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.softdep create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.symbols create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.symbols.bin diff --git a/scripts/setup-rootfs.sh b/scripts/setup-rootfs.sh index 8f473253..587f83c1 100755 --- a/scripts/setup-rootfs.sh +++ b/scripts/setup-rootfs.sh @@ -114,6 +114,7 @@ map=( ["test-modinfo/mod-simple-sha256.ko"]="mod-simple.ko" ["test-modinfo/mod-simple-pkcs7.ko"]="mod-simple.ko" ["test-modinfo/external/lib/modules/external/mod-simple.ko"]="mod-simple.ko" + ["test-modinfo/fallback$MODULE_FALLBACK_DIRECTORY/4.4.4/kernel/"]="mod-simple.ko" ["test-weakdep$MODULE_DIRECTORY/4.4.4/kernel/mod-loop-a.ko"]="mod-loop-a.ko" ["test-weakdep$MODULE_DIRECTORY/4.4.4/kernel/mod-loop-b.ko"]="mod-loop-b.ko" ["test-weakdep$MODULE_DIRECTORY/4.4.4/kernel/mod-simple.ko"]="mod-simple.ko" diff --git a/testsuite/rootfs-pristine/test-modinfo/correct-fallback.txt b/testsuite/rootfs-pristine/test-modinfo/correct-fallback.txt new file mode 100644 index 00000000..30d00414 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/correct-fallback.txt @@ -0,0 +1 @@ +/run/modules/4.4.4/kernel/mod-simple.ko diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/proc/modules b/testsuite/rootfs-pristine/test-modinfo/fallback/proc/modules new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.alias b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.alias new file mode 100644 index 00000000..ba76e181 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.alias.bin b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.alias.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.builtin.bin b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.builtin.bin new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.dep b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.dep new file mode 100644 index 00000000..54766537 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.dep @@ -0,0 +1 @@ +kernel/mod-simple.ko: diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.dep.bin b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..b09a85432309c43f99500d6cc3473bcb1ef0a80e GIT binary patch literal 58 zcmdnM{w17&iGfjpfx#p{CB8T_w;(5#0SFjDM0RRXUTThhZhnd`L`E+=--;nO_W%O} F4*<8l52gSB literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.devname b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.devname new file mode 100644 index 00000000..58f6d6d6 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.devname @@ -0,0 +1 @@ +# Device nodes to trigger on-demand module loading. diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.softdep b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.softdep new file mode 100644 index 00000000..5554ccca --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.symbols b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.symbols new file mode 100644 index 00000000..618c345f --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.symbols @@ -0,0 +1 @@ +# Aliases for symbols, used by symbol_request(). diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.symbols.bin b/testsuite/rootfs-pristine/test-modinfo/fallback/run/modules/4.4.4/modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/test-modinfo.c b/testsuite/test-modinfo.c index a8e8e552..d1c3f59e 100644 --- a/testsuite/test-modinfo.c +++ b/testsuite/test-modinfo.c @@ -124,4 +124,28 @@ DEFINE_TEST(test_modinfo_builtin, .out = TESTSUITE_ROOTFS "test-modinfo/correct-builtin.txt", }) +static noreturn int test_modinfo_fallback(const struct test *t) +{ + const char *const args[] = { + // clang-format off + progname, + "-F", "filename", + "mod-simple", + NULL, + // clang-format on + }; + test_spawn_prog(progname, args); + exit(EXIT_FAILURE); +} +DEFINE_TEST(test_modinfo_fallback, + .description = "check if modinfo finds external module", + .config = { + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modinfo/fallback", + [TC_UNAME_R] = "4.4.4", + }, + .output = { + .out = TESTSUITE_ROOTFS "test-modinfo/correct-fallback.txt", + }) + + TESTSUITE_MAIN(); From 6bf065de9f1a5d24fa4aae34958646fa178dfa79 Mon Sep 17 00:00:00 2001 From: Vitaly Kuznetsov Date: Tue, 22 Oct 2024 15:14:39 +0200 Subject: [PATCH 8/8] testsuite: add modinfo fallback custom ver test Check whether modinfo --set-version is able to find modules in /run/modules/ when /lib/modules/ is missing. Signed-off-by: Vitaly Kuznetsov --- scripts/setup-rootfs.sh | 1 + .../test-modinfo/correct-fallback-custom.txt | 1 + .../test-modinfo/fallback-custom/proc/modules | 0 .../run/modules/3.3.3/modules.alias | 1 + .../run/modules/3.3.3/modules.alias.bin | Bin 0 -> 12 bytes .../run/modules/3.3.3/modules.builtin.bin | 0 .../run/modules/3.3.3/modules.dep | 1 + .../run/modules/3.3.3/modules.dep.bin | Bin 0 -> 58 bytes .../run/modules/3.3.3/modules.devname | 1 + .../run/modules/3.3.3/modules.softdep | 1 + .../run/modules/3.3.3/modules.symbols | 1 + .../run/modules/3.3.3/modules.symbols.bin | Bin 0 -> 12 bytes testsuite/test-modinfo.c | 25 ++++++++++++++++++ 13 files changed, 32 insertions(+) create mode 100644 testsuite/rootfs-pristine/test-modinfo/correct-fallback-custom.txt create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback-custom/proc/modules create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.alias create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.alias.bin create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.builtin.bin create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.dep create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.devname create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.softdep create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.symbols create mode 100644 testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.symbols.bin diff --git a/scripts/setup-rootfs.sh b/scripts/setup-rootfs.sh index 587f83c1..f6b47fc7 100755 --- a/scripts/setup-rootfs.sh +++ b/scripts/setup-rootfs.sh @@ -115,6 +115,7 @@ map=( ["test-modinfo/mod-simple-pkcs7.ko"]="mod-simple.ko" ["test-modinfo/external/lib/modules/external/mod-simple.ko"]="mod-simple.ko" ["test-modinfo/fallback$MODULE_FALLBACK_DIRECTORY/4.4.4/kernel/"]="mod-simple.ko" + ["test-modinfo/fallback-custom$MODULE_FALLBACK_DIRECTORY/3.3.3/kernel/"]="mod-simple.ko" ["test-weakdep$MODULE_DIRECTORY/4.4.4/kernel/mod-loop-a.ko"]="mod-loop-a.ko" ["test-weakdep$MODULE_DIRECTORY/4.4.4/kernel/mod-loop-b.ko"]="mod-loop-b.ko" ["test-weakdep$MODULE_DIRECTORY/4.4.4/kernel/mod-simple.ko"]="mod-simple.ko" diff --git a/testsuite/rootfs-pristine/test-modinfo/correct-fallback-custom.txt b/testsuite/rootfs-pristine/test-modinfo/correct-fallback-custom.txt new file mode 100644 index 00000000..92d85ff0 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/correct-fallback-custom.txt @@ -0,0 +1 @@ +/run/modules/3.3.3/kernel/mod-simple.ko diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/proc/modules b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/proc/modules new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.alias b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.alias new file mode 100644 index 00000000..ba76e181 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.alias.bin b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.alias.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.builtin.bin b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.builtin.bin new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.dep b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.dep new file mode 100644 index 00000000..54766537 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.dep @@ -0,0 +1 @@ +kernel/mod-simple.ko: diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.dep.bin b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..b09a85432309c43f99500d6cc3473bcb1ef0a80e GIT binary patch literal 58 zcmdnM{w17&iGfjpfx#p{CB8T_w;(5#0SFjDM0RRXUTThhZhnd`L`E+=--;nO_W%O} F4*<8l52gSB literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.devname b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.devname new file mode 100644 index 00000000..58f6d6d6 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.devname @@ -0,0 +1 @@ +# Device nodes to trigger on-demand module loading. diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.softdep b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.softdep new file mode 100644 index 00000000..5554ccca --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.symbols b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.symbols new file mode 100644 index 00000000..618c345f --- /dev/null +++ b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.symbols @@ -0,0 +1 @@ +# Aliases for symbols, used by symbol_request(). diff --git a/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.symbols.bin b/testsuite/rootfs-pristine/test-modinfo/fallback-custom/run/modules/3.3.3/modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/test-modinfo.c b/testsuite/test-modinfo.c index d1c3f59e..f4c5b4b4 100644 --- a/testsuite/test-modinfo.c +++ b/testsuite/test-modinfo.c @@ -147,5 +147,30 @@ DEFINE_TEST(test_modinfo_fallback, .out = TESTSUITE_ROOTFS "test-modinfo/correct-fallback.txt", }) +static noreturn int test_modinfo_fallback_custom(const struct test *t) +{ + const char *const args[] = { + // clang-format off + progname, + "-F", "filename", + "--set-version", + "3.3.3", + "mod-simple", + NULL, + // clang-format on + }; + test_spawn_prog(progname, args); + exit(EXIT_FAILURE); +} +DEFINE_TEST(test_modinfo_fallback_custom, + .description = "check if modinfo finds external module", + .config = { + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modinfo/fallback-custom", + [TC_UNAME_R] = "4.4.4", + }, + .output = { + .out = TESTSUITE_ROOTFS "test-modinfo/correct-fallback-custom.txt", + }) + TESTSUITE_MAIN();