summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2006-02-01 09:30:44 +0000
committerjeff <jeff@FreeBSD.org>2006-02-01 09:30:44 +0000
commit3f7fc03f58b6d7e710661232b87d5932117c195d (patch)
treefae88a71d114e0a7a1bffd35e890c245982648fe
parentbb523fe1d2b1e56993ad53c1d4cb8241b80b27a8 (diff)
downloadFreeBSD-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.c5
-rw-r--r--sys/kern/vfs_syscalls.c5
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);
}
OpenPOWER on IntegriCloud