lkml.org 
[lkml]   [2011]   [Apr]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/4] module: Split the find_symbol_in_section function
    Date
    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@kernel.org>
    ---
    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


    \
     
     \ /
      Last update: 2011-04-15 17:27    [W:0.022 / U:60.552 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site