changeset 25636:9dbc553a80a2

8040 NFSv4 client: 3-way deadlock between nfs4_bio(), nfs4_do_delegreturn(), and nfs4_flush_pages() Reviewed by: Arne Jansen <arne@die-jansens.de> Reviewed by: Vitaliy Gusev <gusev.vitaliy@icloud.com> Approved by: Gordon Ross <gordon.w.ross@gmail.com>
author Marcel Telka <marcel@telka.sk>
date Tue, 15 Dec 2020 22:08:36 +0100
parents f3c8f3a2a25c
children ebef2b3dd433
files usr/src/uts/common/fs/nfs/nfs4_client.c usr/src/uts/common/fs/nfs/nfs4_vnops.c
diffstat 2 files changed, 9 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/fs/nfs/nfs4_client.c	Thu Dec 31 10:47:42 2020 +0000
+++ b/usr/src/uts/common/fs/nfs/nfs4_client.c	Tue Dec 15 22:08:36 2020 +0100
@@ -24,7 +24,7 @@
  */
 
 /*
- *  	Copyright (c) 1983,1984,1985,1986,1987,1988,1989  AT&T.
+ *	Copyright (c) 1983,1984,1985,1986,1987,1988,1989  AT&T.
  *	All Rights Reserved
  */
 
@@ -464,33 +464,15 @@
 	rp = VTOR4(vp);
 	mutex_enter(&rp->r_statelock);
 	was_serial = (rp->r_serial == curthread);
-	if (rp->r_serial && !was_serial) {
-		klwp_t *lwp = ttolwp(curthread);
-
+	if (rp->r_serial != NULL && !was_serial) {
 		/*
-		 * If we're the recovery thread, then purge current attrs
-		 * and bail out to avoid potential deadlock between another
-		 * thread caching attrs (r_serial thread), recov thread,
-		 * and an async writer thread.
+		 * Purge current attrs and bail out to avoid potential deadlock
+		 * between another thread caching attrs (r_serial thread), this
+		 * thread, and a thread trying to read or write pages.
 		 */
-		if (recov) {
-			PURGE_ATTRCACHE4_LOCKED(rp);
-			mutex_exit(&rp->r_statelock);
-			return;
-		}
-
-		if (lwp != NULL)
-			lwp->lwp_nostop++;
-		while (rp->r_serial != NULL) {
-			if (!cv_wait_sig(&rp->r_cv, &rp->r_statelock)) {
-				mutex_exit(&rp->r_statelock);
-				if (lwp != NULL)
-					lwp->lwp_nostop--;
-				return;
-			}
-		}
-		if (lwp != NULL)
-			lwp->lwp_nostop--;
+		PURGE_ATTRCACHE4_LOCKED(rp);
+		mutex_exit(&rp->r_statelock);
+		return;
 	}
 
 	/*
@@ -3067,7 +3049,7 @@
 	nfs4_oo_hash_bucket_t   *bucketp;
 	nfs4_debug_msg_t	*msgp;
 	int i;
-	servinfo4_t 		*svp;
+	servinfo4_t		*svp;
 
 	/*
 	 * Code introduced here should be carefully evaluated to make
--- a/usr/src/uts/common/fs/nfs/nfs4_vnops.c	Thu Dec 31 10:47:42 2020 +0000
+++ b/usr/src/uts/common/fs/nfs/nfs4_vnops.c	Tue Dec 15 22:08:36 2020 +0100
@@ -2596,12 +2596,6 @@
 	osp->os_ref_count--;
 
 	if (ep->error == 0) {
-		/*
-		 * Avoid a deadlock with the r_serial thread waiting for
-		 * os_sync_lock in nfs4_get_otw_cred_by_osp() which might be
-		 * held by us. We will wait in nfs4_attr_cache() for the
-		 * completion of the r_serial thread.
-		 */
 		mutex_exit(&osp->os_sync_lock);
 		*have_sync_lockp = 0;