Split the find_symbol_in_section() in two: the first one (that is compare_symbol_in_section()) for compare values during the search and the second one (that is found_symbol_in_section()) executed when values will be found. Rename each_symbol() in search_symbol() to let its' users notice the change. This work was supported by a hardware donation from the CE Linux Forum. Signed-off-by: Alessio Igor Bogani <abogani@xxxxxxxxxx> --- include/linux/module.h | 3 ++- kernel/module.c | 29 ++++++++++++++++++----------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/include/linux/module.h b/include/linux/module.h index 5de4204..b62f0a2 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -475,7 +475,8 @@ const struct kernel_symbol *find_symbol(const char *name, bool warn); /* Walk the exported symbol table */ -bool each_symbol(bool (*fn)(const struct symsearch *arr, struct module *owner, +bool search_symbol(int (*cmp) (const void *va, const void *vb), + bool (*fn)(const struct symsearch *arr, struct module *owner, unsigned int symnum, void *data), void *data); /* Returns 0 and fills in value, defined and namebuf, or -ERANGE if diff --git a/kernel/module.c b/kernel/module.c index d5938a5..8845a0b 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -238,6 +238,7 @@ extern const unsigned long __start___kcrctab_unused_gpl[]; static bool each_symbol_in_section(const struct symsearch *arr, unsigned int arrsize, struct module *owner, + int (*cmp) (const void *va, const void *vb), bool (*fn)(const struct symsearch *syms, struct module *owner, unsigned int symnum, void *data), @@ -247,15 +248,16 @@ static bool each_symbol_in_section(const struct symsearch *arr, for (j = 0; j < arrsize; j++) { for (i = 0; i < arr[j].stop - arr[j].start; i++) - if (fn(&arr[j], owner, i, data)) - return true; + if (cmp(data, &arr[j].start[i]) == 0) + return fn(&arr[j], owner, i, data); } return false; } /* Returns true as soon as fn returns true, otherwise false. */ -bool each_symbol(bool (*fn)(const struct symsearch *arr, struct module *owner, +bool search_symbol(int (*cmp) (const void *va, const void *data), + bool (*fn)(const struct symsearch *arr, struct module *owner, unsigned int symnum, void *data), void *data) { struct module *mod; @@ -278,7 +280,7 @@ bool each_symbol(bool (*fn)(const struct symsearch *arr, struct module *owner, #endif }; - if (each_symbol_in_section(arr, ARRAY_SIZE(arr), NULL, fn, data)) + if (each_symbol_in_section(arr, ARRAY_SIZE(arr), NULL, cmp, fn, data)) return true; list_for_each_entry_rcu(mod, &modules, list) { @@ -304,12 +306,12 @@ bool each_symbol(bool (*fn)(const struct symsearch *arr, struct module *owner, #endif }; - if (each_symbol_in_section(arr, ARRAY_SIZE(arr), mod, fn, data)) + if (each_symbol_in_section(arr, ARRAY_SIZE(arr), mod, cmp, fn, data)) return true; } return false; } -EXPORT_SYMBOL_GPL(each_symbol); +EXPORT_SYMBOL_GPL(search_symbol); struct find_symbol_arg { /* Input */ @@ -323,15 +325,20 @@ struct find_symbol_arg { const struct kernel_symbol *sym; }; -static bool find_symbol_in_section(const struct symsearch *syms, +static int compare_symbol_in_section(const void *va, const void *vb) +{ + const struct find_symbol_arg *a; + const struct kernel_symbol *b; + a = va; b = vb; + return strcmp(a->name, b->name); +} + +static bool found_symbol_in_section(const struct symsearch *syms, struct module *owner, unsigned int symnum, void *data) { struct find_symbol_arg *fsa = data; - if (strcmp(syms->start[symnum].name, fsa->name) != 0) - return false; - if (!fsa->gplok) { if (syms->licence == GPL_ONLY) return false; @@ -379,7 +386,7 @@ const struct kernel_symbol *find_symbol(const char *name, fsa.gplok = gplok; fsa.warn = warn; - if (each_symbol(find_symbol_in_section, &fsa)) { + if (search_symbol(compare_symbol_in_section, found_symbol_in_section, &fsa)) { if (owner) *owner = fsa.owner; if (crc) -- 1.7.0.4 -- To unsubscribe from this list: send the line "unsubscribe linux-embedded" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html