aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRick Macklem <rmacklem@FreeBSD.org>2021-03-18 19:20:25 +0000
committerRick Macklem <rmacklem@FreeBSD.org>2021-04-01 22:56:56 +0000
commite655b00a964f834995b5164dd1edeeafb6b74a44 (patch)
tree4762e86e4934ea26f7c034a436555da76158d154
parent4752dc88e64dbd90ead7030057f2985297f3453b (diff)
downloadsrc-e655b00a964f834995b5164dd1edeeafb6b74a44.tar.gz
src-e655b00a964f834995b5164dd1edeeafb6b74a44.zip
nfsv4 pnfs client: fix updating of the layout stateid.seqid
During a recent NFSv4 testing event a test server was replying NFSERR_OLDSTATEID for layout stateids presented to the server for LayoutReturn operations. Upon rereading RFC5661, it was apparent that the FreeBSD NFSv4.1/4.2 pNFS client did not maintain the seqid field of the layout stateid correctly. This patch is believed to correct the problem. Tested against a FreeBSD pNFS server with diagnostics added to check the stateid's seqid did not indicate problems. Unfortunately, testing aginst this server will not happen in the near future, so the fix may not be correct yet. (cherry picked from commit fd232a21bb35e8ba8b62c2314b16b2f1d7c00afc)
-rw-r--r--sys/fs/nfsclient/nfs_clstate.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/sys/fs/nfsclient/nfs_clstate.c b/sys/fs/nfsclient/nfs_clstate.c
index 4c219607af91..79a18a12f91f 100644
--- a/sys/fs/nfsclient/nfs_clstate.c
+++ b/sys/fs/nfsclient/nfs_clstate.c
@@ -3469,11 +3469,18 @@ nfscl_docb(struct nfsrv_descript *nd, NFSPROC_T *p)
len, stateid.seqid,
0, 0, NULL,
recallp);
+ if (error == 0 &&
+ stateid.seqid >
+ lyp->nfsly_stateid.seqid)
+ lyp->nfsly_stateid.seqid =
+ stateid.seqid;
recallp = NULL;
wakeup(clp);
NFSCL_DEBUG(4,
- "aft layrcal=%d\n",
- error);
+ "aft layrcal=%d "
+ "layseqid=%d\n",
+ error,
+ lyp->nfsly_stateid.seqid);
} else
error =
NFSERR_NOMATCHLAYOUT;
@@ -4855,6 +4862,8 @@ nfscl_layout(struct nfsmount *nmp, vnode_t vp, u_int8_t *fhp, int fhlen,
} else {
if (retonclose != 0)
lyp->nfsly_flags |= NFSLY_RETONCLOSE;
+ if (stateidp->seqid > lyp->nfsly_stateid.seqid)
+ lyp->nfsly_stateid.seqid = stateidp->seqid;
TAILQ_REMOVE(&clp->nfsc_layout, lyp, nfsly_list);
TAILQ_INSERT_HEAD(&clp->nfsc_layout, lyp, nfsly_list);
lyp->nfsly_timestamp = NFSD_MONOSEC + 120;
@@ -4867,7 +4876,7 @@ nfscl_layout(struct nfsmount *nmp, vnode_t vp, u_int8_t *fhp, int fhlen,
return (EPERM);
}
*lypp = lyp;
- } else
+ } else if (stateidp->seqid > lyp->nfsly_stateid.seqid)
lyp->nfsly_stateid.seqid = stateidp->seqid;
/* Merge the new list of File Layouts into the list. */