Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 31 Jul 2009 13:40:06 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r195995 - in head/sys: fs/unionfs kern
Message-ID:  <200907311340.n6VDe69W070631@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Fri Jul 31 13:40:06 2009
New Revision: 195995
URL: http://svn.freebsd.org/changeset/base/195995

Log:
  Fix some LORs between vnode locks and filedescriptor table locks.
  - Don't grab the filedesc lock just to read fd_cmask.
  - Drop vnode locks earlier when mounting the root filesystem and before
    sanitizing stdin/out/err file descriptors during execve().
  
  Submitted by:	kib
  Approved by:	re (rwatson)
  MFC after:	1 week

Modified:
  head/sys/fs/unionfs/union_subr.c
  head/sys/kern/kern_exec.c
  head/sys/kern/vfs_mount.c
  head/sys/kern/vfs_syscalls.c

Modified: head/sys/fs/unionfs/union_subr.c
==============================================================================
--- head/sys/fs/unionfs/union_subr.c	Fri Jul 31 12:52:32 2009	(r195994)
+++ head/sys/fs/unionfs/union_subr.c	Fri Jul 31 13:40:06 2009	(r195995)
@@ -486,9 +486,7 @@ unionfs_create_uppervattr_core(struct un
 		}
 		break;
 	default:		/* UNIONFS_TRADITIONAL */
-		FILEDESC_SLOCK(td->td_proc->p_fd);
 		uva->va_mode = 0777 & ~td->td_proc->p_fd->fd_cmask;
-		FILEDESC_SUNLOCK(td->td_proc->p_fd);
 		uva->va_uid = ump->um_uid;
 		uva->va_gid = ump->um_gid;
 		break;

Modified: head/sys/kern/kern_exec.c
==============================================================================
--- head/sys/kern/kern_exec.c	Fri Jul 31 12:52:32 2009	(r195994)
+++ head/sys/kern/kern_exec.c	Fri Jul 31 13:40:06 2009	(r195995)
@@ -673,8 +673,8 @@ interpret:
 		 * allocate memory, so temporarily drop the process lock.
 		 */
 		PROC_UNLOCK(p);
-		setugidsafety(td);
 		VOP_UNLOCK(imgp->vp, 0);
+		setugidsafety(td);
 		error = fdcheckstd(td);
 		vn_lock(imgp->vp, LK_EXCLUSIVE | LK_RETRY);
 		if (error != 0)

Modified: head/sys/kern/vfs_mount.c
==============================================================================
--- head/sys/kern/vfs_mount.c	Fri Jul 31 12:52:32 2009	(r195994)
+++ head/sys/kern/vfs_mount.c	Fri Jul 31 13:40:06 2009	(r195995)
@@ -1069,9 +1069,10 @@ vfs_domount(
 		vfs_event_signal(NULL, VQ_MOUNT, 0);
 		if (VFS_ROOT(mp, LK_EXCLUSIVE, &newdp))
 			panic("mount: lost mount");
-		mountcheckdirs(vp, newdp);
-		vput(newdp);
+		VOP_UNLOCK(newdp, 0);
 		VOP_UNLOCK(vp, 0);
+		mountcheckdirs(vp, newdp);
+		vrele(newdp);
 		if ((mp->mnt_flag & MNT_RDONLY) == 0)
 			error = vfs_allocate_syncvnode(mp);
 		vfs_unbusy(mp);
@@ -1480,6 +1481,8 @@ set_rootvnode()
 	if (VFS_ROOT(TAILQ_FIRST(&mountlist), LK_EXCLUSIVE, &rootvnode))
 		panic("Cannot find root vnode");
 
+	VOP_UNLOCK(rootvnode, 0);
+
 	p = curthread->td_proc;
 	FILEDESC_XLOCK(p->p_fd);
 
@@ -1495,8 +1498,6 @@ set_rootvnode()
 
 	FILEDESC_XUNLOCK(p->p_fd);
 
-	VOP_UNLOCK(rootvnode, 0);
-
 	EVENTHANDLER_INVOKE(mountroot);
 }
 

Modified: head/sys/kern/vfs_syscalls.c
==============================================================================
--- head/sys/kern/vfs_syscalls.c	Fri Jul 31 12:52:32 2009	(r195994)
+++ head/sys/kern/vfs_syscalls.c	Fri Jul 31 13:40:06 2009	(r195995)
@@ -1307,10 +1307,8 @@ restart:
 		return (EEXIST);
 	} else {
 		VATTR_NULL(&vattr);
-		FILEDESC_SLOCK(td->td_proc->p_fd);
 		vattr.va_mode = (mode & ALLPERMS) &
 		    ~td->td_proc->p_fd->fd_cmask;
-		FILEDESC_SUNLOCK(td->td_proc->p_fd);
 		vattr.va_rdev = dev;
 		whiteout = 0;
 
@@ -1442,9 +1440,7 @@ restart:
 	}
 	VATTR_NULL(&vattr);
 	vattr.va_type = VFIFO;
-	FILEDESC_SLOCK(td->td_proc->p_fd);
 	vattr.va_mode = (mode & ALLPERMS) & ~td->td_proc->p_fd->fd_cmask;
-	FILEDESC_SUNLOCK(td->td_proc->p_fd);
 #ifdef MAC
 	error = mac_vnode_check_create(td->td_ucred, nd.ni_dvp, &nd.ni_cnd,
 	    &vattr);
@@ -1705,9 +1701,7 @@ restart:
 		goto restart;
 	}
 	VATTR_NULL(&vattr);
-	FILEDESC_SLOCK(td->td_proc->p_fd);
 	vattr.va_mode = ACCESSPERMS &~ td->td_proc->p_fd->fd_cmask;
-	FILEDESC_SUNLOCK(td->td_proc->p_fd);
 #ifdef MAC
 	vattr.va_type = VLNK;
 	error = mac_vnode_check_create(td->td_ucred, nd.ni_dvp, &nd.ni_cnd,
@@ -3773,9 +3767,7 @@ restart:
 	}
 	VATTR_NULL(&vattr);
 	vattr.va_type = VDIR;
-	FILEDESC_SLOCK(td->td_proc->p_fd);
 	vattr.va_mode = (mode & ACCESSPERMS) &~ td->td_proc->p_fd->fd_cmask;
-	FILEDESC_SUNLOCK(td->td_proc->p_fd);
 #ifdef MAC
 	error = mac_vnode_check_create(td->td_ucred, nd.ni_dvp, &nd.ni_cnd,
 	    &vattr);



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