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 09/12] nfs - cache_lib use namespace if not executing in init namespace
    From
    Date
    From: Ian Kent <ikent@redhat.com>

    If pipefs is registered within a namespace other than the root init
    namespace subsequent pipefs requests should be run within the init
    namespace of registration.

    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>
    ---
    fs/nfs/cache_lib.c | 7 ++++++-
    include/linux/sunrpc/cache.h | 2 ++
    net/sunrpc/cache.c | 5 +++++
    3 files changed, 13 insertions(+), 1 deletion(-)

    diff --git a/fs/nfs/cache_lib.c b/fs/nfs/cache_lib.c
    index 5f7b053..4f381ad 100644
    --- a/fs/nfs/cache_lib.c
    +++ b/fs/nfs/cache_lib.c
    @@ -48,7 +48,12 @@ int nfs_cache_upcall(struct cache_detail *cd, char *entry_name)

    if (nfs_cache_getent_prog[0] == '\0')
    goto out;
    - ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
    + if (cd->u.pipefs.umh_token) {
    + long token = cd->u.pipefs.umh_token;
    + ret = call_usermodehelper_ns(argv[0], argv, envp,
    + UMH_WAIT_EXEC, token);
    + } else
    + ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
    /*
    * Disable the upcall mechanism if we're getting an ENOENT or
    * EACCES error. The admin can re-enable it on the fly by using
    diff --git a/include/linux/sunrpc/cache.h b/include/linux/sunrpc/cache.h
    index 437ddb6..f6c1eb2 100644
    --- a/include/linux/sunrpc/cache.h
    +++ b/include/linux/sunrpc/cache.h
    @@ -68,6 +68,8 @@ struct cache_detail_procfs {

    struct cache_detail_pipefs {
    struct dentry *dir;
    + /* Namespace token */
    + long umh_token;
    };

    struct cache_detail {
    diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c
    index 5199bb1..a635efb 100644
    --- a/net/sunrpc/cache.c
    +++ b/net/sunrpc/cache.c
    @@ -1811,6 +1811,9 @@ int sunrpc_cache_register_pipefs(struct dentry *parent,
    if (IS_ERR(dir))
    return PTR_ERR(dir);
    cd->u.pipefs.dir = dir;
    + if (cd->net != &init_net)
    + cd->u.pipefs.umh_token =
    + umh_ns_get_token(cd->u.pipefs.umh_token);
    return 0;
    }
    EXPORT_SYMBOL_GPL(sunrpc_cache_register_pipefs);
    @@ -1819,6 +1822,8 @@ void sunrpc_cache_unregister_pipefs(struct cache_detail *cd)
    {
    rpc_remove_cache_dir(cd->u.pipefs.dir);
    cd->u.pipefs.dir = NULL;
    + umh_ns_put_token(cd->u.pipefs.umh_token);
    + cd->u.pipefs.umh_token = 0;
    }
    EXPORT_SYMBOL_GPL(sunrpc_cache_unregister_pipefs);



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