- Pass LK_EXCLUSIVE to VFS_ROOT() to satisfy the new flags argument. For
now, all calls to VFS_ROOT() should still acquire exclusive locks. Sponsored by: Isilon Systems, Inc.
This commit is contained in:
parent
5528d705e8
commit
0210925e42
@ -301,7 +301,7 @@ vfs_setpublicfs(mp, nep, argp)
|
|||||||
bzero(&nfs_pub.np_handle, sizeof(nfs_pub.np_handle));
|
bzero(&nfs_pub.np_handle, sizeof(nfs_pub.np_handle));
|
||||||
nfs_pub.np_handle.fh_fsid = mp->mnt_stat.f_fsid;
|
nfs_pub.np_handle.fh_fsid = mp->mnt_stat.f_fsid;
|
||||||
|
|
||||||
if ((error = VFS_ROOT(mp, &rvp, curthread /* XXX */)))
|
if ((error = VFS_ROOT(mp, LK_EXCLUSIVE, &rvp, curthread /* XXX */)))
|
||||||
return (error);
|
return (error);
|
||||||
|
|
||||||
if ((error = VFS_VPTOFH(rvp, &nfs_pub.np_handle.fh_fid)))
|
if ((error = VFS_VPTOFH(rvp, &nfs_pub.np_handle.fh_fid)))
|
||||||
|
@ -689,7 +689,7 @@ fchdir(td, uap)
|
|||||||
if (vfs_busy(mp, 0, 0, td))
|
if (vfs_busy(mp, 0, 0, td))
|
||||||
continue;
|
continue;
|
||||||
tvfslocked = VFS_LOCK_GIANT(mp);
|
tvfslocked = VFS_LOCK_GIANT(mp);
|
||||||
error = VFS_ROOT(mp, &tdp, td);
|
error = VFS_ROOT(mp, LK_EXCLUSIVE, &tdp, td);
|
||||||
vfs_unbusy(mp, td);
|
vfs_unbusy(mp, td);
|
||||||
if (error) {
|
if (error) {
|
||||||
VFS_UNLOCK_GIANT(tvfslocked);
|
VFS_UNLOCK_GIANT(tvfslocked);
|
||||||
|
@ -584,7 +584,7 @@ unionlookup:
|
|||||||
continue;
|
continue;
|
||||||
VOP_UNLOCK(dp, 0, td);
|
VOP_UNLOCK(dp, 0, td);
|
||||||
tvfslocked = VFS_LOCK_GIANT(mp);
|
tvfslocked = VFS_LOCK_GIANT(mp);
|
||||||
error = VFS_ROOT(mp, &tdp, td);
|
error = VFS_ROOT(mp, LK_EXCLUSIVE, &tdp, td);
|
||||||
vfs_unbusy(mp, td);
|
vfs_unbusy(mp, td);
|
||||||
if (error) {
|
if (error) {
|
||||||
VFS_UNLOCK_GIANT(tvfslocked);
|
VFS_UNLOCK_GIANT(tvfslocked);
|
||||||
|
@ -785,7 +785,7 @@ vfs_domount(
|
|||||||
TAILQ_INSERT_TAIL(&mountlist, mp, mnt_list);
|
TAILQ_INSERT_TAIL(&mountlist, mp, mnt_list);
|
||||||
mtx_unlock(&mountlist_mtx);
|
mtx_unlock(&mountlist_mtx);
|
||||||
vfs_event_signal(NULL, VQ_MOUNT, 0);
|
vfs_event_signal(NULL, VQ_MOUNT, 0);
|
||||||
if (VFS_ROOT(mp, &newdp, td))
|
if (VFS_ROOT(mp, LK_EXCLUSIVE, &newdp, td))
|
||||||
panic("mount: lost mount");
|
panic("mount: lost mount");
|
||||||
mountcheckdirs(vp, newdp);
|
mountcheckdirs(vp, newdp);
|
||||||
vput(newdp);
|
vput(newdp);
|
||||||
@ -946,7 +946,8 @@ dounmount(mp, flags, td)
|
|||||||
* vnode to the covered vnode. For non-forced unmounts we want
|
* vnode to the covered vnode. For non-forced unmounts we want
|
||||||
* such references to cause an EBUSY error.
|
* such references to cause an EBUSY error.
|
||||||
*/
|
*/
|
||||||
if ((flags & MNT_FORCE) && VFS_ROOT(mp, &fsrootvp, td) == 0) {
|
if ((flags & MNT_FORCE) &&
|
||||||
|
VFS_ROOT(mp, LK_EXCLUSIVE, &fsrootvp, td) == 0) {
|
||||||
if (mp->mnt_vnodecovered != NULL)
|
if (mp->mnt_vnodecovered != NULL)
|
||||||
mountcheckdirs(fsrootvp, mp->mnt_vnodecovered);
|
mountcheckdirs(fsrootvp, mp->mnt_vnodecovered);
|
||||||
if (fsrootvp == rootvnode) {
|
if (fsrootvp == rootvnode) {
|
||||||
@ -963,7 +964,8 @@ dounmount(mp, flags, td)
|
|||||||
vn_finished_write(mp);
|
vn_finished_write(mp);
|
||||||
if (error) {
|
if (error) {
|
||||||
/* Undo cdir/rdir and rootvnode changes made above. */
|
/* Undo cdir/rdir and rootvnode changes made above. */
|
||||||
if ((flags & MNT_FORCE) && VFS_ROOT(mp, &fsrootvp, td) == 0) {
|
if ((flags & MNT_FORCE) &&
|
||||||
|
VFS_ROOT(mp, LK_EXCLUSIVE, &fsrootvp, td) == 0) {
|
||||||
if (mp->mnt_vnodecovered != NULL)
|
if (mp->mnt_vnodecovered != NULL)
|
||||||
mountcheckdirs(mp->mnt_vnodecovered, fsrootvp);
|
mountcheckdirs(mp->mnt_vnodecovered, fsrootvp);
|
||||||
if (rootvnode == NULL) {
|
if (rootvnode == NULL) {
|
||||||
@ -1006,7 +1008,7 @@ set_rootvnode(struct thread *td)
|
|||||||
{
|
{
|
||||||
struct proc *p;
|
struct proc *p;
|
||||||
|
|
||||||
if (VFS_ROOT(TAILQ_FIRST(&mountlist), &rootvnode, td))
|
if (VFS_ROOT(TAILQ_FIRST(&mountlist), LK_EXCLUSIVE, &rootvnode, td))
|
||||||
panic("Cannot find root vnode");
|
panic("Cannot find root vnode");
|
||||||
|
|
||||||
p = td->td_proc;
|
p = td->td_proc;
|
||||||
@ -1087,7 +1089,7 @@ devfs_fixup(struct thread *td)
|
|||||||
mtx_unlock(&mountlist_mtx);
|
mtx_unlock(&mountlist_mtx);
|
||||||
cache_purgevfs(mp);
|
cache_purgevfs(mp);
|
||||||
|
|
||||||
VFS_ROOT(mp, &dvp, td);
|
VFS_ROOT(mp, LK_EXCLUSIVE, &dvp, td);
|
||||||
VI_LOCK(dvp);
|
VI_LOCK(dvp);
|
||||||
dvp->v_iflag &= ~VI_MOUNT;
|
dvp->v_iflag &= ~VI_MOUNT;
|
||||||
dvp->v_mountedhere = NULL;
|
dvp->v_mountedhere = NULL;
|
||||||
|
@ -2053,7 +2053,7 @@ vflush(mp, rootrefs, flags, td)
|
|||||||
* Get the filesystem root vnode. We can vput() it
|
* Get the filesystem root vnode. We can vput() it
|
||||||
* immediately, since with rootrefs > 0, it won't go away.
|
* immediately, since with rootrefs > 0, it won't go away.
|
||||||
*/
|
*/
|
||||||
if ((error = VFS_ROOT(mp, &rootvp, td)) != 0)
|
if ((error = VFS_ROOT(mp, LK_EXCLUSIVE, &rootvp, td)) != 0)
|
||||||
return (error);
|
return (error);
|
||||||
vput(rootvp);
|
vput(rootvp);
|
||||||
|
|
||||||
|
@ -689,7 +689,7 @@ fchdir(td, uap)
|
|||||||
if (vfs_busy(mp, 0, 0, td))
|
if (vfs_busy(mp, 0, 0, td))
|
||||||
continue;
|
continue;
|
||||||
tvfslocked = VFS_LOCK_GIANT(mp);
|
tvfslocked = VFS_LOCK_GIANT(mp);
|
||||||
error = VFS_ROOT(mp, &tdp, td);
|
error = VFS_ROOT(mp, LK_EXCLUSIVE, &tdp, td);
|
||||||
vfs_unbusy(mp, td);
|
vfs_unbusy(mp, td);
|
||||||
if (error) {
|
if (error) {
|
||||||
VFS_UNLOCK_GIANT(tvfslocked);
|
VFS_UNLOCK_GIANT(tvfslocked);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user