NFSv4.1: fix handling NFS4ERR_DELAY when testing for session trunking
authorOlga Kornievskaia <kolga@netapp.com>
Fri, 15 Sep 2023 19:21:16 +0000 (15:21 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 28 Nov 2023 17:07:03 +0000 (17:07 +0000)
[ Upstream commit 6bd1a77dc72dea0b0d8b6014f231143984d18f6d ]

Currently when client sends an EXCHANGE_ID for a possible trunked
connection, for any error that happened, the trunk will be thrown
out. However, an NFS4ERR_DELAY is a transient error that should be
retried instead.

Fixes: e818bd085baf ("NFSv4.1 remove xprt from xprt_switch if session trunking test fails")
Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/nfs/nfs4proc.c

index 5cf53de..4058861 100644 (file)
@@ -8939,6 +8939,7 @@ void nfs4_test_session_trunk(struct rpc_clnt *clnt, struct rpc_xprt *xprt,
 
        sp4_how = (adata->clp->cl_sp4_flags == 0 ? SP4_NONE : SP4_MACH_CRED);
 
+try_again:
        /* Test connection for session trunking. Async exchange_id call */
        task = nfs4_run_exchange_id(adata->clp, adata->cred, sp4_how, xprt);
        if (IS_ERR(task))
@@ -8951,11 +8952,15 @@ void nfs4_test_session_trunk(struct rpc_clnt *clnt, struct rpc_xprt *xprt,
 
        if (status == 0)
                rpc_clnt_xprt_switch_add_xprt(clnt, xprt);
-       else if (rpc_clnt_xprt_switch_has_addr(clnt,
+       else if (status != -NFS4ERR_DELAY && rpc_clnt_xprt_switch_has_addr(clnt,
                                (struct sockaddr *)&xprt->addr))
                rpc_clnt_xprt_switch_remove_xprt(clnt, xprt);
 
        rpc_put_task(task);
+       if (status == -NFS4ERR_DELAY) {
+               ssleep(1);
+               goto try_again;
+       }
 }
 EXPORT_SYMBOL_GPL(nfs4_test_session_trunk);