lkml.org 
[lkml]   [2012]   [Mar]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/6] firmware_class: Rework usermodehelper check
    Date
    From: Rafael J. Wysocki <rjw@sisk.pl>

    Instead of two functions, read_lock_usermodehelper() and
    usermodehelper_is_disabled(), used in combination, introduce
    usermodehelper_read_trylock() that will only return with umhelper_sem
    held if usermodehelper_disabled is unset (and will return -EAGAIN
    otherwise) and make _request_firmware() use it.

    Rename read_unlock_usermodehelper() to
    usermodehelper_read_unlock() to follow the naming convention of the
    new function.

    Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
    ---
    drivers/base/firmware_class.c | 11 +++++------
    include/linux/kmod.h | 5 ++---
    kernel/kmod.c | 24 +++++++++++-------------
    3 files changed, 18 insertions(+), 22 deletions(-)

    Index: linux/include/linux/kmod.h
    ===================================================================
    --- linux.orig/include/linux/kmod.h
    +++ linux/include/linux/kmod.h
    @@ -116,8 +116,7 @@ extern void usermodehelper_init(void);

    extern int usermodehelper_disable(void);
    extern void usermodehelper_enable(void);
    -extern bool usermodehelper_is_disabled(void);
    -extern void read_lock_usermodehelper(void);
    -extern void read_unlock_usermodehelper(void);
    +extern int usermodehelper_read_trylock(void);
    +extern void usermodehelper_read_unlock(void);

    #endif /* __LINUX_KMOD_H__ */
    Index: linux/kernel/kmod.c
    ===================================================================
    --- linux.orig/kernel/kmod.c
    +++ linux/kernel/kmod.c
    @@ -296,17 +296,24 @@ static DECLARE_WAIT_QUEUE_HEAD(running_h
    */
    #define RUNNING_HELPERS_TIMEOUT (5 * HZ)

    -void read_lock_usermodehelper(void)
    +int usermodehelper_read_trylock(void)
    {
    + int ret = 0;
    +
    down_read(&umhelper_sem);
    + if (usermodehelper_disabled) {
    + up_read(&umhelper_sem);
    + ret = -EAGAIN;
    + }
    + return ret;
    }
    -EXPORT_SYMBOL_GPL(read_lock_usermodehelper);
    +EXPORT_SYMBOL_GPL(usermodehelper_read_trylock);

    -void read_unlock_usermodehelper(void)
    +void usermodehelper_read_unlock(void)
    {
    up_read(&umhelper_sem);
    }
    -EXPORT_SYMBOL_GPL(read_unlock_usermodehelper);
    +EXPORT_SYMBOL_GPL(usermodehelper_read_unlock);

    /**
    * usermodehelper_disable - prevent new helpers from being started
    @@ -347,15 +354,6 @@ void usermodehelper_enable(void)
    up_write(&umhelper_sem);
    }

    -/**
    - * usermodehelper_is_disabled - check if new helpers are allowed to be started
    - */
    -bool usermodehelper_is_disabled(void)
    -{
    - return usermodehelper_disabled;
    -}
    -EXPORT_SYMBOL_GPL(usermodehelper_is_disabled);
    -
    static void helper_lock(void)
    {
    atomic_inc(&running_helpers);
    Index: linux/drivers/base/firmware_class.c
    ===================================================================
    --- linux.orig/drivers/base/firmware_class.c
    +++ linux/drivers/base/firmware_class.c
    @@ -533,12 +533,10 @@ static int _request_firmware(const struc
    return 0;
    }

    - read_lock_usermodehelper();
    -
    - if (WARN_ON(usermodehelper_is_disabled())) {
    + retval = usermodehelper_read_trylock();
    + if (WARN_ON(retval)) {
    dev_err(device, "firmware: %s will not be loaded\n", name);
    - retval = -EBUSY;
    - goto out;
    + goto out_nolock;
    }

    if (uevent)
    @@ -573,8 +571,9 @@ static int _request_firmware(const struc
    fw_destroy_instance(fw_priv);

    out:
    - read_unlock_usermodehelper();
    + usermodehelper_read_unlock();

    +out_nolock:
    if (retval) {
    release_firmware(firmware);
    *firmware_p = NULL;


    \
     
     \ /
      Last update: 2012-03-26 00:05    [W:0.025 / U:89.500 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site