svn commit: r272596 - head/sys/fs/devfs

Mateusz Guzik mjg at FreeBSD.org
Mon Oct 6 06:20:36 UTC 2014


Author: mjg
Date: Mon Oct  6 06:20:35 2014
New Revision: 272596
URL: https://svnweb.freebsd.org/changeset/base/272596

Log:
  devfs: don't take proctree_lock unconditionally in devfs_close
  
  MFC after:	1 week

Modified:
  head/sys/fs/devfs/devfs_vnops.c

Modified: head/sys/fs/devfs/devfs_vnops.c
==============================================================================
--- head/sys/fs/devfs/devfs_vnops.c	Mon Oct  6 06:19:54 2014	(r272595)
+++ head/sys/fs/devfs/devfs_vnops.c	Mon Oct  6 06:20:35 2014	(r272596)
@@ -546,19 +546,22 @@ devfs_close(struct vop_close_args *ap)
 	 * plus the session), release the reference from the session.
 	 */
 	oldvp = NULL;
-	sx_xlock(&proctree_lock);
 	if (td && vp == td->td_proc->p_session->s_ttyvp) {
-		SESS_LOCK(td->td_proc->p_session);
-		VI_LOCK(vp);
-		if (count_dev(dev) == 2 && (vp->v_iflag & VI_DOOMED) == 0) {
-			td->td_proc->p_session->s_ttyvp = NULL;
-			td->td_proc->p_session->s_ttydp = NULL;
-			oldvp = vp;
+		sx_xlock(&proctree_lock);
+		if (vp == td->td_proc->p_session->s_ttyvp) {
+			SESS_LOCK(td->td_proc->p_session);
+			VI_LOCK(vp);
+			if (count_dev(dev) == 2 &&
+			    (vp->v_iflag & VI_DOOMED) == 0) {
+				td->td_proc->p_session->s_ttyvp = NULL;
+				td->td_proc->p_session->s_ttydp = NULL;
+				oldvp = vp;
+			}
+			VI_UNLOCK(vp);
+			SESS_UNLOCK(td->td_proc->p_session);
 		}
-		VI_UNLOCK(vp);
-		SESS_UNLOCK(td->td_proc->p_session);
+		sx_xunlock(&proctree_lock);
 	}
-	sx_xunlock(&proctree_lock);
 	if (oldvp != NULL)
 		vrele(oldvp);
 	/*


More information about the svn-src-head mailing list