diff --git a/.gitignore b/.gitignore index 55915135..e64c0715 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,8 @@ .*.swp cscope.out tags +__pycache__ +testsuite/module-playground/ex-*.c +testsuite/module-playground/gen_mod.mak +testsuite/module-playground/symvers + diff --git a/libkmod/libkmod-index.c b/libkmod/libkmod-index.c index cc11f4d3..15d8d661 100644 --- a/libkmod/libkmod-index.c +++ b/libkmod/libkmod-index.c @@ -395,20 +395,18 @@ static struct index_node_f *index_readchild(const struct index_node_f *parent, u return NULL; } -static void index_dump_node(struct index_node_f *node, struct strbuf *buf, - struct wrtbuf *wbuf) +static void index_walk_node(struct index_node_f *node, struct strbuf *buf, + index_walk_cb *callback, void *arg) { struct index_value *v; size_t pushed; + const char *key; pushed = strbuf_pushchars(buf, node->prefix); + key = strbuf_str(buf); - for (v = node->values; v != NULL; v = v->next) { - wrtbuf_write(wbuf, buf->bytes, strbuf_used(buf)); - wrtbuf_write(wbuf, " ", 1); - wrtbuf_write(wbuf, v->value, strlen(v->value)); - wrtbuf_write(wbuf, "\n", 1); - } + for (v = node->values; v != NULL; v = v->next) + callback(key, v->value, v->len, v->priority, arg); for (uint8_t ch = node->first; ch <= node->last; ch++) { struct index_node_f *child = index_readchild(node, ch); @@ -417,7 +415,7 @@ static void index_dump_node(struct index_node_f *node, struct strbuf *buf, continue; if (strbuf_pushchar(buf, ch)) { - index_dump_node(child, buf, wbuf); + index_walk_node(child, buf, callback, arg); strbuf_popchar(buf); } } @@ -426,19 +424,37 @@ static void index_dump_node(struct index_node_f *node, struct strbuf *buf, index_close(node); } -void index_dump(struct index_file *in, int fd, bool alias_prefix) +void index_walk(struct index_file *in, bool alias_prefix, index_walk_cb *callback, + void *arg) { DECLARE_STRBUF_WITH_STACK(buf, 128); struct index_node_f *root; - struct wrtbuf wbuf; root = index_readroot(in); if (root == NULL) return; - wrtbuf_init(&wbuf, fd); if (!alias_prefix || strbuf_pushchars(&buf, "alias ")) - index_dump_node(root, &buf, &wbuf); + index_walk_node(root, &buf, callback, arg); +} + +static void index_dump_cb(const char *key, const char *str, unsigned int len, + unsigned int priority, void *arg) +{ + struct wrtbuf *wbuf = arg; + + wrtbuf_write(wbuf, key, strlen(key)); + wrtbuf_write(wbuf, " ", 1); + wrtbuf_write(wbuf, str, len - 1); + wrtbuf_write(wbuf, "\n", 1); +} + +void index_dump(struct index_file *in, int fd, bool alias_prefix) +{ + struct wrtbuf wbuf; + + wrtbuf_init(&wbuf, fd); + index_walk(in, alias_prefix, index_dump_cb, &wbuf); wrtbuf_flush(&wbuf); } @@ -852,22 +868,21 @@ static struct index_mm_node *index_mm_readchild(const struct index_mm_node *pare return NULL; } -static void index_mm_dump_node(struct index_mm_node *node, struct strbuf *buf, - struct wrtbuf *wbuf) +static void index_mm_walk_node(const struct index_mm_node *node, struct strbuf *buf, + index_walk_cb *callback, void *arg) { const void *p; size_t i, pushed; + const char *key; pushed = strbuf_pushchars(buf, node->prefix); + key = strbuf_str(buf); for (i = 0, p = node->values; i < node->value_count; i++) { struct index_mm_value v; read_value_mm(&p, &v); - wrtbuf_write(wbuf, buf->bytes, strbuf_used(buf)); - wrtbuf_write(wbuf, " ", 1); - wrtbuf_write(wbuf, v.value, v.len); - wrtbuf_write(wbuf, "\n", 1); + callback(key, v.value, v.len, v.priority, arg); } for (uint8_t ch = node->first; ch <= node->last; ch++) { @@ -878,7 +893,7 @@ static void index_mm_dump_node(struct index_mm_node *node, struct strbuf *buf, continue; if (strbuf_pushchar(buf, ch)) { - index_mm_dump_node(child, buf, wbuf); + index_mm_walk_node(child, buf, callback, arg); strbuf_popchar(buf); } } @@ -886,19 +901,26 @@ static void index_mm_dump_node(struct index_mm_node *node, struct strbuf *buf, strbuf_popchars(buf, pushed); } -void index_mm_dump(const struct index_mm *idx, int fd, bool alias_prefix) +void index_mm_walk(const struct index_mm *idx, bool alias_prefix, index_walk_cb *callback, + void *arg) { DECLARE_STRBUF_WITH_STACK(buf, 128); struct index_mm_node nbuf, *root; - struct wrtbuf wbuf; root = index_mm_readroot(idx, &nbuf); if (root == NULL) return; - wrtbuf_init(&wbuf, fd); if (!alias_prefix || strbuf_pushchars(&buf, "alias ")) - index_mm_dump_node(root, &buf, &wbuf); + index_mm_walk_node(root, &buf, callback, arg); +} + +void index_mm_dump(const struct index_mm *idx, int fd, bool alias_prefix) +{ + struct wrtbuf wbuf; + + wrtbuf_init(&wbuf, fd); + index_mm_walk(idx, alias_prefix, index_dump_cb, &wbuf); wrtbuf_flush(&wbuf); } diff --git a/libkmod/libkmod-index.h b/libkmod/libkmod-index.h index 47c50d38..7023fcb0 100644 --- a/libkmod/libkmod-index.h +++ b/libkmod/libkmod-index.h @@ -16,10 +16,14 @@ struct index_value { /* In-memory index (depmod only) */ struct index_file; +typedef void(index_walk_cb)(const char *key, const char *value, unsigned int len, + unsigned int prio, void *arg); struct index_file *index_file_open(const char *filename); void index_file_close(struct index_file *idx); char *index_search(struct index_file *idx, const char *key); void index_dump(struct index_file *in, int fd, bool alias_prefix); +void index_walk(struct index_file *in, bool alias_prefix, index_walk_cb *callback, + void *arg); struct index_value *index_searchwild(struct index_file *idx, const char *key); void index_values_free(struct index_value *values); @@ -31,4 +35,6 @@ int index_mm_open(const struct kmod_ctx *ctx, const char *filename, void index_mm_close(struct index_mm *index); char *index_mm_search(const struct index_mm *idx, const char *key); struct index_value *index_mm_searchwild(const struct index_mm *idx, const char *key); +void index_mm_walk(const struct index_mm *idx, bool alias_prefix, index_walk_cb *callback, + void *arg); void index_mm_dump(const struct index_mm *idx, int fd, bool alias_prefix); diff --git a/libkmod/libkmod-internal.h b/libkmod/libkmod-internal.h index c4c24e6f..0d1b2bdc 100644 --- a/libkmod/libkmod-internal.h +++ b/libkmod/libkmod-internal.h @@ -133,6 +133,7 @@ _nonnull_(1)void kmod_module_set_visited(struct kmod_module *mod, bool visited); _nonnull_(1) void kmod_module_set_builtin(struct kmod_module *mod, bool builtin); _nonnull_(1) void kmod_module_set_required(struct kmod_module *mod, bool required); _nonnull_all_ bool kmod_module_is_builtin(struct kmod_module *mod); +_nonnull_(1, 2) struct kmod_list *kmod_module_info_append(struct kmod_list **list, const char *key, size_t keylen, const char *value, size_t valuelen); /* libkmod-file.c */ struct kmod_file; diff --git a/libkmod/libkmod-module.c b/libkmod/libkmod-module.c index 796dafa1..68e7b831 100644 --- a/libkmod/libkmod-module.c +++ b/libkmod/libkmod-module.c @@ -1777,9 +1777,9 @@ static void kmod_module_info_free(struct kmod_module_info *info) free(info); } -static struct kmod_list *kmod_module_info_append(struct kmod_list **list, const char *key, - size_t keylen, const char *value, - size_t valuelen) +struct kmod_list *kmod_module_info_append(struct kmod_list **list, const char *key, + size_t keylen, const char *value, + size_t valuelen) { struct kmod_module_info *info; struct kmod_list *n; diff --git a/libkmod/libkmod.c b/libkmod/libkmod.c index f4510d0e..26eeec6a 100644 --- a/libkmod/libkmod.c +++ b/libkmod/libkmod.c @@ -348,11 +348,13 @@ void kmod_pool_del_module(struct kmod_ctx *ctx, struct kmod_module *mod, const c hash_del(ctx->modules_by_name, key); } -static int kmod_lookup_alias_from_alias_bin(struct kmod_ctx *ctx, - enum kmod_index index_number, - const char *name, struct kmod_list **list) +static int kmod_lookup_alias_from_alias_bin_n(struct kmod_ctx *ctx, + enum kmod_index index_number, + const char *name, struct kmod_list **list, + unsigned int max_match) { int err, nmatch = 0; + unsigned int n; struct index_file *idx; struct index_value *realnames, *realname; @@ -378,7 +380,8 @@ static int kmod_lookup_alias_from_alias_bin(struct kmod_ctx *ctx, index_file_close(idx); } - for (realname = realnames; realname; realname = realname->next) { + for (realname = realnames, n = 0; realname && n < max_match; + realname = realname->next, n++) { struct kmod_module *mod; struct kmod_list *node; @@ -409,14 +412,21 @@ static int kmod_lookup_alias_from_alias_bin(struct kmod_ctx *ctx, return err; } +static int kmod_lookup_alias_from_alias_bin(struct kmod_ctx *ctx, + enum kmod_index index_number, + const char *name, struct kmod_list **list) +{ + return kmod_lookup_alias_from_alias_bin_n(ctx, index_number, name, list, UINT_MAX); +} + int kmod_lookup_alias_from_symbols_file(struct kmod_ctx *ctx, const char *name, struct kmod_list **list) { if (!strstartswith(name, "symbol:")) return 0; - return kmod_lookup_alias_from_alias_bin(ctx, KMOD_INDEX_MODULES_SYMBOL, name, - list); + return kmod_lookup_alias_from_alias_bin_n(ctx, KMOD_INDEX_MODULES_SYMBOL, name, + list, 1); } int kmod_lookup_alias_from_aliases_file(struct kmod_ctx *ctx, const char *name, diff --git a/man/depmod.8.scd b/man/depmod.8.scd index 1cb6cfc2..b3c4728c 100644 --- a/man/depmod.8.scd +++ b/man/depmod.8.scd @@ -7,10 +7,10 @@ depmod - Generate modules.dep and map files. # SYNOPSIS *depmod* [*-b* _basedir_] [*-m* _moduledir_] [*-o* _outdir_] [*-e*] [*-E* _Module.symvers_] -\ \ \ \ \ \ \ \[*-F* _System.map_] [*-n*] [*-v*] [*-A*] [*-P* _prefix_] [*-w*] [_version_] +\ \ \ \ \ \ \ \[*-F* _System.map_] [*-n*] [*-v*] [*-A*] [*-P* _prefix_] [*-w*] [*-x*] [*-I*] [_version_] *depmod* [*-e*] [*-E* _Module.symvers_] [*-F* _System.map_] [*-n*] [*-v*] [*-P* _prefix_] -\ \ \ \ \ \ \ \[*-w*] [_version_] [_filename_...] +\ \ \ \ \ \ \ \[*-w*] [*-x*] [*-I*] [_version_] [_filename_...] # DESCRIPTION @@ -25,7 +25,7 @@ and is empty. See options below to override when needed. It determines what symbols each module exports and needs. This list is written to *modules.dep*, and a binary hashed version named modules.dep.bin, in the same directory. If filenames are given on the command line, only those modules are -examined (which is rarely useful unless all modules are listed). *depmod* also +examined (which is rarely useful unless incremental mode is used). *depmod* also creates a list of symbols provided by modules in the file named modules.symbols and its binary hashed version, modules.symbols.bin. Finally, *depmod* will output a file named modules.devname if modules supply special device names @@ -136,6 +136,13 @@ depmod -b /tmp/build -m kernel-modules *-h*, *--help* Print the help message and exit. +*-I*, *--incremental* + Run in incremental mode. This mode preserves previous module dependencies + and adds the dependencies of the modules given on the command line. If no + modules are given or *--all* is set, the module directory is scanned for + added or deleted modules, and the *modules.dep* file and other outputs + are updated accordingly. + *-n*, *--show*, *--dry-run* This sends the resulting *modules.dep* and the various map files to standard output rather than writing them into the module directory. @@ -155,6 +162,12 @@ depmod -b /tmp/build -m kernel-modules *-w* Warn on duplicate dependencies, aliases, symbol versions, etc. +*-x*, *--errexit* + Exit with an error status if any condition occurs that would create + a warning with *-e*, i.e. if some module requires an unknown symbol, + or if a symbol with a symbol version that doesn't match the version + provided by the kernel or other modules. + # COPYRIGHT This manual page originally Copyright 2002, Rusty Russell, IBM Corporation. diff --git a/scripts/setup-modules.sh b/scripts/setup-modules.sh index 62eee6f3..edb69e91 100755 --- a/scripts/setup-modules.sh +++ b/scripts/setup-modules.sh @@ -13,4 +13,4 @@ if test "$SRCDIR" != "$BUILDDIR"; then fi export MAKEFLAGS=${MAKEFLAGS-"-j$(nproc)"} -"${MAKE-make}" -C "$PWD/$MODULE_PLAYGROUND" modules +"${MAKE-make}" -C "$PWD/$MODULE_PLAYGROUND" diff --git a/scripts/setup-rootfs.sh b/scripts/setup-rootfs.sh index 524defa2..d3a31a22 100755 --- a/scripts/setup-rootfs.sh +++ b/scripts/setup-rootfs.sh @@ -72,6 +72,20 @@ map=( ["test-depmod/search-order-override$MODULE_DIRECTORY/4.4.4/override/"]="mod-simple.ko" ["test-depmod/check-weakdep$MODULE_DIRECTORY/4.4.4/kernel/mod-weakdep.ko"]="mod-weakdep.ko" ["test-depmod/check-weakdep$MODULE_DIRECTORY/4.4.4/kernel/mod-simple.ko"]="mod-simple.ko" + ["test-depmod/test-dependencies$MODULE_DIRECTORY/4.4.4/kernel/fs/foo/"]="mod-foo-a.ko" + ["test-depmod/test-dependencies$MODULE_DIRECTORY/4.4.4/kernel/"]="mod-foo-c.ko" + ["test-depmod/test-dependencies$MODULE_DIRECTORY/4.4.4/kernel/lib/"]="mod-foo-b.ko" + ["test-depmod/test-dependencies$MODULE_DIRECTORY/4.4.4/kernel/fs/"]="mod-foo.ko" + ["test-depmod/test-dependencies-1$MODULE_DIRECTORY/4.4.4/kernel/fs/foo/"]="mod-foo-a.ko" + ["test-depmod/test-dependencies-1$MODULE_DIRECTORY/4.4.4/kernel/"]="mod-foo-c.ko" + ["test-depmod/test-dependencies-1$MODULE_DIRECTORY/4.4.4/kernel/lib/"]="mod-foo-b.ko" + ["test-depmod/test-dependencies-1$MODULE_DIRECTORY/4.4.4/kernel/fs/mod-foo.ko"]="mod-foo.ko" + ["test-depmod/test-dependencies-1$MODULE_DIRECTORY/4.4.4/kernel/fs/mod-bar.ko"]="mod-bar.ko" + ["test-depmod/test-dependencies-2$MODULE_DIRECTORY/4.4.4/kernel/fs/foo/"]="mod-foo-a.ko" + ["test-depmod/test-dependencies-2$MODULE_DIRECTORY/4.4.4/kernel/"]="mod-foo-c.ko" + ["test-depmod/test-dependencies-2$MODULE_DIRECTORY/4.4.4/kernel/lib/"]="mod-foo-b.ko" + ["test-depmod/test-dependencies-2$MODULE_DIRECTORY/4.4.4/kernel/fs/mod-foo.ko"]="mod-foo.ko" + ["test-depmod/test-dependencies-2$MODULE_DIRECTORY/4.4.4/kernel/fs/mod-bah.ko"]="mod-bar.ko" ["test-dependencies$MODULE_DIRECTORY/4.0.20-kmod/kernel/fs/foo/"]="mod-foo-b.ko" ["test-dependencies$MODULE_DIRECTORY/4.0.20-kmod/kernel/"]="mod-foo-c.ko" ["test-dependencies$MODULE_DIRECTORY/4.0.20-kmod/kernel/lib/"]="mod-foo-a.ko" @@ -124,6 +138,118 @@ map=( ["test-multi-softdep$MODULE_DIRECTORY/4.4.4/kernel/mod-foo-c.ko"]="mod-foo-c.ko" ["test-multi-softdep$MODULE_DIRECTORY/4.4.4/kernel/mod-softdep-a.ko"]="mod-softdep-a.ko" ["test-multi-softdep$MODULE_DIRECTORY/4.4.4/kernel/mod-softdep-b.ko"]="mod-softdep-b.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/block/t10-pi.ko"]="ex-t10-pi.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/cdrom/cdrom.ko"]="ex-cdrom.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_mod.ko"]="ex-scsi_mod.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_transport_fc.ko"]="ex-scsi_transport_fc.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_transport_sas.ko"]="ex-scsi_transport_sas.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sd_mod.ko"]="ex-sd_mod.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sr_mod.ko"]="ex-sr_mod.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/ses.ko"]="ex-ses.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/device_handler/scsi_dh_alua.ko"]="ex-scsi_dh_alua.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/raid_class.ko"]="ex-raid_class.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/mpt3sas.ko"]="ex-mpt3sas.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/qla2xxx/qla2xxx.ko"]="ex-qla2xxx.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko"]="ex-tcm_qla2xxx.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fc.ko"]="ex-nvme-fc.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fabrics.ko"]="ex-nvme-fabrics.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-core.ko"]="ex-nvme-core.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/target/target_core_mod.ko"]="ex-target_core_mod.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/misc/enclosure.ko"]="ex-enclosure.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-multipath.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-service-time.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-mod.ko"]="ex-dm-mod.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/kernel/fs/configfs/configfs.ko"]="ex-configfs.ko" + ["test-depmod/big-01$MODULE_DIRECTORY/5.3.18/symvers"]="symvers" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/block/t10-pi.ko"]="ex-t10-pi.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/cdrom/cdrom.ko"]="ex-cdrom.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_mod.ko"]="ex-scsi_mod.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_transport_fc.ko"]="ex-scsi_transport_fc.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_transport_sas.ko"]="ex-scsi_transport_sas.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sd_mod.ko"]="ex-sd_mod.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sr_mod.ko"]="ex-sr_mod.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/ses.ko"]="ex-ses.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/device_handler/scsi_dh_alua.ko"]="ex-scsi_dh_alua.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/raid_class.ko"]="ex-raid_class.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/mpt3sas.ko"]="ex-mpt3sas.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/qla2xxx/qla2xxx.ko"]="ex-qla2xxx.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko"]="ex-tcm_qla2xxx.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fc.ko"]="ex-nvme-fc.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fabrics.ko"]="ex-nvme-fabrics.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-core.ko"]="ex-nvme-core.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/target/target_core_mod.ko"]="ex-target_core_mod.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/misc/enclosure.ko"]="ex-enclosure.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-multipath.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-service-time.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-mod.ko"]="ex-dm-mod.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/kernel/fs/configfs/configfs.ko"]="ex-configfs.ko" + ["test-depmod/big-01-incremental$MODULE_DIRECTORY/5.3.18/symvers"]="symvers" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/block/t10-pi.ko"]="ex-t10-pi.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/cdrom/cdrom.ko"]="ex-cdrom.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_mod.ko"]="ex-scsi_mod.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_transport_fc.ko"]="ex-scsi_transport_fc.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sd_mod.ko"]="ex-sd_mod.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sr_mod.ko"]="ex-sr_mod.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/device_handler/scsi_dh_alua.ko"]="ex-scsi_dh_alua.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/raid_class.ko"]="ex-raid_class.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fc.ko"]="ex-nvme-fc.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fabrics.ko"]="ex-nvme-fabrics.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-core.ko"]="ex-nvme-core.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/target/target_core_mod.ko"]="ex-target_core_mod.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/misc/enclosure.ko"]="ex-enclosure.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-multipath.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-service-time.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-mod.ko"]="ex-dm-mod.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/kernel/fs/configfs/configfs.ko"]="ex-configfs.ko" + ["test-depmod/big-01-delete$MODULE_DIRECTORY/5.3.18/symvers"]="symvers" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/block/t10-pi.ko"]="ex-t10-pi.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/cdrom/cdrom.ko"]="ex-cdrom.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_mod.ko"]="ex-scsi_mod.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_transport_fc.ko"]="ex-scsi_transport_fc.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_transport_sas.ko"]="ex-scsi_transport_sas.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sd_mod.ko"]="ex-sd_mod.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sr_mod.ko"]="ex-sr_mod.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/ses.ko"]="ex-ses.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/device_handler/scsi_dh_alua.ko"]="ex-scsi_dh_alua.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/raid_class.ko"]="ex-raid_class.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/mpt3sas.ko"]="ex-mpt3sas.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/qla2xxx/qla2xxx.ko"]="other/ex-qla2xxx.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko"]="other/ex-tcm_qla2xxx.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fc.ko"]="ex-nvme-fc.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fabrics.ko"]="ex-nvme-fabrics.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-core.ko"]="ex-nvme-core.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/target/target_core_mod.ko"]="ex-target_core_mod.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/misc/enclosure.ko"]="ex-enclosure.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-multipath.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-service-time.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-mod.ko"]="ex-dm-mod.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/kernel/fs/configfs/configfs.ko"]="ex-configfs.ko" + ["test-depmod/big-01-replace$MODULE_DIRECTORY/5.3.18/symvers"]="symvers" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/block/t10-pi.ko"]="ex-t10-pi.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/cdrom/cdrom.ko"]="ex-cdrom.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_mod.ko"]="ex-scsi_mod.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_transport_fc.ko"]="ex-scsi_transport_fc.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/scsi_transport_sas.ko"]="ex-scsi_transport_sas.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sd_mod.ko"]="ex-sd_mod.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/sr_mod.ko"]="ex-sr_mod.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/ses.ko"]="ex-ses.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/device_handler/scsi_dh_alua.ko"]="ex-scsi_dh_alua.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/raid_class.ko"]="ex-raid_class.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/mpt3sas.ko"]="ex-mpt3sas.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/qla2xxx/qla2xxx.ko"]="ex-qla2xxx.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko"]="ex-tcm_qla2xxx.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/updates/qla2xxx.ko"]="other/ex-qla2xxx.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/updates/tcm_qla2xxx.ko"]="other/ex-tcm_qla2xxx.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fc.ko"]="ex-nvme-fc.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-fabrics.ko"]="ex-nvme-fabrics.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/nvme/host/nvme-core.ko"]="ex-nvme-core.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/target/target_core_mod.ko"]="ex-target_core_mod.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/misc/enclosure.ko"]="ex-enclosure.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-multipath.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-service-time.ko"]="ex-dm-multipath.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/drivers/md/dm-mod.ko"]="ex-dm-mod.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/kernel/fs/configfs/configfs.ko"]="ex-configfs.ko" + ["test-depmod/big-01-override$MODULE_DIRECTORY/5.3.18/symvers"]="symvers" ) gzip_array=( @@ -197,4 +323,15 @@ for m in "${attach_pkcs7_array[@]}"; do cat "${MODULE_PLAYGROUND}/dummy.pkcs7" >>"${ROOTFS}/$m" done +# if CONFIG_MODVERSIONS is off, modules-symbols.bin is different. +# both the input (if present) and the correct output must be replaced. +. "${MODULE_PLAYGROUND}/modversions" +if [ "${CONFIG_MODVERSIONS}" != y ]; then + find "$ROOTFS" -name 'novers-*modules.symbols.bin' | \ + while read f; do + rm -fv "${f/novers-/}" + ln -sv "${f##*/}" "${f/novers-/}" + done +fi + touch testsuite/stamp-rootfs diff --git a/testsuite/module-playground/Kbuild b/testsuite/module-playground/Kbuild index b4f0f11e..89b757d4 100644 --- a/testsuite/module-playground/Kbuild +++ b/testsuite/module-playground/Kbuild @@ -7,6 +7,8 @@ obj-m += mod-foo-a.o obj-m += mod-foo-b.o obj-m += mod-foo-c.o obj-m += mod-foo.o +# mod-bar depends on foo-b +obj-m += mod-bar.o # mod-loop: create loops in dependencies: # 1) mod-loop-a -> mod-loop-b -> mod-loop-c -> mod-loop-a @@ -38,6 +40,19 @@ obj-m += mod-weakdep.o obj-m += mod-softdep-a.o obj-m += mod-softdep-b.o +always-y += modversions +$(src)/modversions: +ifdef CONFIG_MODVERSIONS + echo "CONFIG_MODVERSIONS=y" >$@ +else + echo "CONFIG_MODVERSIONS=n" >$@ +endif + +include $(src)/gen_mod.mak +$(src)/gen_mod.mak: + cd $(src) && python3 ./gen_mod.py + +clean-files := $(src)/gen_mod.mak $(src)/modversions else # only build ARCH-specific module diff --git a/testsuite/module-playground/Makefile b/testsuite/module-playground/Makefile index 191f7458..f98b3c3b 100644 --- a/testsuite/module-playground/Makefile +++ b/testsuite/module-playground/Makefile @@ -13,7 +13,7 @@ endif ARCH_SPECIFIC_MODULES := mod-simple-x86_64.ko mod-simple-i386.ko mod-simple-sparc64.ko -default: modules +default: modules other_modules symvers mod-simple-%.ko: mod-simple-%.c Makefile.arch $(eval arch=$(patsubst mod-simple-%.ko,%,$@)) @@ -22,7 +22,15 @@ mod-simple-%.ko: mod-simple-%.c Makefile.arch modules: $(MAKE) -C $(KDIR) M=$$PWD modules +other_modules: + $(MAKE) -C $(KDIR) M=$$PWD/other modules + +symvers: + cp $(KDIR)/Module.symvers $@ + arch-modules: $(ARCH_SPECIFIC_MODULES) clean: $(MAKE) -C $(KDIR) M=$$PWD clean + rm -f gen_mod.mak + rm -f symvers diff --git a/testsuite/module-playground/gen_mod.py b/testsuite/module-playground/gen_mod.py new file mode 100644 index 00000000..1e1e20ec --- /dev/null +++ b/testsuite/module-playground/gen_mod.py @@ -0,0 +1,181 @@ +#! /usr/bin/python3 +# This script generates source code for fake kernel modules, +# with dependencies defined by functions exported and called. + +class Module: + # expansions in f-strings can't contain backslashes + _nl = "\n" + _nlt = "\n\t" + + # module file name prefix + _prefix = "ex" + + # Constructor + # name: module name + # provides: list of exported "functions" + # calls: list of called "functions" + def __init__(self, name, provides=[], calls=[], int_provides=[], int_calls=[]): + self._name = name + self._symname = self._name.replace("-", "_") + self._provides = provides + self._calls = calls + self._int_provides = int_provides + self._int_calls = int_calls + + # symbol names must be mangled to avoid clashes with the kernel + def mangled(self, name): + return name + "_mangled" + + # void f(void): declaration, body, call + def void_decl(self, name): + return f"void {self.mangled(name)}(void);" + + def void_body(self, name): + return f"""\ +void {self.mangled(name)}(void) +{{ + pr_warn("%s\\n", __func__); +}} +EXPORT_SYMBOL({self.mangled(name)});""" + + def void_call(self, name): + return f"{self.mangled(name)}();" + + # void f(int): declaration, body, call + def int_decl(self, name): + return f"void {self.mangled(name)}(int);" + + def int_body(self, name): + return f"""\ +void {self.mangled(name)}(int x) +{{ + pr_warn("%s: %d\\n", __func__, x); +}} +EXPORT_SYMBOL({self.mangled(name)});""" + + def int_call(self, name): + return f"{self.mangled(name)}(0);" + + # str() creates the C source code. + def __str__(self): + return f"""\ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include + +{self._nl.join(self.void_decl(x) for x in self._calls + self._provides)} +{self._nl.join(self.int_decl(x) for x in self._int_calls + self._int_provides)} +{self._nl.join(self.void_body(x) for x in self._provides)} +{self._nl.join(self.int_body(x) for x in self._int_provides)} + +static int __init {self._symname}_init(void) +{{ + {self._nlt.join(self.void_call(x) for x in self._calls)} + {self._nlt.join(self.int_call(x) for x in self._int_calls)} + return 0; +}} +module_init({self._symname}_init); + +MODULE_AUTHOR("Martin Wilck "); +MODULE_LICENSE("GPL"); +""" + + # write() writes the C source code to a suitably named C file + def write(self): + with open(f"{self._prefix}-{self._name}.c", "w") as out: + out.write(str(self)) + + +# The following example creates a set of modules inspired by some real-world +# block and SCSI modules. +if __name__ == "__main__": + import sys + + if len(sys.argv) == 2 and sys.argv[1] == "other": + q_mods = [ + Module("qla2xxx", + int_provides = ["qlt_stop_phase2"], + calls = ["fc_attach_transport", "nvme_fc_set_remoteport_devloss", + "scsi_remove_host"]), + Module("tcm_qla2xxx", + int_calls = [ "qlt_stop_phase2" ], + calls=["target_execute_cmd", + "scsi_host_get", "fc_vport_create"]) + ] + else: + q_mods = [ + Module("qla2xxx", + provides = ["qlt_stop_phase2"], + calls = ["fc_attach_transport", "nvme_fc_set_remoteport_devloss", + "scsi_remove_host"]), + Module("tcm_qla2xxx", + calls=["target_execute_cmd", "qlt_stop_phase2", + "scsi_host_get", "fc_vport_create"]) + ] + + mods = [ + Module("scsi_transport_fc", + provides = ["fc_attach_transport", "fc_vport_create"], + calls = ["scsi_target_block"]), + Module("scsi_mod", + provides = ["scsi_target_block", "scsi_host_get", + "scsi_dma_map", "scsi_mode_sense", + "scsi_is_sdev_device", "scsi_print_sense_hdr", + "__scsi_iterate_devices", "scsi_dh_attach", + "scsi_remove_host"]), + Module("nvme-fc", + provides = ["nvme_fc_set_remoteport_devloss"], + calls=["nvme_uninit_ctrl", "nvmf_fail_nonready_command"]), + Module("nvme-fabrics", + provides = ["nvmf_fail_nonready_command"], + calls=["nvme_complete_rq"]), + Module("nvme-core", + provides = ["nvme_complete_rq", "nvme_uninit_ctrl"], + calls=["t10_pi_type1_crc"]), + Module("t10-pi", + provides = ["t10_pi_type1_crc"]), + Module("scsi_dh_alua", + calls=["scsi_print_sense_hdr"]), + Module("target_core_mod", + provides = ["target_execute_cmd", "target_backend_unregister"], + calls=["config_group_init"]), + Module("target_core_iblock", + calls=["target_backend_unregister"]), + Module("configfs", + provides = ["config_group_init"]), + Module("mpt3sas", + calls=["sas_enable_tlr", "scsi_dma_map", "raid_class_attach"]), + Module("scsi_transport_sas", + provides = ["sas_enable_tlr", "scsi_is_sas_rphy"], + calls=["scsi_mode_sense"]), + Module("raid_class", + provides = ["raid_class_attach"], + calls=["scsi_is_sdev_device"]), + Module("sd_mod", + calls=["scsi_print_sense_hdr", "t10_pi_type1_crc"]), + Module("sr_mod", + calls=["scsi_mode_sense", "register_cdrom"]), + Module("cdrom", + provides = ["register_cdrom"]), + Module("ses", + calls=["__scsi_iterate_devices", "scsi_is_sas_rphy", + "enclosure_remove_device"]), + Module("enclosure", + provides = ["enclosure_remove_device"]), + Module("dm-multipath", + provides = ["dm_unregister_path_selector"], + calls=["dm_table_run_md_queue_async", "scsi_dh_attach"]), + Module("dm-service-time", + calls=["dm_unregister_path_selector"]), + Module("dm-mod", + provides = ["dm_table_run_md_queue_async"]), + ] + + for x in mods + q_mods: + x.write() + + with open("gen_mod.mak", "w") as out: + out.write("".join(f"obj-m += {x._prefix}-{x._name}.o\n" + for x in mods + q_mods)) diff --git a/testsuite/module-playground/mod-bar.c b/testsuite/module-playground/mod-bar.c new file mode 100644 index 00000000..24035805 --- /dev/null +++ b/testsuite/module-playground/mod-bar.c @@ -0,0 +1,19 @@ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include + +void print_fooB(void); + +static int __init bar_init(void) +{ + print_fooB(); + + return 0; +} + +module_init(bar_init); + +MODULE_AUTHOR("Lucas De Marchi "); +MODULE_LICENSE("LGPL"); diff --git a/testsuite/module-playground/other/Kbuild b/testsuite/module-playground/other/Kbuild new file mode 100644 index 00000000..92e237a3 --- /dev/null +++ b/testsuite/module-playground/other/Kbuild @@ -0,0 +1,8 @@ +ifneq ($(KMOD_TESTSUITE_ARCH_BUILD),1) + +include $(src)/gen_mod.mak +$(src)/gen_mod.mak: + cd $(src) && python3 ../gen_mod.py other + +clean-files := $(src)/gen_mod.mak +endif diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.dep b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.dep new file mode 100644 index 00000000..7bc615f7 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.dep @@ -0,0 +1,17 @@ +kernel/drivers/md/dm-multipath.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/nvme/host/nvme-fc.ko: kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fabrics.ko: kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/scsi_mod.ko: +kernel/drivers/md/dm-mod.ko: +kernel/drivers/nvme/host/nvme-core.ko: kernel/block/t10-pi.ko +kernel/drivers/misc/enclosure.ko: +kernel/drivers/scsi/raid_class.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-service-time.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/target/target_core_mod.ko: kernel/fs/configfs/configfs.ko +kernel/drivers/scsi/sr_mod.ko: kernel/drivers/cdrom/cdrom.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/sd_mod.ko: kernel/drivers/scsi/scsi_mod.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/device_handler/scsi_dh_alua.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/cdrom/cdrom.ko: +kernel/block/t10-pi.ko: +kernel/drivers/scsi/scsi_transport_fc.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/fs/configfs/configfs.ko: diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.dep.bin new file mode 100644 index 00000000..8ecbdad4 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.dep.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.symbols b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.symbols new file mode 100644 index 00000000..2d6add06 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.symbols @@ -0,0 +1,25 @@ +# Aliases for symbols, used by symbol_request(). +alias symbol:scsi_target_block_mangled scsi_mod +alias symbol:scsi_remove_host_mangled scsi_mod +alias symbol:t10_pi_type1_crc_mangled t10_pi +alias symbol:scsi_dh_attach_mangled scsi_mod +alias symbol:nvme_fc_set_remoteport_devloss_mangled nvme_fc +alias symbol:target_backend_unregister_mangled target_core_mod +alias symbol:scsi_host_get_mangled scsi_mod +alias symbol:__scsi_iterate_devices_mangled scsi_mod +alias symbol:target_execute_cmd_mangled target_core_mod +alias symbol:fc_attach_transport_mangled scsi_transport_fc +alias symbol:register_cdrom_mangled cdrom +alias symbol:fc_vport_create_mangled scsi_transport_fc +alias symbol:scsi_print_sense_hdr_mangled scsi_mod +alias symbol:scsi_dma_map_mangled scsi_mod +alias symbol:scsi_is_sdev_device_mangled scsi_mod +alias symbol:nvme_complete_rq_mangled nvme_core +alias symbol:dm_unregister_path_selector_mangled dm_service_time +alias symbol:raid_class_attach_mangled raid_class +alias symbol:enclosure_remove_device_mangled enclosure +alias symbol:scsi_mode_sense_mangled scsi_mod +alias symbol:dm_table_run_md_queue_async_mangled dm_mod +alias symbol:nvmf_fail_nonready_command_mangled nvme_fabrics +alias symbol:nvme_uninit_ctrl_mangled nvme_core +alias symbol:config_group_init_mangled configfs diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.symbols.bin new file mode 100644 index 00000000..ecdd89e3 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/correct-modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.alias b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.alias new file mode 100644 index 00000000..ba76e181 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.alias.bin b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.alias.bin new file mode 100644 index 00000000..7075435f Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.alias.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.dep b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.dep new file mode 100644 index 00000000..b9666a0c --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.dep @@ -0,0 +1,22 @@ +kernel/drivers/md/dm-multipath.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/qla2xxx/qla2xxx.ko: kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fc.ko: kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fabrics.ko: kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/scsi_mod.ko: +kernel/drivers/scsi/ses.ko: kernel/drivers/misc/enclosure.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/scsi_transport_sas.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/mpt3sas.ko: kernel/drivers/scsi/raid_class.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-mod.ko: +kernel/drivers/nvme/host/nvme-core.ko: kernel/block/t10-pi.ko +kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko: kernel/drivers/scsi/qla2xxx/qla2xxx.ko kernel/drivers/target/target_core_mod.ko kernel/fs/configfs/configfs.ko kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/misc/enclosure.ko: +kernel/drivers/scsi/raid_class.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-service-time.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/target/target_core_mod.ko: kernel/fs/configfs/configfs.ko +kernel/drivers/scsi/sr_mod.ko: kernel/drivers/cdrom/cdrom.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/sd_mod.ko: kernel/drivers/scsi/scsi_mod.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/device_handler/scsi_dh_alua.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/cdrom/cdrom.ko: +kernel/block/t10-pi.ko: +kernel/drivers/scsi/scsi_transport_fc.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/fs/configfs/configfs.ko: diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.dep.bin new file mode 100644 index 00000000..e59a3545 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.dep.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.devname b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.devname new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.softdep b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.softdep new file mode 100644 index 00000000..5554ccca --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.symbols b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.symbols new file mode 100644 index 00000000..c2a9a3f6 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.symbols @@ -0,0 +1,28 @@ +# Aliases for symbols, used by symbol_request(). +alias symbol:scsi_target_block_mangled scsi_mod +alias symbol:scsi_remove_host_mangled scsi_mod +alias symbol:t10_pi_type1_crc_mangled t10_pi +alias symbol:scsi_is_sas_rphy_mangled scsi_transport_sas +alias symbol:scsi_dh_attach_mangled scsi_mod +alias symbol:nvme_fc_set_remoteport_devloss_mangled nvme_fc +alias symbol:target_backend_unregister_mangled target_core_mod +alias symbol:scsi_host_get_mangled scsi_mod +alias symbol:__scsi_iterate_devices_mangled scsi_mod +alias symbol:target_execute_cmd_mangled target_core_mod +alias symbol:sas_enable_tlr_mangled scsi_transport_sas +alias symbol:fc_attach_transport_mangled scsi_transport_fc +alias symbol:register_cdrom_mangled cdrom +alias symbol:fc_vport_create_mangled scsi_transport_fc +alias symbol:scsi_print_sense_hdr_mangled scsi_mod +alias symbol:scsi_dma_map_mangled scsi_mod +alias symbol:scsi_is_sdev_device_mangled scsi_mod +alias symbol:nvme_complete_rq_mangled nvme_core +alias symbol:dm_unregister_path_selector_mangled dm_service_time +alias symbol:raid_class_attach_mangled raid_class +alias symbol:enclosure_remove_device_mangled enclosure +alias symbol:scsi_mode_sense_mangled scsi_mod +alias symbol:qlt_stop_phase2_mangled qla2xxx +alias symbol:dm_table_run_md_queue_async_mangled dm_mod +alias symbol:nvmf_fail_nonready_command_mangled nvme_fabrics +alias symbol:nvme_uninit_ctrl_mangled nvme_core +alias symbol:config_group_init_mangled configfs diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.symbols.bin new file mode 100644 index 00000000..f07cb998 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.weakdep b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.weakdep new file mode 100644 index 00000000..569696db --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/modules.weakdep @@ -0,0 +1 @@ +# Weak dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/novers-correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/novers-correct-modules.symbols.bin new file mode 100644 index 00000000..040aed8a Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/novers-correct-modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/novers-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/novers-modules.symbols.bin new file mode 100644 index 00000000..5b5c759e Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-delete/lib/modules/5.3.18/novers-modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.dep b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.dep new file mode 100644 index 00000000..b9666a0c --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.dep @@ -0,0 +1,22 @@ +kernel/drivers/md/dm-multipath.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/qla2xxx/qla2xxx.ko: kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fc.ko: kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fabrics.ko: kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/scsi_mod.ko: +kernel/drivers/scsi/ses.ko: kernel/drivers/misc/enclosure.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/scsi_transport_sas.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/mpt3sas.ko: kernel/drivers/scsi/raid_class.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-mod.ko: +kernel/drivers/nvme/host/nvme-core.ko: kernel/block/t10-pi.ko +kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko: kernel/drivers/scsi/qla2xxx/qla2xxx.ko kernel/drivers/target/target_core_mod.ko kernel/fs/configfs/configfs.ko kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/misc/enclosure.ko: +kernel/drivers/scsi/raid_class.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-service-time.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/target/target_core_mod.ko: kernel/fs/configfs/configfs.ko +kernel/drivers/scsi/sr_mod.ko: kernel/drivers/cdrom/cdrom.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/sd_mod.ko: kernel/drivers/scsi/scsi_mod.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/device_handler/scsi_dh_alua.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/cdrom/cdrom.ko: +kernel/block/t10-pi.ko: +kernel/drivers/scsi/scsi_transport_fc.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/fs/configfs/configfs.ko: diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.dep.bin new file mode 100644 index 00000000..e59a3545 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.dep.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.symbols b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.symbols new file mode 100644 index 00000000..c2a9a3f6 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.symbols @@ -0,0 +1,28 @@ +# Aliases for symbols, used by symbol_request(). +alias symbol:scsi_target_block_mangled scsi_mod +alias symbol:scsi_remove_host_mangled scsi_mod +alias symbol:t10_pi_type1_crc_mangled t10_pi +alias symbol:scsi_is_sas_rphy_mangled scsi_transport_sas +alias symbol:scsi_dh_attach_mangled scsi_mod +alias symbol:nvme_fc_set_remoteport_devloss_mangled nvme_fc +alias symbol:target_backend_unregister_mangled target_core_mod +alias symbol:scsi_host_get_mangled scsi_mod +alias symbol:__scsi_iterate_devices_mangled scsi_mod +alias symbol:target_execute_cmd_mangled target_core_mod +alias symbol:sas_enable_tlr_mangled scsi_transport_sas +alias symbol:fc_attach_transport_mangled scsi_transport_fc +alias symbol:register_cdrom_mangled cdrom +alias symbol:fc_vport_create_mangled scsi_transport_fc +alias symbol:scsi_print_sense_hdr_mangled scsi_mod +alias symbol:scsi_dma_map_mangled scsi_mod +alias symbol:scsi_is_sdev_device_mangled scsi_mod +alias symbol:nvme_complete_rq_mangled nvme_core +alias symbol:dm_unregister_path_selector_mangled dm_service_time +alias symbol:raid_class_attach_mangled raid_class +alias symbol:enclosure_remove_device_mangled enclosure +alias symbol:scsi_mode_sense_mangled scsi_mod +alias symbol:qlt_stop_phase2_mangled qla2xxx +alias symbol:dm_table_run_md_queue_async_mangled dm_mod +alias symbol:nvmf_fail_nonready_command_mangled nvme_fabrics +alias symbol:nvme_uninit_ctrl_mangled nvme_core +alias symbol:config_group_init_mangled configfs diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.symbols.bin new file mode 100644 index 00000000..f07cb998 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/correct-modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.alias b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.alias new file mode 100644 index 00000000..ba76e181 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.alias.bin b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.alias.bin new file mode 100644 index 00000000..7075435f Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.alias.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.dep b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.dep new file mode 100644 index 00000000..7bc615f7 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.dep @@ -0,0 +1,17 @@ +kernel/drivers/md/dm-multipath.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/nvme/host/nvme-fc.ko: kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fabrics.ko: kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/scsi_mod.ko: +kernel/drivers/md/dm-mod.ko: +kernel/drivers/nvme/host/nvme-core.ko: kernel/block/t10-pi.ko +kernel/drivers/misc/enclosure.ko: +kernel/drivers/scsi/raid_class.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-service-time.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/target/target_core_mod.ko: kernel/fs/configfs/configfs.ko +kernel/drivers/scsi/sr_mod.ko: kernel/drivers/cdrom/cdrom.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/sd_mod.ko: kernel/drivers/scsi/scsi_mod.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/device_handler/scsi_dh_alua.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/cdrom/cdrom.ko: +kernel/block/t10-pi.ko: +kernel/drivers/scsi/scsi_transport_fc.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/fs/configfs/configfs.ko: diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.dep.bin new file mode 100644 index 00000000..8ecbdad4 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.dep.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.devname b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.devname new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.softdep b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.softdep new file mode 100644 index 00000000..5554ccca --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.symbols b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.symbols new file mode 100644 index 00000000..2d6add06 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.symbols @@ -0,0 +1,25 @@ +# Aliases for symbols, used by symbol_request(). +alias symbol:scsi_target_block_mangled scsi_mod +alias symbol:scsi_remove_host_mangled scsi_mod +alias symbol:t10_pi_type1_crc_mangled t10_pi +alias symbol:scsi_dh_attach_mangled scsi_mod +alias symbol:nvme_fc_set_remoteport_devloss_mangled nvme_fc +alias symbol:target_backend_unregister_mangled target_core_mod +alias symbol:scsi_host_get_mangled scsi_mod +alias symbol:__scsi_iterate_devices_mangled scsi_mod +alias symbol:target_execute_cmd_mangled target_core_mod +alias symbol:fc_attach_transport_mangled scsi_transport_fc +alias symbol:register_cdrom_mangled cdrom +alias symbol:fc_vport_create_mangled scsi_transport_fc +alias symbol:scsi_print_sense_hdr_mangled scsi_mod +alias symbol:scsi_dma_map_mangled scsi_mod +alias symbol:scsi_is_sdev_device_mangled scsi_mod +alias symbol:nvme_complete_rq_mangled nvme_core +alias symbol:dm_unregister_path_selector_mangled dm_service_time +alias symbol:raid_class_attach_mangled raid_class +alias symbol:enclosure_remove_device_mangled enclosure +alias symbol:scsi_mode_sense_mangled scsi_mod +alias symbol:dm_table_run_md_queue_async_mangled dm_mod +alias symbol:nvmf_fail_nonready_command_mangled nvme_fabrics +alias symbol:nvme_uninit_ctrl_mangled nvme_core +alias symbol:config_group_init_mangled configfs diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.symbols.bin new file mode 100644 index 00000000..ecdd89e3 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.weakdep b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.weakdep new file mode 100644 index 00000000..569696db --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/modules.weakdep @@ -0,0 +1 @@ +# Weak dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/novers-correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/novers-correct-modules.symbols.bin new file mode 100644 index 00000000..5b5c759e Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/novers-correct-modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/novers-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/novers-modules.symbols.bin new file mode 100644 index 00000000..040aed8a Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-incremental/lib/modules/5.3.18/novers-modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.dep b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.dep new file mode 100644 index 00000000..361d1a9c --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.dep @@ -0,0 +1,22 @@ +kernel/drivers/md/dm-multipath.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +updates/qla2xxx.ko: kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fc.ko: kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fabrics.ko: kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/scsi_mod.ko: +kernel/drivers/scsi/ses.ko: kernel/drivers/misc/enclosure.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/scsi_transport_sas.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/mpt3sas.ko: kernel/drivers/scsi/raid_class.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-mod.ko: +kernel/drivers/nvme/host/nvme-core.ko: kernel/block/t10-pi.ko +updates/tcm_qla2xxx.ko: updates/qla2xxx.ko kernel/drivers/target/target_core_mod.ko kernel/fs/configfs/configfs.ko kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/misc/enclosure.ko: +kernel/drivers/scsi/raid_class.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-service-time.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/target/target_core_mod.ko: kernel/fs/configfs/configfs.ko +kernel/drivers/scsi/sr_mod.ko: kernel/drivers/cdrom/cdrom.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/sd_mod.ko: kernel/drivers/scsi/scsi_mod.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/device_handler/scsi_dh_alua.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/cdrom/cdrom.ko: +kernel/block/t10-pi.ko: +kernel/drivers/scsi/scsi_transport_fc.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/fs/configfs/configfs.ko: diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.dep.bin new file mode 100644 index 00000000..022bb534 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.dep.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.symbols b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.symbols new file mode 100644 index 00000000..c2a9a3f6 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.symbols @@ -0,0 +1,28 @@ +# Aliases for symbols, used by symbol_request(). +alias symbol:scsi_target_block_mangled scsi_mod +alias symbol:scsi_remove_host_mangled scsi_mod +alias symbol:t10_pi_type1_crc_mangled t10_pi +alias symbol:scsi_is_sas_rphy_mangled scsi_transport_sas +alias symbol:scsi_dh_attach_mangled scsi_mod +alias symbol:nvme_fc_set_remoteport_devloss_mangled nvme_fc +alias symbol:target_backend_unregister_mangled target_core_mod +alias symbol:scsi_host_get_mangled scsi_mod +alias symbol:__scsi_iterate_devices_mangled scsi_mod +alias symbol:target_execute_cmd_mangled target_core_mod +alias symbol:sas_enable_tlr_mangled scsi_transport_sas +alias symbol:fc_attach_transport_mangled scsi_transport_fc +alias symbol:register_cdrom_mangled cdrom +alias symbol:fc_vport_create_mangled scsi_transport_fc +alias symbol:scsi_print_sense_hdr_mangled scsi_mod +alias symbol:scsi_dma_map_mangled scsi_mod +alias symbol:scsi_is_sdev_device_mangled scsi_mod +alias symbol:nvme_complete_rq_mangled nvme_core +alias symbol:dm_unregister_path_selector_mangled dm_service_time +alias symbol:raid_class_attach_mangled raid_class +alias symbol:enclosure_remove_device_mangled enclosure +alias symbol:scsi_mode_sense_mangled scsi_mod +alias symbol:qlt_stop_phase2_mangled qla2xxx +alias symbol:dm_table_run_md_queue_async_mangled dm_mod +alias symbol:nvmf_fail_nonready_command_mangled nvme_fabrics +alias symbol:nvme_uninit_ctrl_mangled nvme_core +alias symbol:config_group_init_mangled configfs diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.symbols.bin new file mode 100644 index 00000000..6084be25 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/correct-modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.alias b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.alias new file mode 100644 index 00000000..ba76e181 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.alias.bin b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.alias.bin new file mode 100644 index 00000000..7075435f Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.alias.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.dep b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.dep new file mode 100644 index 00000000..b9666a0c --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.dep @@ -0,0 +1,22 @@ +kernel/drivers/md/dm-multipath.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/qla2xxx/qla2xxx.ko: kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fc.ko: kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fabrics.ko: kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/scsi_mod.ko: +kernel/drivers/scsi/ses.ko: kernel/drivers/misc/enclosure.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/scsi_transport_sas.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/mpt3sas.ko: kernel/drivers/scsi/raid_class.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-mod.ko: +kernel/drivers/nvme/host/nvme-core.ko: kernel/block/t10-pi.ko +kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko: kernel/drivers/scsi/qla2xxx/qla2xxx.ko kernel/drivers/target/target_core_mod.ko kernel/fs/configfs/configfs.ko kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/misc/enclosure.ko: +kernel/drivers/scsi/raid_class.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-service-time.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/target/target_core_mod.ko: kernel/fs/configfs/configfs.ko +kernel/drivers/scsi/sr_mod.ko: kernel/drivers/cdrom/cdrom.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/sd_mod.ko: kernel/drivers/scsi/scsi_mod.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/device_handler/scsi_dh_alua.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/cdrom/cdrom.ko: +kernel/block/t10-pi.ko: +kernel/drivers/scsi/scsi_transport_fc.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/fs/configfs/configfs.ko: diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.dep.bin new file mode 100644 index 00000000..e59a3545 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.dep.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.devname b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.devname new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.softdep b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.softdep new file mode 100644 index 00000000..5554ccca --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.symbols b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.symbols new file mode 100644 index 00000000..c2a9a3f6 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.symbols @@ -0,0 +1,28 @@ +# Aliases for symbols, used by symbol_request(). +alias symbol:scsi_target_block_mangled scsi_mod +alias symbol:scsi_remove_host_mangled scsi_mod +alias symbol:t10_pi_type1_crc_mangled t10_pi +alias symbol:scsi_is_sas_rphy_mangled scsi_transport_sas +alias symbol:scsi_dh_attach_mangled scsi_mod +alias symbol:nvme_fc_set_remoteport_devloss_mangled nvme_fc +alias symbol:target_backend_unregister_mangled target_core_mod +alias symbol:scsi_host_get_mangled scsi_mod +alias symbol:__scsi_iterate_devices_mangled scsi_mod +alias symbol:target_execute_cmd_mangled target_core_mod +alias symbol:sas_enable_tlr_mangled scsi_transport_sas +alias symbol:fc_attach_transport_mangled scsi_transport_fc +alias symbol:register_cdrom_mangled cdrom +alias symbol:fc_vport_create_mangled scsi_transport_fc +alias symbol:scsi_print_sense_hdr_mangled scsi_mod +alias symbol:scsi_dma_map_mangled scsi_mod +alias symbol:scsi_is_sdev_device_mangled scsi_mod +alias symbol:nvme_complete_rq_mangled nvme_core +alias symbol:dm_unregister_path_selector_mangled dm_service_time +alias symbol:raid_class_attach_mangled raid_class +alias symbol:enclosure_remove_device_mangled enclosure +alias symbol:scsi_mode_sense_mangled scsi_mod +alias symbol:qlt_stop_phase2_mangled qla2xxx +alias symbol:dm_table_run_md_queue_async_mangled dm_mod +alias symbol:nvmf_fail_nonready_command_mangled nvme_fabrics +alias symbol:nvme_uninit_ctrl_mangled nvme_core +alias symbol:config_group_init_mangled configfs diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.symbols.bin new file mode 100644 index 00000000..f07cb998 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.weakdep b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.weakdep new file mode 100644 index 00000000..569696db --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/modules.weakdep @@ -0,0 +1 @@ +# Weak dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/novers-correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/novers-correct-modules.symbols.bin new file mode 100644 index 00000000..5b5c759e Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/novers-correct-modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/novers-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/novers-modules.symbols.bin new file mode 100644 index 00000000..5b5c759e Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-override/lib/modules/5.3.18/novers-modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.dep b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.dep new file mode 100644 index 00000000..b9666a0c --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.dep @@ -0,0 +1,22 @@ +kernel/drivers/md/dm-multipath.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/qla2xxx/qla2xxx.ko: kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fc.ko: kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fabrics.ko: kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/scsi_mod.ko: +kernel/drivers/scsi/ses.ko: kernel/drivers/misc/enclosure.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/scsi_transport_sas.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/mpt3sas.ko: kernel/drivers/scsi/raid_class.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-mod.ko: +kernel/drivers/nvme/host/nvme-core.ko: kernel/block/t10-pi.ko +kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko: kernel/drivers/scsi/qla2xxx/qla2xxx.ko kernel/drivers/target/target_core_mod.ko kernel/fs/configfs/configfs.ko kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/misc/enclosure.ko: +kernel/drivers/scsi/raid_class.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-service-time.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/target/target_core_mod.ko: kernel/fs/configfs/configfs.ko +kernel/drivers/scsi/sr_mod.ko: kernel/drivers/cdrom/cdrom.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/sd_mod.ko: kernel/drivers/scsi/scsi_mod.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/device_handler/scsi_dh_alua.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/cdrom/cdrom.ko: +kernel/block/t10-pi.ko: +kernel/drivers/scsi/scsi_transport_fc.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/fs/configfs/configfs.ko: diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.dep.bin new file mode 100644 index 00000000..e59a3545 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.dep.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.symbols b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.symbols new file mode 100644 index 00000000..c2a9a3f6 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.symbols @@ -0,0 +1,28 @@ +# Aliases for symbols, used by symbol_request(). +alias symbol:scsi_target_block_mangled scsi_mod +alias symbol:scsi_remove_host_mangled scsi_mod +alias symbol:t10_pi_type1_crc_mangled t10_pi +alias symbol:scsi_is_sas_rphy_mangled scsi_transport_sas +alias symbol:scsi_dh_attach_mangled scsi_mod +alias symbol:nvme_fc_set_remoteport_devloss_mangled nvme_fc +alias symbol:target_backend_unregister_mangled target_core_mod +alias symbol:scsi_host_get_mangled scsi_mod +alias symbol:__scsi_iterate_devices_mangled scsi_mod +alias symbol:target_execute_cmd_mangled target_core_mod +alias symbol:sas_enable_tlr_mangled scsi_transport_sas +alias symbol:fc_attach_transport_mangled scsi_transport_fc +alias symbol:register_cdrom_mangled cdrom +alias symbol:fc_vport_create_mangled scsi_transport_fc +alias symbol:scsi_print_sense_hdr_mangled scsi_mod +alias symbol:scsi_dma_map_mangled scsi_mod +alias symbol:scsi_is_sdev_device_mangled scsi_mod +alias symbol:nvme_complete_rq_mangled nvme_core +alias symbol:dm_unregister_path_selector_mangled dm_service_time +alias symbol:raid_class_attach_mangled raid_class +alias symbol:enclosure_remove_device_mangled enclosure +alias symbol:scsi_mode_sense_mangled scsi_mod +alias symbol:qlt_stop_phase2_mangled qla2xxx +alias symbol:dm_table_run_md_queue_async_mangled dm_mod +alias symbol:nvmf_fail_nonready_command_mangled nvme_fabrics +alias symbol:nvme_uninit_ctrl_mangled nvme_core +alias symbol:config_group_init_mangled configfs diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.symbols.bin new file mode 100644 index 00000000..6084be25 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/correct-modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.alias b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.alias new file mode 100644 index 00000000..ba76e181 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.alias.bin b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.alias.bin new file mode 100644 index 00000000..7075435f Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.alias.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.dep b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.dep new file mode 100644 index 00000000..b9666a0c --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.dep @@ -0,0 +1,22 @@ +kernel/drivers/md/dm-multipath.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/qla2xxx/qla2xxx.ko: kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fc.ko: kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fabrics.ko: kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/scsi_mod.ko: +kernel/drivers/scsi/ses.ko: kernel/drivers/misc/enclosure.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/scsi_transport_sas.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/mpt3sas.ko: kernel/drivers/scsi/raid_class.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-mod.ko: +kernel/drivers/nvme/host/nvme-core.ko: kernel/block/t10-pi.ko +kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko: kernel/drivers/scsi/qla2xxx/qla2xxx.ko kernel/drivers/target/target_core_mod.ko kernel/fs/configfs/configfs.ko kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/misc/enclosure.ko: +kernel/drivers/scsi/raid_class.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-service-time.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/target/target_core_mod.ko: kernel/fs/configfs/configfs.ko +kernel/drivers/scsi/sr_mod.ko: kernel/drivers/cdrom/cdrom.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/sd_mod.ko: kernel/drivers/scsi/scsi_mod.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/device_handler/scsi_dh_alua.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/cdrom/cdrom.ko: +kernel/block/t10-pi.ko: +kernel/drivers/scsi/scsi_transport_fc.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/fs/configfs/configfs.ko: diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.dep.bin new file mode 100644 index 00000000..e59a3545 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.dep.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.devname b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.devname new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.softdep b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.softdep new file mode 100644 index 00000000..5554ccca --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.symbols b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.symbols new file mode 100644 index 00000000..c2a9a3f6 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.symbols @@ -0,0 +1,28 @@ +# Aliases for symbols, used by symbol_request(). +alias symbol:scsi_target_block_mangled scsi_mod +alias symbol:scsi_remove_host_mangled scsi_mod +alias symbol:t10_pi_type1_crc_mangled t10_pi +alias symbol:scsi_is_sas_rphy_mangled scsi_transport_sas +alias symbol:scsi_dh_attach_mangled scsi_mod +alias symbol:nvme_fc_set_remoteport_devloss_mangled nvme_fc +alias symbol:target_backend_unregister_mangled target_core_mod +alias symbol:scsi_host_get_mangled scsi_mod +alias symbol:__scsi_iterate_devices_mangled scsi_mod +alias symbol:target_execute_cmd_mangled target_core_mod +alias symbol:sas_enable_tlr_mangled scsi_transport_sas +alias symbol:fc_attach_transport_mangled scsi_transport_fc +alias symbol:register_cdrom_mangled cdrom +alias symbol:fc_vport_create_mangled scsi_transport_fc +alias symbol:scsi_print_sense_hdr_mangled scsi_mod +alias symbol:scsi_dma_map_mangled scsi_mod +alias symbol:scsi_is_sdev_device_mangled scsi_mod +alias symbol:nvme_complete_rq_mangled nvme_core +alias symbol:dm_unregister_path_selector_mangled dm_service_time +alias symbol:raid_class_attach_mangled raid_class +alias symbol:enclosure_remove_device_mangled enclosure +alias symbol:scsi_mode_sense_mangled scsi_mod +alias symbol:qlt_stop_phase2_mangled qla2xxx +alias symbol:dm_table_run_md_queue_async_mangled dm_mod +alias symbol:nvmf_fail_nonready_command_mangled nvme_fabrics +alias symbol:nvme_uninit_ctrl_mangled nvme_core +alias symbol:config_group_init_mangled configfs diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.symbols.bin new file mode 100644 index 00000000..f07cb998 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.weakdep b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.weakdep new file mode 100644 index 00000000..569696db --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/modules.weakdep @@ -0,0 +1 @@ +# Weak dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/novers-correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/novers-correct-modules.symbols.bin new file mode 100644 index 00000000..5b5c759e Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/novers-correct-modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/novers-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/novers-modules.symbols.bin new file mode 100644 index 00000000..5b5c759e Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01-replace/lib/modules/5.3.18/novers-modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.dep b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.dep new file mode 100644 index 00000000..b9666a0c --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.dep @@ -0,0 +1,22 @@ +kernel/drivers/md/dm-multipath.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/qla2xxx/qla2xxx.ko: kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fc.ko: kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/nvme/host/nvme-fabrics.ko: kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/scsi_mod.ko: +kernel/drivers/scsi/ses.ko: kernel/drivers/misc/enclosure.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/scsi_transport_sas.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/mpt3sas.ko: kernel/drivers/scsi/raid_class.ko kernel/drivers/scsi/scsi_transport_sas.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-mod.ko: +kernel/drivers/nvme/host/nvme-core.ko: kernel/block/t10-pi.ko +kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko: kernel/drivers/scsi/qla2xxx/qla2xxx.ko kernel/drivers/target/target_core_mod.ko kernel/fs/configfs/configfs.ko kernel/drivers/nvme/host/nvme-fc.ko kernel/drivers/scsi/scsi_transport_fc.ko kernel/drivers/nvme/host/nvme-fabrics.ko kernel/drivers/scsi/scsi_mod.ko kernel/drivers/nvme/host/nvme-core.ko kernel/block/t10-pi.ko +kernel/drivers/misc/enclosure.ko: +kernel/drivers/scsi/raid_class.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/md/dm-service-time.ko: kernel/drivers/md/dm-mod.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/target/target_core_mod.ko: kernel/fs/configfs/configfs.ko +kernel/drivers/scsi/sr_mod.ko: kernel/drivers/cdrom/cdrom.ko kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/scsi/sd_mod.ko: kernel/drivers/scsi/scsi_mod.ko kernel/block/t10-pi.ko +kernel/drivers/scsi/device_handler/scsi_dh_alua.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/drivers/cdrom/cdrom.ko: +kernel/block/t10-pi.ko: +kernel/drivers/scsi/scsi_transport_fc.ko: kernel/drivers/scsi/scsi_mod.ko +kernel/fs/configfs/configfs.ko: diff --git a/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.dep.bin new file mode 100644 index 00000000..e59a3545 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.dep.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.symbols b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.symbols new file mode 100644 index 00000000..c2a9a3f6 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.symbols @@ -0,0 +1,28 @@ +# Aliases for symbols, used by symbol_request(). +alias symbol:scsi_target_block_mangled scsi_mod +alias symbol:scsi_remove_host_mangled scsi_mod +alias symbol:t10_pi_type1_crc_mangled t10_pi +alias symbol:scsi_is_sas_rphy_mangled scsi_transport_sas +alias symbol:scsi_dh_attach_mangled scsi_mod +alias symbol:nvme_fc_set_remoteport_devloss_mangled nvme_fc +alias symbol:target_backend_unregister_mangled target_core_mod +alias symbol:scsi_host_get_mangled scsi_mod +alias symbol:__scsi_iterate_devices_mangled scsi_mod +alias symbol:target_execute_cmd_mangled target_core_mod +alias symbol:sas_enable_tlr_mangled scsi_transport_sas +alias symbol:fc_attach_transport_mangled scsi_transport_fc +alias symbol:register_cdrom_mangled cdrom +alias symbol:fc_vport_create_mangled scsi_transport_fc +alias symbol:scsi_print_sense_hdr_mangled scsi_mod +alias symbol:scsi_dma_map_mangled scsi_mod +alias symbol:scsi_is_sdev_device_mangled scsi_mod +alias symbol:nvme_complete_rq_mangled nvme_core +alias symbol:dm_unregister_path_selector_mangled dm_service_time +alias symbol:raid_class_attach_mangled raid_class +alias symbol:enclosure_remove_device_mangled enclosure +alias symbol:scsi_mode_sense_mangled scsi_mod +alias symbol:qlt_stop_phase2_mangled qla2xxx +alias symbol:dm_table_run_md_queue_async_mangled dm_mod +alias symbol:nvmf_fail_nonready_command_mangled nvme_fabrics +alias symbol:nvme_uninit_ctrl_mangled nvme_core +alias symbol:config_group_init_mangled configfs diff --git a/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.symbols.bin new file mode 100644 index 00000000..f07cb998 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/correct-modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/novers-correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/novers-correct-modules.symbols.bin new file mode 100644 index 00000000..5b5c759e Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/big-01/lib/modules/5.3.18/novers-correct-modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.dep b/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.dep new file mode 100644 index 00000000..f565c716 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.dep @@ -0,0 +1,5 @@ +kernel/lib/mod-foo-b.ko: +kernel/mod-foo-c.ko: +kernel/fs/foo/mod-foo-a.ko: +kernel/fs/mod-bar.ko: kernel/lib/mod-foo-b.ko +kernel/fs/mod-foo.ko: kernel/fs/foo/mod-foo-a.ko kernel/lib/mod-foo-b.ko kernel/mod-foo-c.ko diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.dep.bin new file mode 100644 index 00000000..7828c391 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.dep.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.symbols b/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.symbols new file mode 100644 index 00000000..ddb6ab6b --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.symbols @@ -0,0 +1,4 @@ +# Aliases for symbols, used by symbol_request(). +alias symbol:print_fooA mod_foo_a +alias symbol:print_fooC mod_foo_c +alias symbol:print_fooB mod_foo_b diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.symbols.bin new file mode 100644 index 00000000..5d929ee3 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/correct-modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/novers-correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/novers-correct-modules.symbols.bin new file mode 100644 index 00000000..4d1be9ef Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/test-dependencies-1/lib/modules/4.4.4/novers-correct-modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/correct-modules.dep b/testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/correct-modules.dep new file mode 100644 index 00000000..9ec9cf31 --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/correct-modules.dep @@ -0,0 +1,5 @@ +kernel/lib/mod-foo-b.ko: +kernel/mod-foo-c.ko: +kernel/fs/foo/mod-foo-a.ko: +kernel/fs/mod-foo.ko: kernel/fs/foo/mod-foo-a.ko kernel/lib/mod-foo-b.ko kernel/mod-foo-c.ko +kernel/fs/mod-bah.ko: kernel/lib/mod-foo-b.ko diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/correct-modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/correct-modules.dep.bin new file mode 100644 index 00000000..65ac7f68 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/correct-modules.dep.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/correct-modules.symbols b/testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/correct-modules.symbols new file mode 100644 index 00000000..ddb6ab6b --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/correct-modules.symbols @@ -0,0 +1,4 @@ +# Aliases for symbols, used by symbol_request(). +alias symbol:print_fooA mod_foo_a +alias symbol:print_fooC mod_foo_c +alias symbol:print_fooB mod_foo_b diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/correct-modules.symbols.bin new file mode 100644 index 00000000..5d929ee3 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/correct-modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/novers-correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/novers-correct-modules.symbols.bin new file mode 100644 index 00000000..4d1be9ef Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/test-dependencies-2/lib/modules/4.4.4/novers-correct-modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.dep b/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.dep new file mode 100644 index 00000000..cd7c21bf --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.dep @@ -0,0 +1,4 @@ +kernel/lib/mod-foo-b.ko: +kernel/mod-foo-c.ko: +kernel/fs/foo/mod-foo-a.ko: +kernel/fs/mod-foo.ko: kernel/fs/foo/mod-foo-a.ko kernel/lib/mod-foo-b.ko kernel/mod-foo-c.ko diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.dep.bin b/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.dep.bin new file mode 100644 index 00000000..46c7f80c Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.dep.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.symbols b/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.symbols new file mode 100644 index 00000000..ddb6ab6b --- /dev/null +++ b/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.symbols @@ -0,0 +1,4 @@ +# Aliases for symbols, used by symbol_request(). +alias symbol:print_fooA mod_foo_a +alias symbol:print_fooC mod_foo_c +alias symbol:print_fooB mod_foo_b diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.symbols.bin new file mode 100644 index 00000000..5d929ee3 Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/correct-modules.symbols.bin differ diff --git a/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/novers-correct-modules.symbols.bin b/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/novers-correct-modules.symbols.bin new file mode 100644 index 00000000..4d1be9ef Binary files /dev/null and b/testsuite/rootfs-pristine/test-depmod/test-dependencies/lib/modules/4.4.4/novers-correct-modules.symbols.bin differ diff --git a/testsuite/test-depmod.c b/testsuite/test-depmod.c index ec157b2c..a1dfb46a 100644 --- a/testsuite/test-depmod.c +++ b/testsuite/test-depmod.c @@ -257,4 +257,312 @@ DEFINE_TEST(depmod_check_weakdep, }, }); +#define TEST_DEPENDENCIES_ROOTFS TESTSUITE_ROOTFS "test-depmod/test-dependencies" +static noreturn int depmod_test_dependencies(const struct test *t) +{ + const char *progname = TOOLS_DIR "/depmod"; + const char *const args[] = { + progname, + NULL, + }; + + test_spawn_prog(progname, args); + exit(EXIT_FAILURE); +} +DEFINE_TEST(depmod_test_dependencies, +#if defined(KMOD_SYSCONFDIR_NOT_ETC) + .skip = true, +#endif + .description = "check if depmod generates correct dependencies", + .config = { + [TC_UNAME_R] = "4.4.4", + [TC_ROOTFS] = TEST_DEPENDENCIES_ROOTFS, + }, + .output = { + .files = (const struct keyval[]) { + { TEST_DEPENDENCIES_ROOTFS MODULE_DIRECTORY "/4.4.4/correct-modules.dep", + TEST_DEPENDENCIES_ROOTFS MODULE_DIRECTORY "/4.4.4/modules.dep" }, + { TEST_DEPENDENCIES_ROOTFS MODULE_DIRECTORY "/4.4.4/correct-modules.dep.bin", + TEST_DEPENDENCIES_ROOTFS MODULE_DIRECTORY "/4.4.4/modules.dep.bin" }, + { TEST_DEPENDENCIES_ROOTFS MODULE_DIRECTORY "/4.4.4/correct-modules.symbols", + TEST_DEPENDENCIES_ROOTFS MODULE_DIRECTORY "/4.4.4/modules.symbols" }, + { TEST_DEPENDENCIES_ROOTFS MODULE_DIRECTORY "/4.4.4/correct-modules.symbols.bin", + TEST_DEPENDENCIES_ROOTFS MODULE_DIRECTORY "/4.4.4/modules.symbols.bin" }, + { } + }, + }); + +#define TEST_DEPENDENCIES_1_ROOTFS TESTSUITE_ROOTFS "test-depmod/test-dependencies-1" +static noreturn int depmod_test_dependencies_1(const struct test *t) +{ + const char *progname = TOOLS_DIR "/depmod"; + const char *const args[] = { + progname, + NULL, + }; + + test_spawn_prog(progname, args); + exit(EXIT_FAILURE); +} +DEFINE_TEST(depmod_test_dependencies_1, +#if defined(KMOD_SYSCONFDIR_NOT_ETC) + .skip = true, +#endif + .description = "check dependency generation, case 1: mod_bar", + .config = { + [TC_UNAME_R] = "4.4.4", + [TC_ROOTFS] = TEST_DEPENDENCIES_1_ROOTFS, + }, + .output = { + .regex = true, + .files = (const struct keyval[]) { + { TEST_DEPENDENCIES_1_ROOTFS MODULE_DIRECTORY "/4.4.4/correct-modules.dep", + TEST_DEPENDENCIES_1_ROOTFS MODULE_DIRECTORY "/4.4.4/modules.dep" }, + { TEST_DEPENDENCIES_1_ROOTFS MODULE_DIRECTORY "/4.4.4/correct-modules.dep.bin", + TEST_DEPENDENCIES_1_ROOTFS MODULE_DIRECTORY "/4.4.4/modules.dep.bin" }, + { TEST_DEPENDENCIES_1_ROOTFS MODULE_DIRECTORY "/4.4.4/correct-modules.symbols", + TEST_DEPENDENCIES_1_ROOTFS MODULE_DIRECTORY "/4.4.4/modules.symbols" }, + { TEST_DEPENDENCIES_1_ROOTFS MODULE_DIRECTORY "/4.4.4/correct-modules.symbols.bin", + TEST_DEPENDENCIES_1_ROOTFS MODULE_DIRECTORY "/4.4.4/modules.symbols.bin" }, + { } + }, + }); + +#define TEST_DEPENDENCIES_2_ROOTFS TESTSUITE_ROOTFS "test-depmod/test-dependencies-2" +static noreturn int depmod_test_dependencies_2(const struct test *t) +{ + const char *progname = TOOLS_DIR "/depmod"; + const char *const args[] = { + progname, + NULL, + }; + + test_spawn_prog(progname, args); + exit(EXIT_FAILURE); +} +DEFINE_TEST(depmod_test_dependencies_2, +#if defined(KMOD_SYSCONFDIR_NOT_ETC) + .skip = true, +#endif + .description = "check dependency generation, case 2: mod_bah", + .config = { + [TC_UNAME_R] = "4.4.4", + [TC_ROOTFS] = TEST_DEPENDENCIES_2_ROOTFS, + }, + .output = { + .regex = true, + .files = (const struct keyval[]) { + { TEST_DEPENDENCIES_2_ROOTFS MODULE_DIRECTORY "/4.4.4/correct-modules.dep", + TEST_DEPENDENCIES_2_ROOTFS MODULE_DIRECTORY "/4.4.4/modules.dep" }, + { TEST_DEPENDENCIES_2_ROOTFS MODULE_DIRECTORY "/4.4.4/correct-modules.dep.bin", + TEST_DEPENDENCIES_2_ROOTFS MODULE_DIRECTORY "/4.4.4/modules.dep.bin" }, + { TEST_DEPENDENCIES_2_ROOTFS MODULE_DIRECTORY "/4.4.4/correct-modules.symbols", + TEST_DEPENDENCIES_2_ROOTFS MODULE_DIRECTORY "/4.4.4/modules.symbols" }, + { TEST_DEPENDENCIES_2_ROOTFS MODULE_DIRECTORY "/4.4.4/correct-modules.symbols.bin", + TEST_DEPENDENCIES_2_ROOTFS MODULE_DIRECTORY "/4.4.4/modules.symbols.bin" }, + { } + }, + }); + +#define TEST_BIG_01_ROOTFS TESTSUITE_ROOTFS "test-depmod/big-01" +static noreturn int depmod_test_big_01(const struct test *t) +{ + const char *progname = TOOLS_DIR "/depmod"; + const char *const args[] = { + progname, "-e", + "-E", TEST_BIG_01_ROOTFS MODULE_DIRECTORY "/5.3.18/symvers", + NULL, + }; + + test_spawn_prog(progname, args); + exit(EXIT_FAILURE); +} +DEFINE_TEST(depmod_test_big_01, +#if defined(KMOD_SYSCONFDIR_NOT_ETC) + .skip = true, +#endif + .description = "check generating dependencies for a larger set of modules", + .config = { + [TC_UNAME_R] = "5.3.18", + [TC_ROOTFS] = TEST_BIG_01_ROOTFS, + }, + .output = { + .regex = true, + .files = (const struct keyval[]) { + { TEST_BIG_01_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.dep", + TEST_BIG_01_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.dep" }, + { TEST_BIG_01_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.dep.bin", + TEST_BIG_01_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.dep.bin" }, + { TEST_BIG_01_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.symbols", + TEST_BIG_01_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.symbols" }, + { TEST_BIG_01_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.symbols.bin", + TEST_BIG_01_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.symbols.bin" }, + { } + }, + }); + +#define TEST_BIG_01_INCREMENTAL_ROOTFS TESTSUITE_ROOTFS "test-depmod/big-01-incremental" +static noreturn int depmod_test_big_01_incremental(const struct test *t) +{ + const char *progname = TOOLS_DIR "/depmod"; + const char *const args[] = { + progname, + "-e", + "-E", + TEST_BIG_01_INCREMENTAL_ROOTFS MODULE_DIRECTORY "/5.3.18/symvers", + "-I", + "-a", + NULL, + }; + + test_spawn_prog(progname, args); + exit(EXIT_FAILURE); +} +DEFINE_TEST(depmod_test_big_01_incremental, +#if defined(KMOD_SYSCONFDIR_NOT_ETC) + .skip = true, +#endif + .description = "check generating incremental dependencies the big-01 module set", + .config = { + [TC_UNAME_R] = "5.3.18", + [TC_ROOTFS] = TEST_BIG_01_INCREMENTAL_ROOTFS, + }, + .output = { + .regex = true, + .files = (const struct keyval[]) { + { TEST_BIG_01_INCREMENTAL_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.dep", + TEST_BIG_01_INCREMENTAL_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.dep" }, + { TEST_BIG_01_INCREMENTAL_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.dep.bin", + TEST_BIG_01_INCREMENTAL_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.dep.bin" }, + { TEST_BIG_01_INCREMENTAL_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.symbols", + TEST_BIG_01_INCREMENTAL_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.symbols" }, + { TEST_BIG_01_INCREMENTAL_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.symbols.bin", + TEST_BIG_01_INCREMENTAL_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.symbols.bin" }, + { } + }, + }); + +#define TEST_BIG_01_DELETE_ROOTFS TESTSUITE_ROOTFS "test-depmod/big-01-delete" +static noreturn int depmod_test_big_01_delete(const struct test *t) +{ + const char *progname = TOOLS_DIR "/depmod"; + const char *const args[] = { + progname, "-e", + "-E", TEST_BIG_01_DELETE_ROOTFS MODULE_DIRECTORY "/5.3.18/symvers", + "-I", "-a", + NULL, + }; + + test_spawn_prog(progname, args); + exit(EXIT_FAILURE); +} +DEFINE_TEST(depmod_test_big_01_delete, +#if defined(KMOD_SYSCONFDIR_NOT_ETC) + .skip = true, +#endif + .description = "check depmod -I with module deletion from the big-01 module set", + .config = { + [TC_UNAME_R] = "5.3.18", + [TC_ROOTFS] = TEST_BIG_01_DELETE_ROOTFS, + }, + .output = { + .regex = true, + .files = (const struct keyval[]) { + { TEST_BIG_01_DELETE_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.dep", + TEST_BIG_01_DELETE_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.dep" }, + { TEST_BIG_01_DELETE_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.dep.bin", + TEST_BIG_01_DELETE_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.dep.bin" }, + { TEST_BIG_01_DELETE_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.symbols", + TEST_BIG_01_DELETE_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.symbols" }, + { TEST_BIG_01_DELETE_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.symbols.bin", + TEST_BIG_01_DELETE_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.symbols.bin" }, + { } + }, + }); + +#define TEST_BIG_01_REPLACE_ROOTFS TESTSUITE_ROOTFS "test-depmod/big-01-replace" +static noreturn int depmod_test_big_01_replace(const struct test *t) +{ + const char *progname = TOOLS_DIR "/depmod"; + const char *const args[] = { + progname, + "-e", + "-E", + TEST_BIG_01_REPLACE_ROOTFS MODULE_DIRECTORY "/5.3.18/symvers", + "-I", + "5.3.18", + "kernel/drivers/scsi/qla2xxx/qla2xxx.ko", + "kernel/drivers/scsi/qla2xxx/tcm_qla2xxx.ko", + NULL, + }; + + test_spawn_prog(progname, args); + exit(EXIT_FAILURE); +} +DEFINE_TEST(depmod_test_big_01_replace, +#if defined(KMOD_SYSCONFDIR_NOT_ETC) + .skip = true, +#endif + .description = "check depmod -I with module replacement from the big-01 module set", + .config = { + [TC_UNAME_R] = "5.3.18", + [TC_ROOTFS] = TEST_BIG_01_REPLACE_ROOTFS, + }, + .output = { + .regex = true, + .files = (const struct keyval[]) { + { TEST_BIG_01_REPLACE_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.dep", + TEST_BIG_01_REPLACE_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.dep" }, + { TEST_BIG_01_REPLACE_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.dep.bin", + TEST_BIG_01_REPLACE_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.dep.bin" }, + { TEST_BIG_01_REPLACE_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.symbols", + TEST_BIG_01_REPLACE_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.symbols" }, + { TEST_BIG_01_REPLACE_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.symbols.bin", + TEST_BIG_01_REPLACE_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.symbols.bin" }, + { } + }, + }); + +#define TEST_BIG_01_OVERRIDE_ROOTFS TESTSUITE_ROOTFS "test-depmod/big-01-override" +static noreturn int depmod_test_big_01_override(const struct test *t) +{ + const char *progname = TOOLS_DIR "/depmod"; + const char *const args[] = { + progname, + "-v", + "-e", + "-E", + TEST_BIG_01_OVERRIDE_ROOTFS MODULE_DIRECTORY "/5.3.18/symvers", + "-I", + "-a", + NULL, + }; + + test_spawn_prog(progname, args); + exit(EXIT_FAILURE); +} +DEFINE_TEST(depmod_test_big_01_override, +#if defined(KMOD_SYSCONFDIR_NOT_ETC) + .skip = true, +#endif + .description = "check depmod -I with module override from the big-01 module set", + .config = { + [TC_UNAME_R] = "5.3.18", + [TC_ROOTFS] = TEST_BIG_01_OVERRIDE_ROOTFS, + }, + .output = { + .regex = true, + .files = (const struct keyval[]) { + { TEST_BIG_01_OVERRIDE_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.dep", + TEST_BIG_01_OVERRIDE_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.dep" }, + { TEST_BIG_01_OVERRIDE_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.dep.bin", + TEST_BIG_01_OVERRIDE_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.dep.bin" }, + { TEST_BIG_01_OVERRIDE_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.symbols", + TEST_BIG_01_OVERRIDE_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.symbols" }, + { TEST_BIG_01_OVERRIDE_ROOTFS MODULE_DIRECTORY "/5.3.18/correct-modules.symbols.bin", + TEST_BIG_01_OVERRIDE_ROOTFS MODULE_DIRECTORY "/5.3.18/modules.symbols.bin" }, + { } + }, + }); + TESTSUITE_MAIN(); diff --git a/testsuite/test-incremental.sh b/testsuite/test-incremental.sh new file mode 100755 index 00000000..0b5c33c8 --- /dev/null +++ b/testsuite/test-incremental.sh @@ -0,0 +1,305 @@ +#! /bin/bash +export TIMEFORMAT="elapsed time: %2Rs (%2U user / %2S system)" +export LC_ALL=C + +set -e -E +trap 'echo $ME: error in $BASH_COMMAND >&2; exit 1' ERR + +CLEANUP=: +trap 'trap - ERR; eval "$CLEANUP"' 0 + +ME=${0##*/} +BASEDIR= +OUTPUTDIR= +KVER= +SYMVERS= +FILESYMS= +DEPMOD= +KEEP= +ERR=0 +: "${DEPMOD_OPTS:=}" + +usage() { + cat <&2 + return + } + kernel=${kernel%/*} + kernel=${kernel##*/} + echo "$ME: found kernel $kernel" >&2 + echo "$kernel" +} + +find_symvers() { + local symvers + + symvers=$(find_glob "$BASEDIR/boot/symvers-$1*") + [[ ! "$symvers" ]] || echo "$symvers" +} + +find_filesyms() { + local fsyms + + fsyms=$(find_glob "$BASEDIR/boot/System.map-$1*") + [[ ! "$fsyms" ]] || echo "$fsyms" +} + +[[ ! "$BASEDIR" ]] || BASEDIR=$(cd "$BASEDIR" && echo "$PWD") + +[[ "$DEPMOD" ]] || { + for _x in "${0%/*}/../depmod" "${0%/*}/../tools/depmod" \ + /usr/local/sbin/depmod /sbin/depmod /usr/sbin/depmod; do + [[ -f "$_x" && -x "$_x" ]] && { + DEPMOD=$_x + break + } + done +} + +[[ "$DEPMOD" && -f "$DEPMOD" && -x "$DEPMOD" ]] +echo "$ME: using DEPMOD=$DEPMOD" >&2 +if [[ "$OUTPUTDIR" ]]; then + [[ -d "$OUTPUTDIR" ]] || { + mkdir -p "$OUTPUTDIR" + # shellcheck disable=SC2016 + [[ "$KEEP" ]] || CLEANUP='rm -rf "$OUTPUTDIR";'"$CLEANUP" + } +else + OUTPUTDIR=$(mktemp -d "${TMPDIR:-/tmp}/$ME.XXXXXX") + [[ "$OUTPUTDIR" ]] + # shellcheck disable=SC2016 + [[ "$KEEP" ]] || CLEANUP='rm -rf "$OUTPUTDIR";'"$CLEANUP" +fi + +OUTPUTDIR=$(cd "$OUTPUTDIR" && echo "$PWD") + +[[ "$KVER" ]] || KVER=$(find_installed_kernel) +[[ "$KVER" && -d "$BASEDIR/lib/modules/$KVER" ]] + +[[ "$SYMVERS" ]] || SYMVERS=$(find_symvers "$KVER") +[[ "$FILESYMS" ]] || FILESYMS=$(find_filesyms "$KVER") + +[[ ("$SYMVERS" && -f "$SYMVERS") || ("$FILESYMS" && -f "$FILESYMS") ]] + +# depmod can't handle compressed symvers +case $SYMVERS in + *.gz) + gzip -dc "$SYMVERS" >"${TMPDIR:-/tmp}/symvers-$KVER" + SYMVERS="${TMPDIR:-/tmp}/symvers-$KVER" + # shellcheck disable=SC2016 + CLEANUP='rm -f "$SYMVERS";'"$CLEANUP" + ;; +esac + +[[ ! "$SYMVERS" ]] || FILESYMS= +echo "$ME: symbols resolved with ${SYMVERS:+-E "$SYMVERS"}${FILESYMS:+-F "$FILESYMS"}" >&2 + +[[ "${#MODULES[@]}" -gt 0 ]] || { + echo "$ME: reading modules from stdin ..." >&2 + mapfile -t MODULES < <(sed -E 's/\s+/\n/g') +} +[[ "${#MODULES[@]}" -gt 0 ]] + +find_module() { + local f + f=$(cd "$2" && find . -name "$1.ko*" -type f -print -quit) + echo "${f#./}" +} + +copy_results_to() { + rm -rf "${OUTPUTDIR:?}/$1" + mkdir -p "$OUTPUTDIR/$1" + cp -a "$WORKDIR/lib/modules/$KVER/modules".* "$OUTPUTDIR/$1" +} + +restore_results_from() { + cp -a "$OUTPUTDIR/$1/"* "$WORKDIR/lib/modules/$KVER/" +} + +delete_modules() { + pushd "$WORKDIR/lib/modules/$KVER" &>/dev/null + rm -f "${!EXTRAMODS[@]}" + popd &>/dev/null +} + +restore_deleted_modules() { + pushd "$CLONEDIR/lib/modules/$KVER" &>/dev/null + echo "${!EXTRAMODS[@]}" | sed -E 's/\s+/\n/g' | \ + cpio -p --link "$WORKDIR/lib/modules/$KVER" 2>/dev/null + popd &>/dev/null +} + +check_results_for() { + local ref + ref=${2:-reference} + if diff -ruq "$OUTPUTDIR/$ref" "$OUTPUTDIR/$1"; then + echo "$ME: $1: OK" >&2 + else + echo "$ME: depmod output for in $OUTPUTDIR/$1 differs from $OUTPUTDIR/$ref" >&2 + : $((ERR++)) + fi +} + +# MODPATHS holds the full module paths relative to the module directory, +# this is the same format as in modules.dep +# REGEX will be used to grep modules.dep for any of these paths occurring +# in the dependency list of some module (DEPENDS below). +MODPATHS=() +for x in "${!MODULES[@]}"; do + [[ "$x" ]] || continue + mp=$(find_module "${MODULES[$x]}" "$BASEDIR/lib/modules/$KVER") + if [[ "$mp" ]]; then + MODPATHS["$x"]=$mp + REGEX="$REGEX|${mp//./\\.}" + else + echo "$ME: module ${MODULES[$x]} not found" >&2 + fi +done +REGEX=${REGEX#|} + +# First, clone the module directory +CLONEDIR=$OUTPUTDIR/clone +[[ -f "$CLONEDIR/lib/modules/$KVER/modules.dep" ]] || { + rm -rf "$CLONEDIR/lib/modules" + mkdir -p "$CLONEDIR/lib/modules" + cp -r "$BASEDIR/lib/modules/$KVER" "$CLONEDIR/lib/modules" + + echo "$ME: running depmod over entire tree" + time "$DEPMOD" $DEPMOD_OPTS -b "$CLONEDIR" -e ${SYMVERS:+-E "$SYMVERS"} ${FILESYMS:+-F "$FILESYMS"} "$KVER" +} + +# With modules.dep in place, find all modules that depend on MODULES. +mapfile -t DEPENDS < <(sed -nE 's,:.*\<('"$REGEX"')\>.*$,,p' "$CLONEDIR/lib/modules/$KVER/modules.dep") + +# EXTRAMODS holds the paths for MODULES and all their dependencies +# use associative array to avoid duplicates +declare -A EXTRAMODS +for x in "${MODPATHS[@]}" "${DEPENDS[@]}"; do + EXTRAMODS["$x"]=1 +done + +# Copy clone work dir and save the depmod results in "reference" dir +WORKDIR=$OUTPUTDIR/work +rm -rf "$WORKDIR/lib/modules" +mkdir -p "$WORKDIR/lib/modules" +cp -rl "$CLONEDIR/lib/modules/$KVER" "$WORKDIR/lib/modules/$KVER" +copy_results_to reference + +# Delete EXTRAMODS, and run depmod again (pretend system state before adding EXTRAMODS) +# Save results in "orig" +delete_modules +echo "$ME: running full depmod after module removal" +time "$DEPMOD" $DEPMOD_OPTS -b "$WORKDIR" -e ${SYMVERS:+-E "$SYMVERS"} ${FILESYMS:+-F "$FILESYMS"} "$KVER" +copy_results_to orig + +# 1. Restore deleted modules, and run depmod --incremental +# Save results in "incremental", and compare to "reference" +restore_deleted_modules +echo "$ME: running depmod --incremental (${#EXTRAMODS[@]} modules added)" +time "$DEPMOD" $DEPMOD_OPTS -b "$WORKDIR" -I -e ${SYMVERS:+-E "$SYMVERS"} ${FILESYMS:+-F "$FILESYMS"} "$KVER" "${!EXTRAMODS[@]}" +copy_results_to incremental +check_results_for incremental + +# 2. Same thing, but with depmod --incremental --all +# Save results in "incremental-all", and compare to "reference" +restore_results_from orig +echo "$ME: running depmod --incremental --all" +time "$DEPMOD" $DEPMOD_OPTS -b "$WORKDIR" -I -a -e ${SYMVERS:+-E "$SYMVERS"} ${FILESYMS:+-F "$FILESYMS"} "$KVER" +copy_results_to incremental-all +check_results_for incremental-all + +# 3. Delete modules again, and test depmod --incremental --all for removal +# Save results in "deleted", and compare to "orig" +delete_modules +echo "$ME: running depmod --incremental --all after module removal" +# this will spit out lots of "module xyz not found" error messages +time "$DEPMOD" $DEPMOD_OPTS -b "$WORKDIR" -I -a -e ${SYMVERS:+-E "$SYMVERS"} ${FILESYMS:+-F "$FILESYMS"} "$KVER" 2>/dev/null +copy_results_to deleted +check_results_for deleted orig + +exit "$ERR" diff --git a/tools/depmod.c b/tools/depmod.c index 5f020f83..2b08fb0e 100644 --- a/tools/depmod.c +++ b/tools/depmod.c @@ -28,6 +28,7 @@ #include #include +#include #undef ERR #undef DBG @@ -50,10 +51,11 @@ static const char *const default_cfg_paths[] = { // clang-format on }; -static const char cmdopts_s[] = "aAb:m:o:C:E:F:evnP:wVh"; +static const char cmdopts_s[] = "aAIb:m:o:C:E:F:evnP:wxVh"; static const struct option cmdopts[] = { { "all", no_argument, 0, 'a' }, { "quick", no_argument, 0, 'A' }, + { "incremental", no_argument, 0, 'I' }, { "basedir", required_argument, 0, 'b' }, { "moduledir", required_argument, 0, 'm' }, { "outdir", required_argument, 0, 'o' }, @@ -66,6 +68,7 @@ static const struct option cmdopts[] = { { "dry-run", no_argument, 0, 'n' }, { "symbol-prefix", required_argument, 0, 'P' }, { "warn", no_argument, 0, 'w' }, + { "errexit", no_argument, 0, 'x' }, { "version", no_argument, 0, 'V' }, { "help", no_argument, 0, 'h' }, {}, @@ -83,12 +86,14 @@ static void help(void) "Options:\n" "\t-a, --all Probe all modules\n" "\t-A, --quick Only does the work if there's a new module\n" + "\t-I, --incremental Add modules from the command line\n" "\t-e, --errsyms Report not supplied symbols\n" "\t-n, --show Write the dependency file on stdout only\n" "\t-P, --symbol-prefix Architecture symbol prefix\n" "\t-C, --config PATH Read configuration from PATH\n" "\t-v, --verbose Enable verbose mode\n" "\t-w, --warn Warn on duplicates\n" + "\t-x, --errexit exit with error status if unresolved symbols are detected\n" "\t-V, --version show version\n" "\t-h, --help show this help\n" "\n" @@ -125,12 +130,6 @@ _printf_format_(1, 2) static inline void _show(const char *fmt, ...) #define INDEX_VERSION ((INDEX_VERSION_MAJOR << 16) | INDEX_VERSION_MINOR) #define INDEX_CHILDMAX 128u -struct index_value { - struct index_value *next; - unsigned int priority; - char value[0]; -}; - /* In-memory index (depmod only) */ struct index_node { char *prefix; /* path compression */ @@ -177,16 +176,6 @@ static struct index_node *index_create(void) return node; } -static void index_values_free(struct index_value *values) -{ - while (values) { - struct index_value *value = values; - - values = value->next; - free(value); - } -} - static void index_destroy(struct index_node *node) { int c; @@ -516,6 +505,7 @@ struct cfg { uint8_t check_symvers; uint8_t print_unknown; uint8_t warn_dups; + uint8_t incremental; struct cfg_override *overrides; struct cfg_search *searches; struct cfg_external *externals; @@ -958,6 +948,7 @@ struct mod { struct array softdep_values; struct array weakdep_values; struct array deps; /* struct symbol */ + struct array user; /* modules depending on this one */ size_t baselen; /* points to start of basename/filename */ size_t modnamesz; int sort_idx; /* sort index using modules.order */ @@ -982,6 +973,9 @@ struct depmod { struct hash *modules_by_uncrelpath; struct hash *modules_by_name; struct hash *symbols; + struct hash *broken; + bool undefined_symbols; + bool bad_crc; }; static void mod_free(struct mod *mod) @@ -991,6 +985,7 @@ static void mod_free(struct mod *mod) array_free_array(&mod->weakdep_values); array_free_array(&mod->softdep_values); array_free_array(&mod->alias_values); + array_free_array(&mod->user); kmod_module_unref(mod->kmod); kmod_module_info_free_list(mod->info_list); kmod_module_dependency_symbols_free_list(mod->dep_sym_list); @@ -1019,6 +1014,11 @@ static int mod_add_dependency(struct mod *mod, struct symbol *sym) } sym->owner->users++; + err = array_append_unique(&sym->owner->user, mod); + if (err < 0 && err != -EEXIST) + ERR("%s: failed to add %s as user of %s: %s\n", __func__, mod->modname, + sym->owner->modname, strerror(-err)); + SHOW("%s needs \"%s\": %s\n", mod->path, sym->name, sym->owner->path); return 0; } @@ -1059,8 +1059,16 @@ static int depmod_init(struct depmod *depmod, struct cfg *cfg, struct kmod_ctx * goto symbols_failed; } + depmod->broken = hash_new(256, NULL); + if (depmod->symbols == NULL) { + err = -errno; + goto broken_failed; + } + return 0; +broken_failed: + hash_free(depmod->symbols); symbols_failed: hash_free(depmod->modules_by_name); modules_by_name_failed: @@ -1073,6 +1081,8 @@ static void depmod_shutdown(struct depmod *depmod) { size_t i; + hash_free(depmod->broken); + hash_free(depmod->symbols); hash_free(depmod->modules_by_uncrelpath); @@ -1111,6 +1121,7 @@ static int depmod_module_add(struct depmod *depmod, struct kmod_module *kmod) array_init(&mod->weakdep_values, 4); // fits 100% array_init(&mod->deps, 4); + array_init(&mod->user, 4); mod->path = strdup(kmod_module_get_path(kmod)); if (mod->path == NULL) { @@ -1159,16 +1170,85 @@ static int depmod_module_add(struct depmod *depmod, struct kmod_module *kmod) return err; } +static void depmod_del_deps_of_module(struct mod *mod) +{ + size_t i, j; + + for (i = 0; i < mod->deps.count; i++) { + struct mod *dep = mod->deps.array[i]; + + for (j = 0; j < dep->user.count; j++) + if (dep->user.array[j] == mod) + break; + if (j < dep->user.count) { + INF("%s: removing %s as user from %s\n", __func__, mod->modname, + dep->modname); + array_remove_at(&dep->user, j); + dep->users--; + } + } + + for (i = 0; i < mod->user.count; i++) { + struct mod *user = mod->user.array[i]; + + for (j = 0; j < user->deps.count; j++) + if (user->deps.array[j] == mod) + break; + if (j < user->deps.count) { + INF("%s: removing %s as dep from %s\n", __func__, mod->modname, + user->modname); + array_remove_at(&user->deps, j); + } + } +} + +static void depmod_del_symbols_of_module(struct depmod *depmod, const struct mod *mod) +{ + struct array to_delete; + struct hash_iter iter; + const char *key; + const struct symbol *sym; + int err = 0; + size_t i; + + array_init(&to_delete, 8); + + hash_iter_init(depmod->symbols, &iter); + while (hash_iter_next(&iter, &key, (const void **)&sym)) { + int rc; + + if (mod != sym->owner) + continue; + rc = array_append(&to_delete, sym); + if (err == 0 && rc < 0) + err = rc; + } + if (err < 0) + ERR("%s: failed to mark some symbols for deletion\n", __func__); + + for (i = 0; i < to_delete.count; i++) { + sym = to_delete.array[i]; + DBG("%s: deleting symbol %s\n", __func__, sym->name); + if (hash_del(depmod->symbols, sym->name) < 0) + ERR("%s: failed to delete symbol %s\n", __func__, sym->name); + } + + array_free_array(&to_delete); +} + static int depmod_module_del(struct depmod *depmod, struct mod *mod) { DBG("del %p kmod=%p, path=%s\n", mod, mod->kmod, mod->path); + depmod_del_deps_of_module(mod); + depmod_del_symbols_of_module(depmod, mod); + if (mod->uncrelpath != NULL) hash_del(depmod->modules_by_uncrelpath, mod->uncrelpath); hash_del(depmod->modules_by_name, mod->modname); - mod_free(mod); + return 0; } @@ -1203,7 +1283,7 @@ static bool depmod_is_path_starts_with(const char *path, size_t pathlen, static int depmod_module_is_higher_priority(const struct depmod *depmod, const struct mod *mod, size_t baselen, size_t namelen, size_t modnamelen, - const char *newpath) + const char *newpath, bool replace_same_path) { const struct cfg *cfg = depmod->cfg; const struct cfg_override *ov; @@ -1224,6 +1304,9 @@ static int depmod_module_is_higher_priority(const struct depmod *depmod, DBG("comparing priorities of %s and %s\n", oldpath, newpath); + if (streq(oldpath, newpath)) + return replace_same_path ? 0 : 1; + if (strncmp(newpath, cfg->dirname, cfg->dirnamelen) == 0) { relnewpath = newpath + cfg->dirnamelen + 1; relnewlen = newlen - (cfg->dirnamelen + 1); @@ -1272,20 +1355,23 @@ static int depmod_module_is_higher_priority(const struct depmod *depmod, return newprio <= oldprio; } -static int depmod_modules_search_file(struct depmod *depmod, size_t baselen, - size_t namelen, const char *path) +enum { + DEPMOD_MUST_ADD, + DEPMOD_MUST_REPLACE, + DEPMOD_MUST_NOTHING, +}; + +static int depmod_must_replace(struct depmod *depmod, size_t baselen, size_t namelen, + const char *path, char *modname, size_t *modnamelen, + struct mod **oldmod, bool replace_same_path) { - struct kmod_module *kmod; - struct mod *mod; const char *relpath; - char modname[PATH_MAX]; - size_t modnamelen; - int err; + struct mod *mod; if (!path_ends_with_kmod_ext(path + baselen, namelen)) - return 0; + return DEPMOD_MUST_NOTHING; - if (path_to_modname(path, modname, &modnamelen) == NULL) { + if (path_to_modname(path, modname, modnamelen) == NULL) { ERR("could not get modname from path %s\n", path); return -EINVAL; } @@ -1295,15 +1381,38 @@ static int depmod_modules_search_file(struct depmod *depmod, size_t baselen, mod = hash_find(depmod->modules_by_name, modname); if (mod == NULL) - goto add; + return DEPMOD_MUST_ADD; - if (depmod_module_is_higher_priority(depmod, mod, baselen, namelen, modnamelen, - path)) { + if (depmod_module_is_higher_priority(depmod, mod, baselen, namelen, *modnamelen, + path, replace_same_path)) { DBG("Ignored lower priority: %s, higher: %s\n", path, mod->path); - return 0; + return DEPMOD_MUST_NOTHING; } DBG("Replace lower priority %s with new module %s\n", mod->relpath, relpath); + *oldmod = mod; + return DEPMOD_MUST_REPLACE; +} + +static int depmod_modules_search_file(struct depmod *depmod, size_t baselen, + size_t namelen, const char *path) +{ + struct kmod_module *kmod; + struct mod *mod; + char modname[PATH_MAX]; + size_t modnamelen; + int err; + + err = depmod_must_replace(depmod, baselen, namelen, path, modname, &modnamelen, + &mod, false); + + if (err == DEPMOD_MUST_NOTHING) + return 0; + if (err < 0) + return err; + if (err == DEPMOD_MUST_ADD) + goto add; + err = depmod_module_del(depmod, mod); if (err < 0) { ERR("could not del module %s: %s\n", mod->path, strerror(-err)); @@ -1598,64 +1707,72 @@ static struct symbol *depmod_symbol_find(const struct depmod *depmod, const char return hash_find(depmod->symbols, name); } -static int depmod_load_modules(struct depmod *depmod) +static int depmod_load_module(struct depmod *depmod, struct mod *mod) { - struct mod **itr, **itr_end; + struct kmod_list *l, *list = NULL; + int err = kmod_module_get_symbols(mod->kmod, &list); - DBG("load symbols (%zu modules)\n", depmod->modules.count); + if (err < 0) { + if (err == -ENODATA) + DBG("ignoring %s: no symbols\n", mod->path); + else + ERR("failed to load symbols from %s: %s\n", mod->path, + strerror(-err)); + goto load_info; + } - itr = (struct mod **)depmod->modules.array; - itr_end = itr + depmod->modules.count; - for (; itr < itr_end; itr++) { - struct mod *mod = *itr; - struct kmod_list *l, *list = NULL; - int err = kmod_module_get_symbols(mod->kmod, &list); - if (err < 0) { - if (err == -ENODATA) - DBG("ignoring %s: no symbols\n", mod->path); - else - ERR("failed to load symbols from %s: %s\n", mod->path, - strerror(-err)); - goto load_info; - } - kmod_list_foreach(l, list) { - const char *name = kmod_module_symbol_get_symbol(l); - uint64_t crc = kmod_module_symbol_get_crc(l); - depmod_symbol_add(depmod, name, false, crc, mod); - } - kmod_module_symbols_free_list(list); + kmod_list_foreach(l, list) { + const char *name = kmod_module_symbol_get_symbol(l); + uint64_t crc = kmod_module_symbol_get_crc(l); + + depmod_symbol_add(depmod, name, false, crc, mod); + } + kmod_module_symbols_free_list(list); load_info: - kmod_module_get_info(mod->kmod, &mod->info_list); - kmod_list_foreach(l, mod->info_list) { - const char *key = kmod_module_info_get_key(l); + kmod_module_get_info(mod->kmod, &mod->info_list); + kmod_list_foreach(l, mod->info_list) { + const char *key = kmod_module_info_get_key(l); - if (streq(key, "alias")) { - const char *value = kmod_module_info_get_value(l); + if (streq(key, "alias")) { + const char *value = kmod_module_info_get_value(l); - if (array_append(&mod->alias_values, value) < 0) - return 0; - continue; - } - if (streq(key, "softdep")) { - const char *value = kmod_module_info_get_value(l); + if (array_append(&mod->alias_values, value) < 0) + return 0; + continue; + } + if (streq(key, "softdep")) { + const char *value = kmod_module_info_get_value(l); - if (array_append(&mod->softdep_values, value) < 0) - return 0; - continue; - } - if (streq(key, "weakdep")) { - const char *value = kmod_module_info_get_value(l); + if (array_append(&mod->softdep_values, value) < 0) + return 0; + continue; + } + if (streq(key, "weakdep")) { + const char *value = kmod_module_info_get_value(l); - if (array_append(&mod->weakdep_values, value) < 0) - return 0; - continue; - } + if (array_append(&mod->weakdep_values, value) < 0) + return 0; + continue; } - kmod_module_get_dependency_symbols(mod->kmod, &mod->dep_sym_list); - kmod_module_unref(mod->kmod); - mod->kmod = NULL; } + kmod_module_get_dependency_symbols(mod->kmod, &mod->dep_sym_list); + kmod_module_unref(mod->kmod); + mod->kmod = NULL; + + return 0; +} + +static int depmod_load_modules(struct depmod *depmod) +{ + struct mod **itr, **itr_end; + + DBG("load symbols (%zu modules)\n", depmod->modules.count); + + itr = (struct mod **)depmod->modules.array; + itr_end = itr + depmod->modules.count; + for (; itr < itr_end; itr++) + depmod_load_module(depmod, *itr); DBG("loaded symbols (%zu modules, %u symbols)\n", depmod->modules.count, hash_get_count(depmod->symbols)); @@ -1681,6 +1798,7 @@ static int depmod_load_module_dependencies(struct depmod *depmod, struct mod *mo if (sym == NULL) { DBG("%s needs (%c) unknown symbol %s\n", mod->path, bindtype, name); + depmod->undefined_symbols = true; if (cfg->print_unknown && !is_weak) WRN("%s needs unknown symbol %s\n", mod->path, name); continue; @@ -1689,6 +1807,7 @@ static int depmod_load_module_dependencies(struct depmod *depmod, struct mod *mo if (cfg->check_symvers && sym->crc != crc && !is_weak) { DBG("symbol %s (%#" PRIx64 ") module %s (%#" PRIx64 ")\n", sym->name, sym->crc, mod->path, crc); + depmod->bad_crc = true; if (cfg->print_unknown) WRN("%s disagrees about version of symbol %s\n", mod->path, name); @@ -1736,7 +1855,12 @@ static int dep_cmp(const void *pa, const void *pb) { const struct mod *a = *(const struct mod **)pa; const struct mod *b = *(const struct mod **)pb; - return a->dep_sort_idx - b->dep_sort_idx; + int cmp = a->dep_sort_idx - b->dep_sort_idx; + + if (cmp != 0) + return cmp; + + return strcmp(a->modname, b->modname); } static void depmod_sort_dependencies(struct depmod *depmod) @@ -1990,20 +2114,23 @@ static void depmod_report_cycles(struct depmod *depmod, uint16_t n_mods, uint16_ static int depmod_calculate_dependencies(struct depmod *depmod) { const struct mod **itrm; - uint16_t *users, *roots, *sorted; - uint16_t i, n_roots = 0, n_sorted = 0, n_mods = depmod->modules.count; + uint16_t *users, *roots, *rank; + uint16_t i, n_roots = 0, n_mods = depmod->modules.count; + uint16_t i_roots; int ret = 0; - users = malloc(sizeof(uint16_t) * n_mods * 3); + users = malloc(sizeof(uint16_t) * n_mods * 4); if (users == NULL) return -ENOMEM; roots = users + n_mods; - sorted = roots + n_mods; + rank = roots + n_mods; DBG("calculate dependencies and ordering (%hu modules)\n", n_mods); assert(depmod->modules.count < UINT16_MAX); + memset(rank, 0, sizeof(*rank) * n_mods); + /* populate modules users (how many modules uses it) */ itrm = (const struct mod **)depmod->modules.array; for (i = 0; i < n_mods; i++, itrm++) { @@ -2011,20 +2138,19 @@ static int depmod_calculate_dependencies(struct depmod *depmod) users[i] = m->users; if (users[i] == 0) { roots[n_roots] = i; + rank[n_roots] = 1; n_roots++; } } /* topological sort (outputs modules without users first) */ - while (n_roots > 0) { + for (i_roots = 0; i_roots < n_roots; i_roots++) { const struct mod **itr_dst, **itr_dst_end; struct mod *src; - uint16_t src_idx = roots[--n_roots]; + uint16_t src_idx = roots[i_roots]; src = depmod->modules.array[src_idx]; - src->dep_sort_idx = n_sorted; - sorted[n_sorted] = src_idx; - n_sorted++; + src->dep_sort_idx = rank[i_roots]; if (src->deps.count == 0) continue; @@ -2038,12 +2164,13 @@ static int depmod_calculate_dependencies(struct depmod *depmod) users[dst_idx]--; if (users[dst_idx] == 0) { roots[n_roots] = dst_idx; + rank[n_roots] = rank[i_roots] + 1; n_roots++; } } } - if (n_sorted < n_mods) { + if (n_roots < n_mods) { depmod_report_cycles(depmod, n_mods, users); ret = -EINVAL; goto exit; @@ -2352,6 +2479,7 @@ static int output_symbols_bin(struct depmod *depmod, FILE *out) while (hash_iter_next(&iter, NULL, &v)) { int duplicate; const struct symbol *sym = v; + char crcbuf[17]; if (sym->owner == NULL) continue; @@ -2369,6 +2497,9 @@ static int output_symbols_bin(struct depmod *depmod, FILE *out) if (duplicate && depmod->cfg->warn_dups) WRN("duplicate module syms:\n%s %s\n", strbuf_str(&salias), sym->owner->modname); + + snprintf(crcbuf, sizeof(crcbuf), "%08" PRIx64, sym->crc); + index_insert(idx, strbuf_str(&salias), crcbuf, UINT_MAX); } index_write(idx, out); @@ -2569,18 +2700,19 @@ static int depmod_output(struct depmod *depmod, FILE *out) static const struct depfile { const char *name; int (*cb)(struct depmod *depmod, FILE *out); + bool skip_if_incremental; } *itr, depfiles[] = { - { "modules.dep", output_deps }, - { "modules.dep.bin", output_deps_bin }, - { "modules.alias", output_aliases }, - { "modules.alias.bin", output_aliases_bin }, - { "modules.softdep", output_softdeps }, - { "modules.weakdep", output_weakdeps }, - { "modules.symbols", output_symbols }, - { "modules.symbols.bin", output_symbols_bin }, - { "modules.builtin.bin", output_builtin_bin }, - { "modules.builtin.alias.bin", output_builtin_alias_bin }, - { "modules.devname", output_devname }, + { "modules.dep", output_deps, false }, + { "modules.dep.bin", output_deps_bin, false }, + { "modules.alias", output_aliases, false }, + { "modules.alias.bin", output_aliases_bin, false }, + { "modules.softdep", output_softdeps, false }, + { "modules.weakdep", output_weakdeps, false }, + { "modules.symbols", output_symbols, false }, + { "modules.symbols.bin", output_symbols_bin, false }, + { "modules.builtin.bin", output_builtin_bin, true }, + { "modules.builtin.alias.bin", output_builtin_alias_bin, true }, + { "modules.devname", output_devname, false }, {}, }; const char *dname = depmod->cfg->outdirname; @@ -2610,6 +2742,9 @@ static int depmod_output(struct depmod *depmod, FILE *out) struct tmpfile file; int r, ferr; + if (depmod->cfg->incremental && itr->skip_if_incremental) + continue; + if (fp == NULL) { mode_t mode = 0644; @@ -2654,6 +2789,666 @@ static int depmod_output(struct depmod *depmod, FILE *out) return err; } +static struct index_mm *read_index_mm_bin(const char *name, const struct depmod *depmod) +{ + struct index_mm *index; + unsigned long long dummy; + char fn[PATH_MAX]; + + if (snprintf(fn, PATH_MAX, "%s/%s.bin", depmod->cfg->dirname, name) >= PATH_MAX) + return NULL; + + if (index_mm_open(depmod->ctx, fn, &dummy, &index) != 0) + return NULL; + + return index; +} + +static char *module_abspath(const char *str, size_t plen, const struct depmod *depmod) +{ + char *path; + size_t len; + + if (str[0] == '/') + return strndup(str, plen); + + len = strlen(depmod->cfg->dirname); + path = malloc(len + plen + 2); + if (!path) + return NULL; + + memcpy(path, depmod->cfg->dirname, len); + path[len] = '/'; + memcpy(path + len + 1, str, plen); + path[len + plen + 1] = '\0'; + + return path; +} + +static void add_module_from_deps(const char *name, const char *deps, unsigned int len, + unsigned int prio, void *arg) +{ + struct depmod *depmod = arg; + const char *colon = strchr(deps, ':'); + char *path; + struct kmod_module *kmod; + int rc; + + if (!colon) { + WRN("%s: unexpected value \"%s\"\n", __func__, deps); + return; + } + + path = module_abspath(deps, colon - deps, depmod); + rc = kmod_module_new_from_path(depmod->ctx, path, &kmod); + if (rc == -ENOENT) { + INF("%s: module %s (%s) was removed\n", __func__, name, path); + goto out_free_path; + } else if (rc < 0) { + ERR("%s: failed to create module %s: %s\n", __func__, path, strerror(-rc)); + goto out_free_path; + } + assert(streq(kmod_module_get_name(kmod), name)); + + rc = depmod_module_add(depmod, kmod); + if (rc < 0) { + ERR("%s: could not add module %s: %s\n", __func__, path, strerror(-rc)); + kmod_module_unref(kmod); + } + + DBG("%s: added %s as %s\n", __func__, name, kmod_module_get_path(kmod)); + +out_free_path: + free(path); +} + +static void add_module_deps_from_deps(const char *name, const char *deps, + unsigned int len, unsigned int prio, void *arg) +{ + struct depmod *depmod = arg; + const char *dps = strchr(deps, ':'); + char *tmp, *tok, *ptr = NULL; + struct mod *mod; + + if (!dps) { + WRN("%s: unexpected value \"%s\"\n", __func__, deps); + return; + } + + mod = hash_find(depmod->modules_by_name, name); + if (!mod) { + INF("%s: failed to find %s\n", __func__, name); + return; + } + + dps++; + while (*dps == ' ') + dps++; + if (*dps == '\0') { + DBG("%s: %s has no dependencies\n", __func__, name); + return; + } + + tmp = strdup(dps); + if (!tmp) + return; + + for (tok = strtok_r(tmp, " ", &ptr); tok; tok = strtok_r(NULL, " \t", &ptr)) { + struct mod *dmod; + char *p; + int err; + + p = strrchr(tok, '/'); + if (!p) + p = tok; + p = strstr(p, KMOD_EXTENSION_UNCOMPRESSED); + if (!p) { + ERR("%s: invalid path %s\n", __func__, tok); + continue; + } + p[strlen(KMOD_EXTENSION_UNCOMPRESSED)] = '\0'; + + dmod = hash_find(depmod->modules_by_uncrelpath, tok); + if (!dmod) { + WRN("%s: dependency %s not found for %s\n", __func__, tok, + mod->modname); + hash_add_unique(depmod->broken, mod->modname, mod); + goto out; + } + + err = array_append_unique(&mod->deps, dmod); + if (err < 0 && err != -EEXIST) { + ERR("%s: failed to add dep %s->%s (%s)\n", __func__, mod->modname, + tok, strerror(-err)); + continue; + } + dmod->users++; + err = array_append_unique(&dmod->user, mod); + if (err < 0) + ERR("%s: failed to add %s as user of %s: %s\n", __func__, + mod->modname, dmod->modname, strerror(-err)); + DBG("%s: %s depends on \"%s\"\n", __func__, mod->modname, tok); + } +out: + free(tmp); +} + +static void add_symbol_cb(const char *key, const char *val, unsigned int len, + unsigned int prio, void *arg) +{ + struct depmod *depmod = arg; + static const char _symbol[] = "symbol:"; + struct mod *mod; + struct symbol *sym, *old; + size_t namelen; + int err; + + if (strncmp(key, _symbol, sizeof(_symbol) - 1)) { + ERR("%s: unexpected key %s\n", __func__, key); + return; + } + key += sizeof(_symbol) - 1; + namelen = strlen(key) + 1; + + if (prio == UINT_MAX) { + /* CRC value */ + uint64_t crc; + char *ep; + + old = hash_find(depmod->symbols, key); + if (old == NULL) { + INF("%s: symbol \"%s\" not found\n", __func__, key); + return; + } + crc = strtoull(val, &ep, 16); + if (*val == '\0' || *ep != '\0') { + ERR("%s: invalid crc \"%s\"\n", __func__, val); + return; + } + if (old->crc && old->crc != crc) + WRN("%s: crc mismatch for %s: %" PRIx64 " != %" PRIx64 "\n", + __func__, key, old->crc, crc); + old->crc = crc; + + DBG("%s: %s has crc %" PRIx64 "\n", __func__, key, crc); + return; + } + + mod = hash_find(depmod->modules_by_name, val); + if (!mod) { + INF("%s: module %s not found\n", __func__, val); + err = hash_del(depmod->symbols, key); + if (err < 0 && err != -ENOENT) + ERR("%s: failed to delete %s: %s\n", __func__, key, + strerror(-err)); + return; + } + + sym = calloc(1, sizeof(struct symbol) + namelen); + if (!sym) + return; + + sym->owner = mod; + memcpy(sym->name, key, namelen); + + old = hash_find(depmod->symbols, sym->name); + if (old && old->owner) { + ERR("%s: symbol %s (->%s) already present, owner %s\n", __func__, + sym->name, mod->path, old->owner->path); + free(sym); + } else if (old) { + DBG("%s: setting owner of %s(%" PRIx64 ") to %s\n", __func__, sym->name, + sym->crc, mod->path); + old->owner = mod; + free(sym); + } else { + err = hash_add(depmod->symbols, sym->name, sym); + if (err < 0) { + ERR("%s: failed to add symbol \"%s\"\n", __func__, key); + free(sym); + return; + } + DBG("add %p sym=%s, crc=%" PRIx64 ", owner=%p %s\n", sym, sym->name, + sym->crc, mod->modname, mod->path); + } +} + +static void add_alias_cb(const char *key, const char *val, void *arg) +{ + struct depmod *depmod = arg; + struct mod *mod; + static const char __alias[] = "alias"; + struct kmod_list *kl; + + mod = hash_find(depmod->modules_by_name, val); + if (mod == NULL) { + ERR("%s: module %s not found\n", __func__, val); + return; + } + + if ((kl = kmod_module_info_append(&mod->info_list, __alias, sizeof(__alias) - 1, + key, strlen(key))) == 0) + ERR("%s: failed to add alias \"%s\" to \"%s\"\n", __func__, key, val); + else { + const char *ali = kmod_module_info_get_value(kmod_list_last(kl)); + + if (array_append(&mod->alias_values, ali) < 0) + ERR("%s: failed to add alias \"%s\" to \"%s\" to array\n", + __func__, ali, val); + else + DBG("%s: %s: alias[%zu] => \"%s\"\n", __func__, val, + mod->alias_values.count - 1, ali); + } +} + +static int read_aliases(struct depmod *depmod) +{ + char line[10240]; + char *fn; + FILE *fp; + int rc = -EINVAL; + + rc = asprintf(&fn, "%s/modules.alias", depmod->cfg->dirname); + if (rc == -1) + return -ENOMEM; + + fp = fopen(fn, "r"); + if (fp == NULL) { + rc = -errno; + ERR("%s: failed to open %s: %s\n", __func__, fn, strerror(errno)); + free(fn); + return rc; + } + + INF("%s: loading %s\n", __func__, fn); + free(fn); + while (fgets(line, sizeof(line), fp) != NULL) { + static const char __alias[] = "alias "; + char *p, *key, *val; + + if (line[0] == '\0' || line[0] == '\n' || line[0] == '#') + continue; + + p = strchr(line, '\n'); + if (p != NULL) + *p = '\0'; + if (p == NULL || strncmp(line, __alias, sizeof(__alias) - 1)) { + WRN("%s: invalid line \"%s\"\n", __func__, line); + goto out_close; + } + + key = line + sizeof(__alias) - 1; + val = strrchr(key, ' '); + assert(val != NULL && val > key); + *val++ = '\0'; + add_alias_cb(key, val, depmod); + } + rc = 0; +out_close: + fclose(fp); + return rc; +} + +static int read_softdeps(struct depmod *depmod) +{ + char line[10240]; + char *fn; + FILE *fp; + int rc = -EINVAL; + + rc = asprintf(&fn, "%s/modules.softdep", depmod->cfg->dirname); + if (rc == -1) + return -ENOMEM; + + fp = fopen(fn, "r"); + if (fp == NULL) { + rc = -errno; + ERR("%s: failed to open %s: %s\n", __func__, fn, strerror(errno)); + free(fn); + return rc; + } + + INF("%s: loading %s\n", __func__, fn); + free(fn); + + while (fgets(line, sizeof(line), fp) != NULL) { + static const char __softdep[] = "softdep"; + char *p, *key, *val; + struct mod *mod; + struct kmod_list *kl; + + if (line[0] == '\0' || line[0] == '\n' || line[0] == '#') + continue; + + p = strchr(line, '\n'); + if (p != NULL) + *p = '\0'; + if (p == NULL || strncmp(line, __softdep, sizeof(__softdep) - 1) || + (line[sizeof(__softdep) - 1] != ' ')) { + WRN("%s: invalid line \"%s\"\n", __func__, line); + goto out_close; + } + + key = line + sizeof(__softdep); + while (*key == ' ' || *key == '\t') + key++; + + val = strpbrk(key, " \t"); + if (val == NULL) { + WRN("%s: no softdep\n", __func__); + goto out_close; + } + *val++ = '\0'; + while (*val == ' ' || *val == '\t') + val++; + + mod = hash_find(depmod->modules_by_name, key); + if (mod == NULL) { + ERR("%s: module %s not found\n", __func__, key); + continue; + } + + if ((kl = kmod_module_info_append(&mod->info_list, __softdep, + sizeof(__softdep) - 1, val, + strlen(val))) == 0) + ERR("%s: failed to add softdep \"%s\" => \"%s\"\n", __func__, key, + val); + else { + const char *softdep = + kmod_module_info_get_value(kmod_list_last(kl)); + + if (array_append(&mod->softdep_values, softdep) < 0) + ERR("%s: failed to add softdep \"%s\" to \"%s\" to array\n", + __func__, softdep, val); + else + DBG("%s: %s: softdep[%zu] => \"%s\"\n", __func__, val, + mod->softdep_values.count - 1, softdep); + } + } + rc = 0; +out_close: + fclose(fp); + return rc; +} + +static int depmod_modules_read_mm(struct depmod *depmod) +{ + struct index_mm *deps, *symbols; + + deps = read_index_mm_bin("modules.dep", depmod); + if (deps == NULL) + WRN("failed to read modules.dep.bin\n"); + else { + index_mm_walk(deps, false, add_module_from_deps, depmod); + index_mm_walk(deps, false, add_module_deps_from_deps, depmod); + index_mm_close(deps); + } + + symbols = read_index_mm_bin("modules.symbols", depmod); + if (symbols == NULL) + WRN("failed to read modules.symbols.bin\n"); + else { + index_mm_walk(symbols, false, add_symbol_cb, depmod); + index_mm_close(symbols); + } + + read_aliases(depmod); + read_softdeps(depmod); + + return 0; +} + +/* + * Check if a module to be added replaces an existing one. + * If yes, add the dependent modules to the must_check list. + */ +static int depmod_check_incremental(struct depmod *depmod, const char *path, + struct hash *must_check) +{ + int rc, err; + char *abspath, *p; + size_t baselen, namelen, modnamelen, i; + char modname[PATH_MAX]; + struct mod *oldmod; + + abspath = module_abspath(path, strlen(path), depmod); + + /* strrchr can't return 0 here */ + p = strrchr(abspath, '/') + 1; + baselen = p - abspath; + namelen = strlen(p); + + rc = depmod_must_replace(depmod, baselen, namelen, abspath, modname, &modnamelen, + &oldmod, true); + free(abspath); + + if (rc < 0) { + ERR("%s: error in depmod_must_replace: %s", __func__, strerror(-rc)); + return rc; + } else if (rc != DEPMOD_MUST_REPLACE) + return rc; + + assert(oldmod != NULL); + INF("%s: %s will be replaced\n", __func__, modname); + for (i = 0; i < oldmod->user.count; i++) { + struct mod *user = oldmod->user.array[i]; + + err = hash_add(must_check, user->modname, user); + if (err < 0) + ERR("%s: error adding %s to must_check list\n", __func__, + user->modname); + else + INF("%s: added %s to check list\n", __func__, user->modname); + } + /* + * A previous dep check may have added oldmod to the must_check + * list. Remove it there, too. If any module is replaced later + * on on which oldmod would depend, this dependency won't be + * found any more because we purge it here. + */ + hash_del(must_check, oldmod->modname); + err = depmod_module_del(depmod, oldmod); + + return rc; +} + +static int depmod_incremental_add_user(struct depmod *depmod, struct mod *mod) +{ + int err; + struct kmod_module *kmod; + + err = kmod_module_new_from_path(depmod->ctx, mod->path, &kmod); + if (err < 0) { + ERR("%s: failed to create kmod_module for %s\n", __func__, mod->modname); + return err; + } + + err = kmod_module_get_dependency_symbols(kmod, &mod->dep_sym_list); + if (err < 0) + ERR("%s: failed to get dependency symbols\n", __func__); + + kmod_module_unref(kmod); + + err = depmod_load_module_dependencies(depmod, mod); + if (err < 0) + ERR("%s: failed to check dependencies for %s\n", __func__, mod->modname); + + return err; +} + +static int depmod_incremental_add_arg(struct depmod *depmod, const char *path, + struct hash *new_mods) +{ + char *abspath; + int err; + struct kmod_module *kmod; + struct mod *mod; + + abspath = module_abspath(path, strlen(path), depmod); + err = kmod_module_new_from_path(depmod->ctx, abspath, &kmod); + free(abspath); + if (err < 0) { + ERR("%s: failed to create kmod_module for %s\n", __func__, path); + return err; + } + + err = depmod_module_add(depmod, kmod); + if (err < 0) { + ERR("%s: failed to add %s: %s\n", __func__, path, strerror(-err)); + kmod_module_unref(kmod); + return err; + } + + mod = hash_find(depmod->modules_by_name, kmod_module_get_name(kmod)); + assert(mod != NULL && mod->kmod == kmod); + + err = depmod_load_module(depmod, mod); + if (err < 0) + ERR("%s: failed to load %s\n", __func__, path); + else { + INF("%s: loaded %s\n", __func__, path); + hash_add(new_mods, mod->modname, mod); + } + + return err; +} + +static int depmod_incremental(struct depmod *depmod, bool all, int argc, + char *const argv[]) +{ + struct hash *must_check, *new_mods; + int err; + struct hash_iter iter; + struct mod *mod; + int i; + + /* + * Read current modules.dep.bin and modules.symbols.bin to + * build current dependency tree. This replaces the depmod_load() + * call which is used in the non-incremental code path. + */ + err = depmod_modules_read_mm(depmod); + if (err < 0) { + CRIT("could not read modules: %s\n", strerror(-err)); + return err; + } + + must_check = hash_new(32, NULL); + new_mods = hash_new(32, NULL); + if (must_check == NULL || new_mods == NULL) { + err = -ENOMEM; + goto out; + } + + if (all) { + const char *name; + + /* + * Check modules that might be broken because their dependencies + * were deleted from the file system. They have been added to + * depmod->broken in the depmod_modules_read_mm() call above. + * They aren't necessarily actually broken, because they may have + * been replaced - reread them to check. + */ + hash_iter_init(depmod->broken, &iter); + while (hash_iter_next(&iter, &name, (const void **)&mod)) { + INF("%s: %s has broken dependencies, re-loading\n", __func__, + name); + err = depmod_incremental_add_user(depmod, mod); + if (err < 0) + ERR("%s: failed to add dependencies for %s\n", __func__, + mod->modname); + } + + /* + * Mark all modules as "visited" that we've seen so far, + * search the file system for new modules, and scan all modules + * that don't have the "visited" flag set. + */ + hash_iter_init(depmod->modules_by_name, &iter); + while (hash_iter_next(&iter, NULL, (const void **)&mod)) + mod->visited = true; + + err = depmod_modules_search(depmod); + if (err) { + CRIT("failed to search modules: %s\n", strerror(-err)); + goto out; + } + + hash_iter_init(depmod->modules_by_name, &iter); + while (hash_iter_next(&iter, NULL, (const void **)&mod)) { + if (!mod->visited) { + INF("load symbols for %s\n", mod->modname); + err = depmod_load_module(depmod, mod); + if (err < 0) + ERR("%s: failed to load %s\n", __func__, + mod->modname); + else { + INF("%s: loaded %s\n", __func__, mod->modname); + hash_add(new_mods, mod->modname, mod); + } + } else + mod->visited = false; + } + } + + /* + * Scan modules given on the command line. These may be outside the + * search directory, thus we need to do this even if -A was passed. + */ + for (i = 0; i < argc; i++) { + /* + * Figure out what to do. If a module by the same name already exists, + * we must either do nothing or replace the existing module and re-check + * other modules that depend on it. Otherwise, the module must be added. + */ + err = depmod_check_incremental(depmod, argv[i], must_check); + if (err < 0) { + CRIT("could not add module %s: %s\n", argv[i], strerror(-err)); + goto out; + } + if (err != DEPMOD_MUST_NOTHING) + err = depmod_incremental_add_arg(depmod, argv[i], new_mods); + } + + /* Double-check modules that depend on modules to be replaced */ + hash_iter_init(must_check, &iter); + while (hash_iter_next(&iter, NULL, (const void **)&mod)) { + err = depmod_incremental_add_user(depmod, mod); + if (err < 0) + goto out; + } + + /* Scan added modules for dependencies */ + hash_iter_init(new_mods, &iter); + while (hash_iter_next(&iter, NULL, (const void **)&mod)) { + err = depmod_load_module_dependencies(depmod, mod); + if (err < 0) + ERR("%s: failed to check dependencies for %s\n", __func__, + mod->modname); + } + + /* + * We have gathered information from the index and have taken care + * of added, deleted, and replaced modules and their dependencies. + * The remaining steps are similar to the non-incremental case. + */ + err = depmod_modules_build_array(depmod); + if (err < 0) { + CRIT("could not build module array: %s\n", strerror(-err)); + goto out; + } + depmod_modules_sort(depmod); + if (depmod_calculate_dependencies(depmod) < 0) + ERR("%s: error in depmod_calculate_dependencies()\n", __func__); +out: + if (must_check != NULL) + hash_free(must_check); + if (new_mods != NULL) + hash_free(new_mods); + return err; +} + static void depmod_add_fake_syms(struct depmod *depmod) { /* __this_module is magically inserted by kernel loader. */ @@ -2902,6 +3697,8 @@ static int do_depmod(int argc, char *argv[]) struct kmod_ctx *ctx = NULL; struct cfg cfg; struct depmod depmod; + bool errexit = false; + bool success; memset(&cfg, 0, sizeof(cfg)); memset(&depmod, 0, sizeof(depmod)); @@ -2918,6 +3715,9 @@ static int do_depmod(int argc, char *argv[]) case 'A': maybe_all = 1; break; + case 'I': + cfg.incremental = 1; + break; case 'b': free(root_arg); root_arg = path_make_absolute_cwd(optarg); @@ -2978,6 +3778,9 @@ static int do_depmod(int argc, char *argv[]) case 'w': cfg.warn_dups = 1; break; + case 'x': + errexit = true; + break; case 'h': help(); return EXIT_SUCCESS; @@ -3071,7 +3874,18 @@ static int do_depmod(int argc, char *argv[]) cfg.print_unknown = 0; } - if (all) { + if (cfg.incremental) { + err = cfg_load(&cfg, config_paths); + if (err < 0) { + CRIT("could not load configuration files\n"); + goto cmdline_modules_failed; + } + err = depmod_incremental(&depmod, all, argc - optind, &argv[optind]); + if (err) + goto cmdline_modules_failed; + else + goto output; + } else if (all) { err = cfg_load(&cfg, config_paths); if (err < 0) { CRIT("could not load configuration files\n"); @@ -3122,12 +3936,14 @@ static int do_depmod(int argc, char *argv[]) if (err < 0) goto cmdline_modules_failed; +output: err = depmod_output(&depmod, out); done: + success = err >= 0 && !(errexit && (depmod.undefined_symbols || depmod.bad_crc)); depmod_shutdown(&depmod); cfg_free(&cfg); - return err >= 0 ? EXIT_SUCCESS : EXIT_FAILURE; + return success ? EXIT_SUCCESS : EXIT_FAILURE; cmdline_modules_failed: depmod_shutdown(&depmod);