diff options
author | jeff <jeff@FreeBSD.org> | 2006-02-01 09:30:44 +0000 |
---|---|---|
committer | jeff <jeff@FreeBSD.org> | 2006-02-01 09:30:44 +0000 |
commit | 3f7fc03f58b6d7e710661232b87d5932117c195d (patch) | |
tree | fae88a71d114e0a7a1bffd35e890c245982648fe | |
parent | bb523fe1d2b1e56993ad53c1d4cb8241b80b27a8 (diff) | |
download | FreeBSD-src-3f7fc03f58b6d7e710661232b87d5932117c195d.zip FreeBSD-src-3f7fc03f58b6d7e710661232b87d5932117c195d.tar.gz |
- chroot and chdir need to lock giant as appropriate for the outgoing vp
as well as the new vp.
Sponsored by: Isilon Systems, Inc.
MFC After: 3 days
-rw-r--r-- | sys/kern/vfs_extattr.c | 5 | ||||
-rw-r--r-- | sys/kern/vfs_syscalls.c | 5 |
2 files changed, 10 insertions, 0 deletions
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c index deff4a73..0a83c70 100644 --- a/sys/kern/vfs_extattr.c +++ b/sys/kern/vfs_extattr.c @@ -759,11 +759,13 @@ kern_chdir(struct thread *td, char *path, enum uio_seg pathseg) return (error); } VOP_UNLOCK(nd.ni_vp, 0, td); + VFS_UNLOCK_GIANT(vfslocked); NDFREE(&nd, NDF_ONLY_PNBUF); FILEDESC_LOCK_FAST(fdp); vp = fdp->fd_cdir; fdp->fd_cdir = nd.ni_vp; FILEDESC_UNLOCK_FAST(fdp); + vfslocked = VFS_LOCK_GIANT(vp->v_mount); vrele(vp); VFS_UNLOCK_GIANT(vfslocked); return (0); @@ -891,6 +893,7 @@ change_root(vp, td) { struct filedesc *fdp; struct vnode *oldvp; + int vfslocked; int error; VFS_ASSERT_GIANT(vp->v_mount); @@ -912,7 +915,9 @@ change_root(vp, td) VREF(fdp->fd_jdir); } FILEDESC_UNLOCK(fdp); + vfslocked = VFS_LOCK_GIANT(oldvp->v_mount); vrele(oldvp); + VFS_UNLOCK_GIANT(vfslocked); return (0); } diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index deff4a73..0a83c70 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -759,11 +759,13 @@ kern_chdir(struct thread *td, char *path, enum uio_seg pathseg) return (error); } VOP_UNLOCK(nd.ni_vp, 0, td); + VFS_UNLOCK_GIANT(vfslocked); NDFREE(&nd, NDF_ONLY_PNBUF); FILEDESC_LOCK_FAST(fdp); vp = fdp->fd_cdir; fdp->fd_cdir = nd.ni_vp; FILEDESC_UNLOCK_FAST(fdp); + vfslocked = VFS_LOCK_GIANT(vp->v_mount); vrele(vp); VFS_UNLOCK_GIANT(vfslocked); return (0); @@ -891,6 +893,7 @@ change_root(vp, td) { struct filedesc *fdp; struct vnode *oldvp; + int vfslocked; int error; VFS_ASSERT_GIANT(vp->v_mount); @@ -912,7 +915,9 @@ change_root(vp, td) VREF(fdp->fd_jdir); } FILEDESC_UNLOCK(fdp); + vfslocked = VFS_LOCK_GIANT(oldvp->v_mount); vrele(oldvp); + VFS_UNLOCK_GIANT(vfslocked); return (0); } |