Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 7 Nov 2014 15:44:04 +0000 (UTC)
From:      Edward Tomasz Napierala <trasz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r274234 - stable/10/sys/fs/autofs
Message-ID:  <201411071544.sA7Fi4d6001345@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: trasz
Date: Fri Nov  7 15:44:03 2014
New Revision: 274234
URL: https://svnweb.freebsd.org/changeset/base/274234

Log:
  MFC r272470:
  
  Make autofs(4) use shared lock for lookups, instead of exclusive one.
  
  Sponsored by:	The FreeBSD Foundation

Modified:
  stable/10/sys/fs/autofs/autofs.c
  stable/10/sys/fs/autofs/autofs.h
  stable/10/sys/fs/autofs/autofs_vfsops.c
  stable/10/sys/fs/autofs/autofs_vnops.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/fs/autofs/autofs.c
==============================================================================
--- stable/10/sys/fs/autofs/autofs.c	Fri Nov  7 15:42:11 2014	(r274233)
+++ stable/10/sys/fs/autofs/autofs.c	Fri Nov  7 15:44:03 2014	(r274234)
@@ -297,9 +297,9 @@ autofs_cached(struct autofs_node *anp, c
 	 * is necessary for wildcard indirect map keys to work.
 	 */
 	if (anp->an_parent == NULL && componentlen != 0) {
-		AUTOFS_LOCK(amp);
+		AUTOFS_SLOCK(amp);
 		error = autofs_node_find(anp, component, componentlen, NULL);
-		AUTOFS_UNLOCK(amp);
+		AUTOFS_SUNLOCK(amp);
 		if (error != 0)
 			return (false);
 	}

Modified: stable/10/sys/fs/autofs/autofs.h
==============================================================================
--- stable/10/sys/fs/autofs/autofs.h	Fri Nov  7 15:42:11 2014	(r274233)
+++ stable/10/sys/fs/autofs/autofs.h	Fri Nov  7 15:44:03 2014	(r274234)
@@ -53,9 +53,12 @@ extern int autofs_mount_on_stat;
 		    __func__, ## __VA_ARGS__);			\
 	} while (0)
 
