svn commit: r232528 - projects/nfsv4.1-client/sys/fs/nfsclient
Rick Macklem
rmacklem at FreeBSD.org
Mon Mar 5 00:49:08 UTC 2012
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;
More information about the svn-src-projects
mailing list