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.

(cherry picked from commit 80e5955b08)
This commit is contained in:
Rick Macklem 2021-11-04 17:06:34 -07:00
parent ffc00e9db9
commit 87c8d28539

View file

@ -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 ||