-#define AUTOFS_LOCK(X)		sx_xlock(&X->am_lock)
-#define AUTOFS_UNLOCK(X)	sx_xunlock(&X->am_lock)
-#define AUTOFS_ASSERT_LOCKED(X)	sx_assert(&X->am_lock, SA_XLOCKED)
+#define AUTOFS_SLOCK(X)		sx_slock(&X->am_lock)
+#define AUTOFS_XLOCK(X)		sx_xlock(&X->am_lock)
+#define AUTOFS_SUNLOCK(X)	sx_sunlock(&X->am_lock)
+#define AUTOFS_XUNLOCK(X)	sx_xunlock(&X->am_lock)
+#define AUTOFS_ASSERT_LOCKED(X)		sx_assert(&X->am_lock, SA_LOCKED)
+#define AUTOFS_ASSERT_XLOCKED(X)	sx_assert(&X->am_lock, SA_XLOCKED)
 #define AUTOFS_ASSERT_UNLOCKED(X)	sx_assert(&X->am_lock, SA_UNLOCKED)
 
 struct autofs_node {

Modified: stable/10/sys/fs/autofs/autofs_vfsops.c
==============================================================================
--- stable/10/sys/fs/autofs/autofs_vfsops.c	Fri Nov  7 15:42:11 2014	(r274233)
+++ stable/10/sys/fs/autofs/autofs_vfsops.c	Fri Nov  7 15:44:03 2014	(r274234)
@@ -88,14 +88,14 @@ autofs_mount(struct mount *mp)
 
 	vfs_getnewfsid(mp);
 
-	AUTOFS_LOCK(amp);
+	AUTOFS_XLOCK(amp);
 	error = autofs_node_new(NULL, amp, ".", -1, &amp->am_root);
 	if (error != 0) {
-		AUTOFS_UNLOCK(amp);
+		AUTOFS_XUNLOCK(amp);
 		free(amp, M_AUTOFS);
 		return (error);
 	}
-	AUTOFS_UNLOCK(amp);
+	AUTOFS_XUNLOCK(amp);
 
 	vfs_mountedfrom(mp, from);
 
@@ -146,7 +146,7 @@ autofs_unmount(struct mount *mp, int mnt
 		pause("autofs_umount", 1);
 	}
 
-	AUTOFS_LOCK(amp);
+	AUTOFS_XLOCK(amp);
 
 	/*
 	 * Not terribly efficient, but at least not recursive.
@@ -160,7 +160,7 @@ autofs_unmount(struct mount *mp, int mnt
 	autofs_node_delete(amp->am_root);
 
 	mp->mnt_data = NULL;
-	AUTOFS_UNLOCK(amp);
+	AUTOFS_XUNLOCK(amp);
 
 	sx_destroy(&amp->am_lock);
 

Modified: stable/10/sys/fs/autofs/autofs_vnops.c
==============================================================================
--- stable/10/sys/fs/autofs/autofs_vnops.c	Fri Nov  7 15:42:11 2014	(r274233)
+++ stable/10/sys/fs/autofs/autofs_vnops.c	Fri Nov  7 15:44:03 2014	(r274234)
@@ -277,22 +277,22 @@ autofs_lookup(struct vop_lookup_args *ap
 		}
 	}
 
-	AUTOFS_LOCK(amp);
+	AUTOFS_SLOCK(amp);
 	error = autofs_node_find(anp, cnp->cn_nameptr, cnp->cn_namelen, &child);
 	if (error != 0) {
 		if ((cnp->cn_flags & ISLASTCN) && cnp->cn_nameiop == CREATE) {
-			AUTOFS_UNLOCK(amp);
+			AUTOFS_SUNLOCK(amp);
 			return (EJUSTRETURN);
 		}
 
-		AUTOFS_UNLOCK(amp);
+		AUTOFS_SUNLOCK(amp);
 		return (ENOENT);
 	}
 
 	/*
 	 * XXX: Dropping the node here is ok, because we never remove nodes.
 	 */
-	AUTOFS_UNLOCK(amp);
+	AUTOFS_SUNLOCK(amp);
 
 	error = autofs_node_vn(child, mp, vpp);
 	if (error != 0) {
@@ -325,14 +325,14 @@ autofs_mkdir(struct vop_mkdir_args *ap)
 	if (autofs_ignore_thread(curthread) == false)
 		return (EPERM);
 
-	AUTOFS_LOCK(amp);
+	AUTOFS_XLOCK(amp);
 	error = autofs_node_new(anp, amp, ap->a_cnp->cn_nameptr,
 	    ap->a_cnp->cn_namelen, &child);
 	if (error != 0) {
-		AUTOFS_UNLOCK(amp);
+		AUTOFS_XUNLOCK(amp);
 		return (error);
 	}
-	AUTOFS_UNLOCK(amp);
+	AUTOFS_XUNLOCK(amp);
 
 	error = autofs_node_vn(child, vp->v_mount, ap->a_vpp);
 
@@ -427,7 +427,7 @@ autofs_readdir(struct vop_readdir_args *
 	}
 
 	i = 2; /* Account for "." and "..". */
-	AUTOFS_LOCK(amp);
+	AUTOFS_SLOCK(amp);
 	TAILQ_FOREACH(child, &anp->an_children, an_next) {
 		if (resid < AUTOFS_DELEN) {
 			if (ap->a_eofflag != NULL)
@@ -445,14 +445,14 @@ autofs_readdir(struct vop_readdir_args *
 		error = autofs_readdir_one(uio, child->an_name,
 		    child->an_fileno);
 		if (error != 0) {
-			AUTOFS_UNLOCK(amp);
+			AUTOFS_SUNLOCK(amp);
 			return (error);
 		}
 		offset += AUTOFS_DELEN;
 		resid -= AUTOFS_DELEN;
 	}
 
-	AUTOFS_UNLOCK(amp);
+	AUTOFS_SUNLOCK(amp);
 	return (0);
 }
 
@@ -505,7 +505,7 @@ autofs_node_new(struct autofs_node *pare
 	struct autofs_node *anp;
 
 	if (parent != NULL)
-		AUTOFS_ASSERT_LOCKED(parent->an_mount);
+		AUTOFS_ASSERT_XLOCKED(parent->an_mount);
 
 	anp = uma_zalloc(autofs_node_zone, M_WAITOK | M_ZERO);
 	if (namelen >= 0)
@@ -567,7 +567,7 @@ autofs_node_delete(struct autofs_node *a
 {
 	struct autofs_node *parent;
 
-	AUTOFS_ASSERT_LOCKED(anp->an_mount);
+	AUTOFS_ASSERT_XLOCKED(anp->an_mount);
 	KASSERT(TAILQ_EMPTY(&anp->an_children), ("have children"));
 
 	callout_drain(&anp->an_callout);



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