git: 80e5955b085a - main - nfscl: Fix NFSv4.1/4.2 pnfs mounts using nconnect
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
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 ||