aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRick Macklem <rmacklem@FreeBSD.org>2022-07-11 23:50:34 +0000
committerRick Macklem <rmacklem@FreeBSD.org>2022-07-11 23:50:34 +0000
commitd4a11b3e3bddb1fa3bdd101e12aea6f5937356fa (patch)
tree092df031a78d51df6b46b65a95945490ede903e1
parent2adb30740b12d4b80b8a1eb04b58ce0f6eb51de1 (diff)
downloadsrc-d4a11b3e3bddb1fa3bdd101e12aea6f5937356fa.tar.gz
src-d4a11b3e3bddb1fa3bdd101e12aea6f5937356fa.zip
nfscl: Fix CreateSession for an established ClientID
Commit 981ef32230b2 added optional use of the session slots marked bad to recover a new session when all slots are marked bad. The recovery worked against a FreeBSD NFSv4.1/4.2 server, but not a Linux one. It turns out that it was a bug in the FreeBSD client and not the Linux server. This patch fixes the client so that DeleteSession followed by CreateSession after receiving a NFSERR_BADSESSION error reply works against the Linux server (and conforms to the RFC). This also implies that the FreeBSD NFSv4.1/4.2 server needs to be fixed in a future commit. Without the fix, the FreeBSD server does a full recovery, including creation of a new ClientID, but since "intr" mounts were broken, this does not result in a regression. This patch only affects the case where a CreateSession is done for an already confirmed ClientID, which was not being done prior to commit 981ef32230b2. PR: 260011 MFC after: 2 weeks
-rw-r--r--sys/fs/nfsclient/nfs_clrpcops.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/sys/fs/nfsclient/nfs_clrpcops.c b/sys/fs/nfsclient/nfs_clrpcops.c
index 051942d84d4d..a26345cb362f 100644
--- a/sys/fs/nfsclient/nfs_clrpcops.c
+++ b/sys/fs/nfsclient/nfs_clrpcops.c
@@ -984,7 +984,7 @@ nfsrpc_setclient(struct nfsmount *nmp, struct nfsclclient *clp, int reclaim,
dsp->nfsclds_sess.nfsess_clientid =
odsp->nfsclds_sess.nfsess_clientid;
dsp->nfsclds_sess.nfsess_sequenceid =
- odsp->nfsclds_sess.nfsess_sequenceid;
+ odsp->nfsclds_sess.nfsess_sequenceid + 1;
dsp->nfsclds_flags = odsp->nfsclds_flags;
if (dsp->nfsclds_servownlen > 0)
memcpy(dsp->nfsclds_serverown,