summaryrefslogtreecommitdiffstats
path: root/sys/ufs
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2003-10-04 14:27:49 +0000
committerjeff <jeff@FreeBSD.org>2003-10-04 14:27:49 +0000
commit563642084e4bbad4ebe8f7856b3afe07e80ecbc9 (patch)
treecc65141ea920e774074801d9ed741f186c2c2979 /sys/ufs
parentc960cfdda5f812eabc7623c6b460785856f3346c (diff)
downloadFreeBSD-src-563642084e4bbad4ebe8f7856b3afe07e80ecbc9.zip
FreeBSD-src-563642084e4bbad4ebe8f7856b3afe07e80ecbc9.tar.gz
- Increase the scope of the interlock in ffs_reload(). Acquire it before
we release the mntvnode_mtx. - Call vgonel() directly instead of going through vrecycle() since we own the interlock now. - Remove a few cases where we locked the interlock just so that we could call VOP_UNLOCK with interlock held.
Diffstat (limited to 'sys/ufs')
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
index 5aa877e..3123b3d 100644
--- a/sys/ufs/ffs/ffs_vfsops.c
+++ b/sys/ufs/ffs/ffs_vfsops.c
@@ -428,9 +428,7 @@ ffs_reload(mp, cred, td)
if (vn_isdisk(devvp, NULL)) {
vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
vfs_object_create(devvp, td, td->td_ucred);
- /* XXX Why lock only to release immediately?? */
- mtx_lock(&devvp->v_interlock);
- VOP_UNLOCK(devvp, LK_INTERLOCK, td);
+ VOP_UNLOCK(devvp, 0, td);
}
/*
@@ -504,17 +502,18 @@ loop:
goto loop;
}
nvp = TAILQ_NEXT(vp, v_nmntvnodes);
+ VI_LOCK(vp);
mtx_unlock(&mntvnode_mtx);
/*
* Step 4: invalidate all inactive vnodes.
*/
- if (vrecycle(vp, NULL, td))
+ if (vp->v_usecount == 0) {
+ vgonel(vp, td);
goto loop;
+ }
/*
* Step 5: invalidate all cached file data.
*/
- /* XXX Why lock only to release immediately? */
- mtx_lock(&vp->v_interlock);
if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, td)) {
goto loop;
}
@@ -597,9 +596,7 @@ ffs_mountfs(devvp, mp, td)
if (vn_isdisk(devvp, NULL)) {
vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
vfs_object_create(devvp, td, cred);
- /* XXX Why lock only to release immediately?? */
- mtx_lock(&devvp->v_interlock);
- VOP_UNLOCK(devvp, LK_INTERLOCK, td);
+ VOP_UNLOCK(devvp, 0, td);
}
ronly = (mp->mnt_flag & MNT_RDONLY) != 0;
OpenPOWER on IntegriCloud