diff options
author | jhb <jhb@FreeBSD.org> | 2009-07-31 13:40:06 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2009-07-31 13:40:06 +0000 |
commit | 03d158678f1be45d0a053a2a17d0882d192ad011 (patch) | |
tree | 3c0ee46bb65f1cead854a069eba0dc7df6fddee0 /sys/kern/vfs_mount.c | |
parent | ee695c0b4b51fdb522a1706339d3476b2cbe0982 (diff) | |
download | FreeBSD-src-03d158678f1be45d0a053a2a17d0882d192ad011.zip FreeBSD-src-03d158678f1be45d0a053a2a17d0882d192ad011.tar.gz |
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
Diffstat (limited to 'sys/kern/vfs_mount.c')
-rw-r--r-- | sys/kern/vfs_mount.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c index f304ec6..15899ce 100644 --- a/sys/kern/vfs_mount.c +++ b/sys/kern/vfs_mount.c @@ -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); } |