lkml.org 
[lkml]   [2015]   [Mar]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[RFC PATCH v4 02/12] kmod - rename call_usermodehelper() flags parameter
    From
    Date
    From: Ian Kent <ikent@redhat.com>

    The wait parameter of call_usermodehelper() is not quite a parameter
    that describes the wait behaviour alone and will later be used to
    request execution within the current namespaces. This flag is tied
    to the wait field of the subprocess_info structure which is also
    a field that doesn't specify wait behaviour alone and is used to
    hold the passed flags information.

    So change both the parameter and structure field name to flags.

    Signed-off-by: Ian Kent <ikent@redhat.com>
    Cc: Benjamin Coddington <bcodding@redhat.com>
    Cc: Al Viro <viro@ZenIV.linux.org.uk>
    Cc: J. Bruce Fields <bfields@fieldses.org>
    Cc: David Howells <dhowells@redhat.com>
    Cc: Trond Myklebust <trond.myklebust@primarydata.com>
    Cc: Oleg Nesterov <onestero@redhat.com>
    Cc: Eric W. Biederman <ebiederm@xmission.com>
    Cc: Jeff Layton <jeff.layton@primarydata.com>
    ---
    include/linux/kmod.h | 6 +++---
    kernel/kmod.c | 32 +++++++++++++++++---------------
    2 files changed, 20 insertions(+), 18 deletions(-)

    diff --git a/include/linux/kmod.h b/include/linux/kmod.h
    index 0555cc6..e647ddb 100644
    --- a/include/linux/kmod.h
    +++ b/include/linux/kmod.h
    @@ -59,7 +59,7 @@ struct subprocess_info {
    char *path;
    char **argv;
    char **envp;
    - int wait;
    + unsigned int flags;
    int retval;
    int (*init)(struct subprocess_info *info, struct cred *new);
    void (*cleanup)(struct subprocess_info *info);
    @@ -67,7 +67,7 @@ struct subprocess_info {
    };

    extern int
    -call_usermodehelper(char *path, char **argv, char **envp, int wait);
    +call_usermodehelper(char *path, char **argv, char **envp, unsigned int flags);

    extern struct subprocess_info *
    call_usermodehelper_setup(char *path, char **argv, char **envp, gfp_t gfp_mask,
    @@ -75,7 +75,7 @@ call_usermodehelper_setup(char *path, char **argv, char **envp, gfp_t gfp_mask,
    void (*cleanup)(struct subprocess_info *), void *data);

    extern int
    -call_usermodehelper_exec(struct subprocess_info *info, int wait);
    +call_usermodehelper_exec(struct subprocess_info *info, unsigned int flags);

    extern struct ctl_table usermodehelper_table[];

    diff --git a/kernel/kmod.c b/kernel/kmod.c
    index 2777f40..e968e2d 100644
    --- a/kernel/kmod.c
    +++ b/kernel/kmod.c
    @@ -259,7 +259,7 @@ static int ____call_usermodehelper(void *data)
    out:
    sub_info->retval = retval;
    /* wait_for_helper() will call umh_complete if UHM_WAIT_PROC. */
    - if (!(sub_info->wait & UMH_WAIT_PROC))
    + if (!(sub_info->flags & UMH_WAIT_PROC))
    umh_complete(sub_info);
    if (!retval)
    return 0;
    @@ -310,7 +310,7 @@ static void __call_usermodehelper(struct work_struct *work)
    container_of(work, struct subprocess_info, work);
    pid_t pid;

    - if (sub_info->wait & UMH_WAIT_PROC)
    + if (sub_info->flags & UMH_WAIT_PROC)
    pid = kernel_thread(wait_for_helper, sub_info,
    CLONE_FS | CLONE_FILES | SIGCHLD);
    else
    @@ -525,16 +525,17 @@ EXPORT_SYMBOL(call_usermodehelper_setup);
    /**
    * call_usermodehelper_exec - start a usermode application
    * @sub_info: information about the subprocessa
    - * @wait: wait for the application to finish and return status.
    - * when UMH_NO_WAIT don't wait at all, but you get no useful error back
    - * when the program couldn't be exec'ed. This makes it safe to call
    - * from interrupt context.
    + * @flags: flag to indicate whether to wait for the application to finish
    + * and return status. If UMH_NO_WAIT is set don't wait at all, but
    + * you get no useful error back when the program couldn't be exec'ed.
    + * This makes it safe to call from interrupt context.
    *
    * Runs a user-space application. The application is started
    * asynchronously if wait is not set, and runs as a child of keventd.
    * (ie. it runs with full root capabilities).
    */
    -int call_usermodehelper_exec(struct subprocess_info *sub_info, int wait)
    +int call_usermodehelper_exec(struct subprocess_info *sub_info,
    + unsigned int flags)
    {
    DECLARE_COMPLETION_ONSTACK(done);
    int retval = 0;
    @@ -553,14 +554,14 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info, int wait)
    * This makes it possible to use umh_complete to free
    * the data structure in case of UMH_NO_WAIT.
    */
    - sub_info->complete = (wait == UMH_NO_WAIT) ? NULL : &done;
    - sub_info->wait = wait;
    + sub_info->complete = (flags & UMH_NO_WAIT) ? NULL : &done;
    + sub_info->flags = flags;

    queue_work(khelper_wq, &sub_info->work);
    - if (wait == UMH_NO_WAIT) /* task has freed sub_info */
    + if (flags & UMH_NO_WAIT) /* task has freed sub_info */
    goto unlock;

    - if (wait & UMH_KILLABLE) {
    + if (flags & UMH_KILLABLE) {
    retval = wait_for_completion_killable(&done);
    if (!retval)
    goto wait_done;
    @@ -587,7 +588,7 @@ EXPORT_SYMBOL(call_usermodehelper_exec);
    * @path: path to usermode executable
    * @argv: arg vector for process
    * @envp: environment for process
    - * @wait: wait for the application to finish and return status.
    + * @flags: wait for the application to finish and return status.
    * when UMH_NO_WAIT don't wait at all, but you get no useful error back
    * when the program couldn't be exec'ed. This makes it safe to call
    * from interrupt context.
    @@ -595,17 +596,18 @@ EXPORT_SYMBOL(call_usermodehelper_exec);
    * This function is the equivalent to use call_usermodehelper_setup() and
    * call_usermodehelper_exec().
    */
    -int call_usermodehelper(char *path, char **argv, char **envp, int wait)
    +int call_usermodehelper(char *path,
    + char **argv, char **envp, unsigned int flags)
    {
    struct subprocess_info *info;
    - gfp_t gfp_mask = (wait == UMH_NO_WAIT) ? GFP_ATOMIC : GFP_KERNEL;
    + gfp_t gfp_mask = (flags & UMH_NO_WAIT) ? GFP_ATOMIC : GFP_KERNEL;

    info = call_usermodehelper_setup(path, argv, envp, gfp_mask,
    NULL, NULL, NULL);
    if (info == NULL)
    return -ENOMEM;

    - return call_usermodehelper_exec(info, wait);
    + return call_usermodehelper_exec(info, flags);
    }
    EXPORT_SYMBOL(call_usermodehelper);



    \
     
     \ /
      Last update: 2015-03-17 04:01    [W:2.642 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site