lkml.org 
[lkml]   [2015]   [Feb]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RFC PATCH 6/8] nfsd - use namespace if not executing in init namespace
    On Thu, Feb 05, 2015 at 10:34:31AM +0800, Ian Kent wrote:
    > If nfsd is running within a container the client tracking operations
    > should run within the container also.
    >
    > 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/nfsd/netns.h | 2 ++
    > fs/nfsd/nfs4recover.c | 48 ++++++++++++++++++++++++++++++++----------------
    > 2 files changed, 34 insertions(+), 16 deletions(-)
    >
    > diff --git a/fs/nfsd/netns.h b/fs/nfsd/netns.h
    > index ea6749a..c168196 100644
    > --- a/fs/nfsd/netns.h
    > +++ b/fs/nfsd/netns.h
    > @@ -112,6 +112,8 @@ struct nfsd_net {
    > u32 clientid_counter;
    >
    > struct svc_serv *nfsd_serv;
    > +
    > + int umh_flags;
    > };
    >
    > /* Simple check to find out if a given net was properly initialized */
    > diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c
    > index cc6a760..b962856 100644
    > --- a/fs/nfsd/nfs4recover.c
    > +++ b/fs/nfsd/nfs4recover.c
    > @@ -1184,7 +1184,9 @@ nfsd4_cltrack_grace_start(time_t grace_start)
    > }
    >
    > static int
    > -nfsd4_umh_cltrack_upcall(char *cmd, char *arg, char *env0, char *env1)
    > +nfsd4_umh_cltrack_upcall(char *cmd,
    > + char *arg, char *env0, char *env1,
    > + int flags)
    > {
    > char *envp[3];
    > char *argv[4];
    > @@ -1209,7 +1211,7 @@ nfsd4_umh_cltrack_upcall(char *cmd, char *arg, char *env0, char *env1)
    > argv[2] = arg;
    > argv[3] = NULL;
    >
    > - ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
    > + ret = call_usermodehelper(argv[0], argv, envp, flags);
    > /*
    > * Disable the upcall mechanism if we're getting an ENOENT or EACCES
    > * error. The admin can re-enable it on the fly by using sysfs
    > @@ -1252,14 +1254,13 @@ nfsd4_umh_cltrack_init(struct net *net)
    > struct nfsd_net *nn = net_generic(net, nfsd_net_id);
    > char *grace_start = nfsd4_cltrack_grace_start(nn->boot_time);
    >
    > - /* XXX: The usermode helper s not working in container yet. */
    > - if (net != &init_net) {
    > - WARN(1, KERN_ERR "NFSD: attempt to initialize umh client "
    > - "tracking in a container!\n");
    > - return -EINVAL;
    > - }
    > + nn->umh_flags = UMH_WAIT_PROC;
    > + if (net != &init_net)
    > + nn->umh_flags |= UMH_USE_NS;
    >
    > - ret = nfsd4_umh_cltrack_upcall("init", NULL, grace_start, NULL);
    > + ret = nfsd4_umh_cltrack_upcall("init",
    > + NULL, grace_start, NULL,
    > + nn->umh_flags);

    This code is always run from a kernel thread, so I assume this isn't
    actually going to do anything different.

    --b.

    > kfree(grace_start);
    > return ret;
    > }
    > @@ -1285,6 +1286,7 @@ nfsd4_umh_cltrack_create(struct nfs4_client *clp)
    > {
    > char *hexid, *has_session, *grace_start;
    > struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
    > + int ret;
    >
    > /*
    > * With v4.0 clients, there's little difference in outcome between a
    > @@ -1312,7 +1314,10 @@ nfsd4_umh_cltrack_create(struct nfs4_client *clp)
    > grace_start = nfsd4_cltrack_grace_start(nn->boot_time);
    >
    > nfsd4_cltrack_upcall_lock(clp);
    > - if (!nfsd4_umh_cltrack_upcall("create", hexid, has_session, grace_start))
    > + ret = nfsd4_umh_cltrack_upcall("create",
    > + hexid, has_session, grace_start,
    > + nn->umh_flags);
    > + if (!ret)
    > set_bit(NFSD4_CLIENT_STABLE, &clp->cl_flags);
    > nfsd4_cltrack_upcall_unlock(clp);
    >
    > @@ -1324,7 +1329,9 @@ nfsd4_umh_cltrack_create(struct nfs4_client *clp)
    > static void
    > nfsd4_umh_cltrack_remove(struct nfs4_client *clp)
    > {
    > + struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
    > char *hexid;
    > + int ret;
    >
    > if (!test_bit(NFSD4_CLIENT_STABLE, &clp->cl_flags))
    > return;
    > @@ -1336,9 +1343,13 @@ nfsd4_umh_cltrack_remove(struct nfs4_client *clp)
    > }
    >
    > nfsd4_cltrack_upcall_lock(clp);
    > - if (test_bit(NFSD4_CLIENT_STABLE, &clp->cl_flags) &&
    > - nfsd4_umh_cltrack_upcall("remove", hexid, NULL, NULL) == 0)
    > - clear_bit(NFSD4_CLIENT_STABLE, &clp->cl_flags);
    > + if (test_bit(NFSD4_CLIENT_STABLE, &clp->cl_flags)) {
    > + ret = nfsd4_umh_cltrack_upcall("remove",
    > + hexid, NULL, NULL,
    > + nn->umh_flags);
    > + if (ret == 0)
    > + clear_bit(NFSD4_CLIENT_STABLE, &clp->cl_flags);
    > + }
    > nfsd4_cltrack_upcall_unlock(clp);
    >
    > kfree(hexid);
    > @@ -1347,8 +1358,9 @@ nfsd4_umh_cltrack_remove(struct nfs4_client *clp)
    > static int
    > nfsd4_umh_cltrack_check(struct nfs4_client *clp)
    > {
    > - int ret;
    > + struct nfsd_net *nn = net_generic(clp->net, nfsd_net_id);
    > char *hexid, *has_session, *legacy;
    > + int ret;
    >
    > if (test_bit(NFSD4_CLIENT_STABLE, &clp->cl_flags))
    > return 0;
    > @@ -1366,7 +1378,9 @@ nfsd4_umh_cltrack_check(struct nfs4_client *clp)
    > if (test_bit(NFSD4_CLIENT_STABLE, &clp->cl_flags)) {
    > ret = 0;
    > } else {
    > - ret = nfsd4_umh_cltrack_upcall("check", hexid, has_session, legacy);
    > + ret = nfsd4_umh_cltrack_upcall("check", hexid,
    > + has_session, legacy,
    > + mm->umh_flags);
    > if (ret == 0)
    > set_bit(NFSD4_CLIENT_STABLE, &clp->cl_flags);
    > }
    > @@ -1386,7 +1400,9 @@ nfsd4_umh_cltrack_grace_done(struct nfsd_net *nn)
    >
    > sprintf(timestr, "%ld", nn->boot_time);
    > legacy = nfsd4_cltrack_legacy_topdir();
    > - nfsd4_umh_cltrack_upcall("gracedone", timestr, legacy, NULL);
    > + nfsd4_umh_cltrack_upcall("gracedone",
    > + timestr, legacy, NULL,
    > + nn->umh_flags);
    > kfree(legacy);
    > }
    >


    \
     
     \ /
      Last update: 2015-02-18 18:41    [W:4.040 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site