[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