git: 80e5955b085a - main - nfscl: Fix NFSv4.1/4.2 pnfs mounts using nconnect

From: Rick Macklem <rmacklem_at_FreeBSD.org>
Date: Fri, 05 Nov 2021 00:09:53 UTC
The branch main has been updated by rmacklem:

URL: https://cgit.FreeBSD.org/src/commit/?id=80e5955b085af20e65ef84066a164936413748e3

commit 80e5955b085af20e65ef84066a164936413748e3
Author:     Rick Macklem <rmacklem@FreeBSD.org>
AuthorDate: 2021-11-05 00:06:34 +0000
Commit:     Rick Macklem <rmacklem@FreeBSD.org>
CommitDate: 2021-11-05 00:06:34 +0000

    nfscl: Fix NFSv4.1/4.2 pnfs mounts using nconnect
    
    When a mount with the "pnfs" and "nconnect" options specified
    does an I/O operation, it erroneously uses a TCP connection
    to the MDS when it is meant to be a DS operation and, as such,
    needs to use a TCP connection to the DS.  This patch fixes this.
    
    When the "pnfs" and "nconnect" options are specified for a
    NFSv4.1/4.2 mount, there probably should be N connections
    established to each DS for I/O RPCs.  This is a fair amount
    of work and may be done in a future commit.
    
    This problem was found during a recent IETF NFSv4 working
    group testing event.
    
    MFC after:      2 weeks
---
 sys/fs/nfs/nfs_commonkrpc.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/sys/fs/nfs/nfs_commonkrpc.c b/sys/fs/nfs/nfs_commonkrpc.c
index 358d77fe5b30..c1a5fab2a358 100644
--- a/sys/fs/nfs/nfs_commonkrpc.c
+++ b/sys/fs/nfs/nfs_commonkrpc.c
@@ -639,8 +639,17 @@ newnfs_request(struct nfsrv_descript *nd, struct nfsmount *nmp,
 	if (nrp->nr_client == NULL)
 		newnfs_connect(nmp, nrp, cred, td, 0, false, &nrp->nr_client);
 
+	/*
+	 * If the "nconnect" mount option was specified and this RPC is
+	 * one that can have a large RPC message and is being done through
+	 * the NFS/MDS server, use an additional connection. (When the RPC is
+	 * being done through the server/MDS, nrp == &nmp->nm_sockreq.)
+	 * The "nconnect" mount option normally has minimal effect when the
+	 * "pnfs" mount option is specified, since only Readdir RPCs are
+	 * normally done through the NFS/MDS server.
+	 */
 	nextconn_set = false;
-	if (nmp != NULL && nmp->nm_aconnect > 0 &&
+	if (nmp != NULL && nmp->nm_aconnect > 0 && nrp == &nmp->nm_sockreq &&
 	    (nd->nd_procnum == NFSPROC_READ ||
 	     nd->nd_procnum == NFSPROC_READDIR ||
 	     nd->nd_procnum == NFSPROC_READDIRPLUS ||