modpost: respect the previous export when 'exported twice' is warned
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Thu, 14 Nov 2019 17:42:26 +0000 (02:42 +0900)
committerMasahiro Yamada <yamada.masahiro@socionext.com>
Sat, 23 Nov 2019 06:46:42 +0000 (15:46 +0900)
When 'exported twice' is warned, let sym_add_exported() return without
updating the symbol info. This respects the previous export, which is
ordered first in modules.order

This simplifies the code too.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
scripts/mod/modpost.c

index 2fa58fb..6e892c9 100644 (file)
@@ -211,13 +211,11 @@ static struct symbol *new_symbol(const char *name, struct module *module,
                                 enum export export)
 {
        unsigned int hash;
-       struct symbol *new;
 
        hash = tdb_hash(name) % SYMBOL_HASH_SIZE;
-       new = symbolhash[hash] = alloc_symbol(name, 0, symbolhash[hash]);
-       new->module = module;
-       new->export = export;
-       return new;
+       symbolhash[hash] = alloc_symbol(name, 0, symbolhash[hash]);
+
+       return symbolhash[hash];
 }
 
 static struct symbol *find_symbol(const char *name)
@@ -392,17 +390,15 @@ static struct symbol *sym_add_exported(const char *name, struct module *mod,
 
        if (!s) {
                s = new_symbol(name, mod, export);
-       } else {
-               if (!external_module || is_vmlinux(s->module->name) ||
-                   s->module == mod) {
-                       warn("%s: '%s' exported twice. Previous export was in %s%s\n",
-                            mod->name, name, s->module->name,
-                            is_vmlinux(s->module->name) ? "" : ".ko");
-               } else {
-                       /* In case Module.symvers was out of date */
-                       s->module = mod;
-               }
+       } else if (!external_module || is_vmlinux(s->module->name) ||
+                  s->module == mod) {
+               warn("%s: '%s' exported twice. Previous export was in %s%s\n",
+                    mod->name, name, s->module->name,
+                    is_vmlinux(s->module->name) ? "" : ".ko");
+               return s;
        }
+
+       s->module = mod;
        s->vmlinux   = is_vmlinux(mod->name);
        s->kernel    = 0;
        s->export    = export;