> On Jun 8, 2021, at 2:45 PM, Olga Kornievskaia <olga.kornievskaia@xxxxxxxxx> wrote: > > From: Olga Kornievskaia <kolga@xxxxxxxxxx> > > 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@xxxxxxxxxx> > --- > 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