lkml.org 
[lkml]   [2018]   [Oct]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 3.18 24/98] NFSv4: Cache the NFSv4/v4.1 client owner_id in the struct nfs_client
    Date
    From: Trond Myklebust <trond.myklebust@primarydata.com>

    [ Upstream commit ceb3a16c070c403f5f9ca46b46cf2bb79ea11750 ]

    Ensure that we cache the NFSv4/v4.1 client owner_id so that we can
    verify it when we're doing trunking detection.

    Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/nfs/nfs4client.c | 1 +
    fs/nfs/nfs4proc.c | 19 +++++++++++++++----
    include/linux/nfs_fs_sb.h | 3 +++
    3 files changed, 19 insertions(+), 4 deletions(-)

    diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c
    index 723c656ebd28..d748d403bab1 100644
    --- a/fs/nfs/nfs4client.c
    +++ b/fs/nfs/nfs4client.c
    @@ -228,6 +228,7 @@ static void nfs4_shutdown_client(struct nfs_client *clp)
    kfree(clp->cl_serverowner);
    kfree(clp->cl_serverscope);
    kfree(clp->cl_implid);
    + kfree(clp->cl_owner_id);
    }

    void nfs4_free_client(struct nfs_client *clp)
    diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
    index 321044c183f5..db8456b4ecb8 100644
    --- a/fs/nfs/nfs4proc.c
    +++ b/fs/nfs/nfs4proc.c
    @@ -4913,11 +4913,14 @@ static void nfs4_init_boot_verifier(const struct nfs_client *clp,
    }

    static unsigned int
    -nfs4_init_nonuniform_client_string(const struct nfs_client *clp,
    +nfs4_init_nonuniform_client_string(struct nfs_client *clp,
    char *buf, size_t len)
    {
    unsigned int result;

    + if (clp->cl_owner_id != NULL)
    + return strlcpy(buf, clp->cl_owner_id, len);
    +
    rcu_read_lock();
    result = scnprintf(buf, len, "Linux NFSv4.0 %s/%s %s",
    clp->cl_ipaddr,
    @@ -4926,24 +4929,32 @@ nfs4_init_nonuniform_client_string(const struct nfs_client *clp,
    rpc_peeraddr2str(clp->cl_rpcclient,
    RPC_DISPLAY_PROTO));
    rcu_read_unlock();
    + clp->cl_owner_id = kstrdup(buf, GFP_KERNEL);
    return result;
    }

    static unsigned int
    -nfs4_init_uniform_client_string(const struct nfs_client *clp,
    +nfs4_init_uniform_client_string(struct nfs_client *clp,
    char *buf, size_t len)
    {
    const char *nodename = clp->cl_rpcclient->cl_nodename;
    + unsigned int result;
    +
    + if (clp->cl_owner_id != NULL)
    + return strlcpy(buf, clp->cl_owner_id, len);

    if (nfs4_client_id_uniquifier[0] != '\0')
    - return scnprintf(buf, len, "Linux NFSv%u.%u %s/%s",
    + result = scnprintf(buf, len, "Linux NFSv%u.%u %s/%s",
    clp->rpc_ops->version,
    clp->cl_minorversion,
    nfs4_client_id_uniquifier,
    nodename);
    - return scnprintf(buf, len, "Linux NFSv%u.%u %s",
    + else
    + result = scnprintf(buf, len, "Linux NFSv%u.%u %s",
    clp->rpc_ops->version, clp->cl_minorversion,
    nodename);
    + clp->cl_owner_id = kstrdup(buf, GFP_KERNEL);
    + return result;
    }

    /*
    diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h
    index fd249ab2718f..4ac99c07406a 100644
    --- a/include/linux/nfs_fs_sb.h
    +++ b/include/linux/nfs_fs_sb.h
    @@ -74,6 +74,9 @@ struct nfs_client {
    /* idmapper */
    struct idmap * cl_idmap;

    + /* Client owner identifier */
    + const char * cl_owner_id;
    +
    /* Our own IP address, as a null-terminated string.
    * This is used to generate the mv0 callback address.
    */
    --
    2.17.1
    \
     
     \ /
      Last update: 2018-10-25 16:29    [W:3.902 / U:0.188 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site