[Midnightbsd-cvs] src [11870] trunk/sys/fs/nfsserver/nfs_nfsdstate.c: Fix a locking issue

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Sun Jul 15 14:14:52 EDT 2018


Revision: 11870
          http://svnweb.midnightbsd.org/src/?rev=11870
Author:   laffer1
Date:     2018-07-15 14:14:51 -0400 (Sun, 15 Jul 2018)
Log Message:
-----------
Fix a locking issue

Obtained from: FreeBSD 334699

Modified Paths:
--------------
    trunk/sys/fs/nfsserver/nfs_nfsdstate.c

Modified: trunk/sys/fs/nfsserver/nfs_nfsdstate.c
===================================================================
--- trunk/sys/fs/nfsserver/nfs_nfsdstate.c	2018-07-15 18:12:49 UTC (rev 11869)
+++ trunk/sys/fs/nfsserver/nfs_nfsdstate.c	2018-07-15 18:14:51 UTC (rev 11870)
@@ -5939,17 +5939,32 @@
 int
 nfsrv_destroysession(struct nfsrv_descript *nd, uint8_t *sessionid)
 {
-	int error, samesess;
+	int error, igotlock, samesess;
 
 	samesess = 0;
-	if (!NFSBCMP(sessionid, nd->nd_sessionid, NFSX_V4SESSIONID)) {
+	if (!NFSBCMP(sessionid, nd->nd_sessionid, NFSX_V4SESSIONID) &&
+	    (nd->nd_flag & ND_HASSEQUENCE) != 0) {
 		samesess = 1;
 		if ((nd->nd_flag & ND_LASTOP) == 0)
 			return (NFSERR_BADSESSION);
 	}
+
+	/* Lock out other nfsd threads */
+	NFSLOCKV4ROOTMUTEX();
+	nfsv4_relref(&nfsv4rootfs_lock);
+	do {
+		igotlock = nfsv4_lock(&nfsv4rootfs_lock, 1, NULL,
+		    NFSV4ROOTLOCKMUTEXPTR, NULL);
+	} while (igotlock == 0);
+	NFSUNLOCKV4ROOTMUTEX();
+
 	error = nfsrv_freesession(NULL, sessionid);
 	if (error == 0 && samesess != 0)
 		nd->nd_flag &= ~ND_HASSEQUENCE;
+
+	NFSLOCKV4ROOTMUTEX();
+	nfsv4_unlock(&nfsv4rootfs_lock, 1);
+	NFSUNLOCKV4ROOTMUTEX();
 	return (error);
 }
 



More information about the Midnightbsd-cvs mailing list