Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 5 Mar 2012 00:49:08 +0000 (UTC)
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r232528 - projects/nfsv4.1-client/sys/fs/nfsclient
Message-ID:  <201203050049.q250n8rI059440@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rmacklem
Date: Mon Mar  5 00:49:07 2012
New Revision: 232528
URL: http://svn.freebsd.org/changeset/base/232528

Log:
  Add a version of nfscl_reldevinfo() that can be called when the clstate
  mutex is already held. This avoids a panic caused by calling mtx_lock()
  when it was alrady locked.

Modified:
  projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c

Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c
==============================================================================
--- projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c	Mon Mar  5 00:00:19 2012	(r232527)
+++ projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c	Mon Mar  5 00:49:07 2012	(r232528)
@@ -117,6 +117,7 @@ static struct nfsclclient *nfscl_getclnt
 static struct nfsclclient *nfscl_getclntsess(uint8_t *);
 static struct nfscldeleg *nfscl_finddeleg(struct nfsclclient *, u_int8_t *,
     int);
+static void nfscl_reldevinfo_locked(struct nfscldevinfo *);
 static struct nfscllayout *nfscl_findlayout(struct nfsclclient *, u_int8_t *,
     int);
 static struct nfscldevinfo *nfscl_finddevinfo(struct nfsclclient *, uint8_t *);
@@ -4528,14 +4529,24 @@ nfscl_getdevinfo(struct nfsclclient *clp
 /*
  * Dereference a devinfo structure.
  */
-void
-nfscl_reldevinfo(struct nfscldevinfo *dip)
+static void
+nfscl_reldevinfo_locked(struct nfscldevinfo *dip)
 {
 
-	NFSLOCKCLSTATE();
 	dip->nfsdi_refcnt--;
 	if (dip->nfsdi_refcnt == 0)
 		wakeup(&dip->nfsdi_refcnt);
+}
+
+/*
+ * Dereference a devinfo structure.
+ */
+void
+nfscl_reldevinfo(struct nfscldevinfo *dip)
+{
+
+	NFSLOCKCLSTATE();
+	nfscl_reldevinfo_locked(dip);
 	NFSUNLOCKCLSTATE();
 }
 
@@ -4613,7 +4624,7 @@ nfscl_adddevinfo(struct nfsmount *nmp, s
 	}
 	tdip = nfscl_finddevinfo(clp, dip->nfsdi_deviceid);
 	if (tdip != NULL) {
-		nfscl_reldevinfo(tdip);
+		nfscl_reldevinfo_locked(tdip);
 		NFSUNLOCKCLSTATE();
 		free(dip, M_NFSDEVINFO);
 		return;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201203050049.q250n8rI059440>