Re: [PATCH 1/1] NFSv4.1+ add trunking when server trunking detected

Chuck Lever III
2021-06-08T20:41:54Z

> On Jun 8, 2021, at 2:45 PM, Olga Kornievskaia <olga.kornievskaia@gmail.com> wrote:
>
> From: Olga Kornievskaia <kolga@netapp.com>
>
> After trunking is discovered in nfs4_discover_server_trunking(),
> add the transport to the old client structure before destroying
> the new client structure (along with its transport).
>
> Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
> ---
> fs/nfs/nfs4client.c | 40 ++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 40 insertions(+)
>
> diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c
> index 42719384e25f..984c851844d8 100644
> --- a/fs/nfs/nfs4client.c
> +++ b/fs/nfs/nfs4client.c
> @@ -361,6 +361,44 @@ static int nfs4_init_client_minor_version(struct nfs_client *clp)
> return nfs4_init_callback(clp);
> }
>
> +static void nfs4_add_trunk(struct nfs_client *clp, struct nfs_client *old)
> +{
> + struct sockaddr_storage clp_addr, old_addr;
> + struct sockaddr *clp_sap = (struct sockaddr *)&clp_addr;
> + struct sockaddr *old_sap = (struct sockaddr *)&old_addr;
> + size_t clp_salen, old_salen;
> + struct xprt_create xprt_args = {
> + .ident = old->cl_proto,
> + .net = old->cl_net,
> + .servername = old->cl_hostname,
> + };
> + struct nfs4_add_xprt_data xprtdata = {
> + .clp = old,
> + };
> + struct rpc_add_xprt_test rpcdata = {
> + .add_xprt_test = old->cl_mvops->session_trunk,
> + .data = &xprtdata,
> + };
> +
> + if (clp->cl_proto != old->cl_proto)
> + return;
> + clp_salen = rpc_peeraddr(clp->cl_rpcclient, clp_sap, sizeof(clp_addr));
> + old_salen = rpc_peeraddr(old->cl_rpcclient, old_sap, sizeof(old_addr));
> +
> + if (clp_addr.ss_family != old_addr.ss_family)
> + return;
> +
> + xprt_args.dstaddr = clp_sap;
> + xprt_args.addrlen = clp_salen;
> +
> + xprtdata.cred = nfs4_get_clid_cred(old);
> + rpc_clnt_add_xprt(old->cl_rpcclient, &xprt_args,
> + rpc_clnt_setup_test_and_add_xprt, &rpcdata);

Is there an upper bound on the number of transports that
are added to the NFS client's switch?

> +
> + if (xprtdata.cred)
> + put_cred(xprtdata.cred);
> +}
> +
> /**
> * nfs4_init_client - Initialise an NFS4 client record
> *
> @@ -434,6 +472,8 @@ struct nfs_client *nfs4_init_client(struct nfs_client *clp,
> * won't try to use it.
> */
> nfs_mark_client_ready(clp, -EPERM);
> + if (old->cl_mvops->session_trunk)
> + nfs4_add_trunk(clp, old);
> }
> clear_bit(NFS_CS_TSM_POSSIBLE, &clp->cl_flags);
> nfs_put_client(clp);
> --
> 2.27.0
>

--
Chuck Lever