aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRick Macklem <rmacklem@FreeBSD.org>2022-07-08 14:37:36 +0000
committerRick Macklem <rmacklem@FreeBSD.org>2022-07-08 14:37:36 +0000
commitbe7b87de16ffbabb81989e13a4b19a178e3ab8ee (patch)
tree4f302102dfb6c20d8dc68db8236aa21991928ff2
parente1c7783e220b6120ddc116ff2e09f228d8475bfd (diff)
downloadsrc-be7b87de16ffbabb81989e13a4b19a178e3ab8ee.tar.gz
src-be7b87de16ffbabb81989e13a4b19a178e3ab8ee.zip
nfscl: Fix setting of nfsess_defunct for nfscl_hasexpired()
Commit a7bb120f8b87 added a printf for the case where recovery has not marked the session defunct by setting nfsess_defunct to 1. It turns out that nfscl_hasexpired() calls nfsrpc_setclient() directly, without setting nfsess_defunct. This patch replaces the printf with code that sets nfsess_defunct to 1 to handle this case. If SIGTERM is issued to a process when it is doing I/O on an "intr" mount, the NFSv4 server may reply NFSERR_BADSTATEID, due to the Open being prematurely closed. This can result in a call to nfscl_hasexpired() to do a recovery. This would explain at least one hang described in the PR. PR: 260011 MFC after: 2 weeks
-rw-r--r--sys/fs/nfsclient/nfs_clrpcops.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/fs/nfsclient/nfs_clrpcops.c b/sys/fs/nfsclient/nfs_clrpcops.c
index d48f1887a5a9..9204767b7abf 100644
--- a/sys/fs/nfsclient/nfs_clrpcops.c
+++ b/sys/fs/nfsclient/nfs_clrpcops.c
@@ -1057,10 +1057,12 @@ nfsrpc_setclient(struct nfsmount *nmp, struct nfsclclient *clp, int reclaim,
*/
tsep = NULL;
if (TAILQ_FIRST(&nmp->nm_sess) != NULL) {
+ /*
+ * Mark the old session defunct. Needed
+ * when called from nfscl_hasexpired().
+ */
tsep = NFSMNT_MDSSESSION(nmp);
- if (tsep->nfsess_defunct == 0)
- printf("nfsrpc_setclient: "
- "nfsess_defunct not set\n");
+ tsep->nfsess_defunct = 1;
}
TAILQ_INSERT_HEAD(&nmp->nm_sess, dsp,
nfsclds_list);