summaryrefslogtreecommitdiffstats
path: root/sys/ufs
diff options
context:
space:
mode:
authormckusick <mckusick@FreeBSD.org>2012-04-17 16:28:22 +0000
committermckusick <mckusick@FreeBSD.org>2012-04-17 16:28:22 +0000
commitffee40eeff5500634fb5111e387f11dee781d197 (patch)
tree0e74691cb191897ed22ab84b20109f1b4147b16d /sys/ufs
parent7f09aee7a12feb487299902e6c6ec4c3ae44cdf3 (diff)
downloadFreeBSD-src-ffee40eeff5500634fb5111e387f11dee781d197.zip
FreeBSD-src-ffee40eeff5500634fb5111e387f11dee781d197.tar.gz
Replace the MNT_VNODE_FOREACH interface with MNT_VNODE_FOREACH_ALL.
The primary changes are that the user of the interface no longer needs to manage the mount-mutex locking and that the vnode that is returned has its mutex locked (thus avoiding the need to check to see if its is DOOMED or other possible end of life senarios). To minimize compatibility issues for third-party developers, the old MNT_VNODE_FOREACH interface will remain available so that this change can be MFC'ed to 9. Following the MFC to 9, MNT_VNODE_FOREACH will be removed in head. The reason for this update is to prepare for the addition of the MNT_VNODE_FOREACH_ACTIVE interface that will loop over just the active vnodes associated with a mount point (typically less than 1% of the vnodes associated with the mount point). Reviewed by: kib Tested by: Peter Holm MFC after: 2 weeks
Diffstat (limited to 'sys/ufs')
-rw-r--r--sys/ufs/ffs/ffs_snapshot.c36
-rw-r--r--sys/ufs/ffs/ffs_softdep.c12
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c60
-rw-r--r--sys/ufs/ufs/ufs_quota.c34
4 files changed, 36 insertions, 106 deletions
diff --git a/sys/ufs/ffs/ffs_snapshot.c b/sys/ufs/ffs/ffs_snapshot.c
index 4f90ef6..c7449f0 100644
--- a/sys/ufs/ffs/ffs_snapshot.c
+++ b/sys/ufs/ffs/ffs_snapshot.c
@@ -522,17 +522,14 @@ restart:
FSMAXSNAP + 1 /* superblock */ + 1 /* last block */ + 1 /* size */;
MNT_ILOCK(mp);
mp->mnt_kern_flag &= ~MNTK_SUSPENDED;
+ MNT_IUNLOCK(mp);
loop:
- MNT_VNODE_FOREACH(xvp, mp, mvp) {
- VI_LOCK(xvp);
- MNT_IUNLOCK(mp);
- if ((xvp->v_iflag & VI_DOOMED) ||
- (xvp->v_usecount == 0 &&
+ MNT_VNODE_FOREACH_ALL(xvp, mp, mvp) {
+ if ((xvp->v_usecount == 0 &&
(xvp->v_iflag & (VI_OWEINACT | VI_DOINGINACT)) == 0) ||
xvp->v_type == VNON ||
IS_SNAPSHOT(VTOI(xvp))) {
VI_UNLOCK(xvp);
- MNT_ILOCK(mp);
continue;
}
/*
@@ -541,13 +538,11 @@ loop:
*/
if (xvp == nd.ni_dvp) {
VI_UNLOCK(xvp);
- MNT_ILOCK(mp);
continue;
}
vholdl(xvp);
if (vn_lock(xvp, LK_EXCLUSIVE | LK_INTERLOCK) != 0) {
- MNT_ILOCK(mp);
- MNT_VNODE_FOREACH_ABORT_ILOCKED(mp, mvp);
+ MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp);
vdrop(xvp);
goto loop;
}
@@ -557,7 +552,6 @@ loop:
VI_UNLOCK(xvp);
VOP_UNLOCK(xvp, 0);
vdrop(xvp);
- MNT_ILOCK(mp);
continue;
}
VI_UNLOCK(xvp);
@@ -567,14 +561,12 @@ loop:
vat.va_nlink > 0) {
VOP_UNLOCK(xvp, 0);
vdrop(xvp);
- MNT_ILOCK(mp);
continue;
}
xp = VTOI(xvp);
if (ffs_checkfreefile(copy_fs, vp, xp->i_number)) {
VOP_UNLOCK(xvp, 0);
vdrop(xvp);
- MNT_ILOCK(mp);
continue;
}
/*
@@ -610,12 +602,10 @@ loop:
free(copy_fs->fs_csp, M_UFSMNT);
free(copy_fs, M_UFSMNT);
copy_fs = NULL;
- MNT_VNODE_FOREACH_ABORT(mp, mvp);
+ MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp);
goto out1;
}
- MNT_ILOCK(mp);
}
- MNT_IUNLOCK(mp);
/*
* Erase the journal file from the snapshot.
*/
@@ -2532,31 +2522,26 @@ process_deferred_inactive(struct mount *mp)
td = curthread;
(void) vn_start_secondary_write(NULL, &mp, V_WAIT);
- MNT_ILOCK(mp);
loop:
- MNT_VNODE_FOREACH(vp, mp, mvp) {
- VI_LOCK(vp);
+ MNT_VNODE_FOREACH_ALL(vp, mp, mvp) {
/*
* IN_LAZYACCESS is checked here without holding any
* vnode lock, but this flag is set only while holding
* vnode interlock.
*/
- if (vp->v_type == VNON || (vp->v_iflag & VI_DOOMED) != 0 ||
+ if (vp->v_type == VNON ||
((VTOI(vp)->i_flag & IN_LAZYACCESS) == 0 &&
- ((vp->v_iflag & VI_OWEINACT) == 0 ||
- vp->v_usecount > 0))) {
+ ((vp->v_iflag & VI_OWEINACT) == 0 || vp->v_usecount > 0))) {
VI_UNLOCK(vp);
continue;
}
- MNT_IUNLOCK(mp);
vholdl(vp);
error = vn_lock(vp, LK_EXCLUSIVE | LK_INTERLOCK);
if (error != 0) {
vdrop(vp);
- MNT_ILOCK(mp);
if (error == ENOENT)
continue; /* vnode recycled */
- MNT_VNODE_FOREACH_ABORT_ILOCKED(mp, mvp);
+ MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp);
goto loop;
}
ip = VTOI(vp);
@@ -2569,7 +2554,6 @@ process_deferred_inactive(struct mount *mp)
VI_UNLOCK(vp);
VOP_UNLOCK(vp, 0);
vdrop(vp);
- MNT_ILOCK(mp);
continue;
}
vinactive(vp, td);
@@ -2578,9 +2562,7 @@ process_deferred_inactive(struct mount *mp)
VI_UNLOCK(vp);
VOP_UNLOCK(vp, 0);
vdrop(vp);
- MNT_ILOCK(mp);
}
- MNT_IUNLOCK(mp);
vn_finished_secondary_write(mp);
}
diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c
index a435738..dcf9622 100644
--- a/sys/ufs/ffs/ffs_softdep.c
+++ b/sys/ufs/ffs/ffs_softdep.c
@@ -12642,29 +12642,21 @@ retry:
fs->fs_cstotal.cs_nbfree <= needed) ||
(resource == FLUSH_INODES_WAIT && fs->fs_pendinginodes > 0 &&
fs->fs_cstotal.cs_nifree <= needed)) {
- MNT_ILOCK(mp);
- MNT_VNODE_FOREACH(lvp, mp, mvp) {
- VI_LOCK(lvp);
+ MNT_VNODE_FOREACH_ALL(lvp, mp, mvp) {
if (TAILQ_FIRST(&lvp->v_bufobj.bo_dirty.bv_hd) == 0) {
VI_UNLOCK(lvp);
continue;
}
- MNT_IUNLOCK(mp);
if (vget(lvp, LK_EXCLUSIVE | LK_INTERLOCK | LK_NOWAIT,
- curthread)) {
- MNT_ILOCK(mp);
+ curthread))
continue;
- }
if (lvp->v_vflag & VV_NOSYNC) { /* unlinked */
vput(lvp);
- MNT_ILOCK(mp);
continue;
}
(void) ffs_syncvnode(lvp, MNT_NOWAIT, 0);
vput(lvp);
- MNT_ILOCK(mp);
}
- MNT_IUNLOCK(mp);
lvp = ump->um_devvp;
if (vn_lock(lvp, LK_EXCLUSIVE | LK_NOWAIT) == 0) {
VOP_FSYNC(lvp, MNT_NOWAIT, curthread);
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
index 936445a..7faf018 100644
--- a/sys/ufs/ffs/ffs_vfsops.c
+++ b/sys/ufs/ffs/ffs_vfsops.c
@@ -705,19 +705,12 @@ ffs_reload(struct mount *mp, struct thread *td)
}
loop:
- MNT_ILOCK(mp);
- MNT_VNODE_FOREACH(vp, mp, mvp) {
- VI_LOCK(vp);
- if (vp->v_iflag & VI_DOOMED) {
- VI_UNLOCK(vp);
- continue;
- }
- MNT_IUNLOCK(mp);
+ MNT_VNODE_FOREACH_ALL(vp, mp, mvp) {
/*
* Step 4: invalidate all cached file data.
*/
if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, td)) {
- MNT_VNODE_FOREACH_ABORT(mp, mvp);
+ MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp);
goto loop;
}
if (vinvalbuf(vp, 0, 0, 0))
@@ -732,7 +725,7 @@ loop:
if (error) {
VOP_UNLOCK(vp, 0);
vrele(vp);
- MNT_VNODE_FOREACH_ABORT(mp, mvp);
+ MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp);
return (error);
}
ffs_load_inode(bp, ip, fs, ip->i_number);
@@ -740,9 +733,7 @@ loop:
brelse(bp);
VOP_UNLOCK(vp, 0);
vrele(vp);
- MNT_ILOCK(mp);
}
- MNT_IUNLOCK(mp);
return (0);
}
@@ -1441,10 +1432,8 @@ ffs_sync_lazy(mp)
td = curthread;
if ((mp->mnt_flag & MNT_NOATIME) != 0)
goto qupdate;
- MNT_ILOCK(mp);
- MNT_VNODE_FOREACH(vp, mp, mvp) {
- VI_LOCK(vp);
- if (vp->v_iflag & VI_DOOMED || vp->v_type == VNON) {
+ MNT_VNODE_FOREACH_ALL(vp, mp, mvp) {
+ if (vp->v_type == VNON) {
VI_UNLOCK(vp);
continue;
}
@@ -1462,19 +1451,14 @@ ffs_sync_lazy(mp)
VI_UNLOCK(vp);
continue;
}
- MNT_IUNLOCK(mp);
if ((error = vget(vp, LK_EXCLUSIVE | LK_NOWAIT | LK_INTERLOCK,
- td)) != 0) {
- MNT_ILOCK(mp);
+ td)) != 0)
continue;
- }
error = ffs_update(vp, 0);
if (error != 0)
allerror = error;
vput(vp);
- MNT_ILOCK(mp);
}
- MNT_IUNLOCK(mp);
qupdate:
#ifdef QUOTA
@@ -1538,41 +1522,37 @@ ffs_sync(mp, waitfor)
lockreq = LK_EXCLUSIVE;
}
lockreq |= LK_INTERLOCK | LK_SLEEPFAIL;
- MNT_ILOCK(mp);
loop:
/* Grab snapshot of secondary write counts */
+ MNT_ILOCK(mp);
secondary_writes = mp->mnt_secondary_writes;
secondary_accwrites = mp->mnt_secondary_accwrites;
+ MNT_IUNLOCK(mp);
/* Grab snapshot of softdep dependency counts */
- MNT_IUNLOCK(mp);
softdep_get_depcounts(mp, &softdep_deps, &softdep_accdeps);
- MNT_ILOCK(mp);
- MNT_VNODE_FOREACH(vp, mp, mvp) {
+ MNT_VNODE_FOREACH_ALL(vp, mp, mvp) {
/*
* Depend on the vnode interlock to keep things stable enough
* for a quick test. Since there might be hundreds of
* thousands of vnodes, we cannot afford even a subroutine
* call unless there's a good chance that we have work to do.
*/
- VI_LOCK(vp);
- if (vp->v_iflag & VI_DOOMED) {
+ if (vp->v_type == VNON) {
VI_UNLOCK(vp);
continue;
}
ip = VTOI(vp);
- if (vp->v_type == VNON || ((ip->i_flag &
+ if ((ip->i_flag &
(IN_ACCESS | IN_CHANGE | IN_MODIFIED | IN_UPDATE)) == 0 &&
- vp->v_bufobj.bo_dirty.bv_cnt == 0)) {
+ vp->v_bufobj.bo_dirty.bv_cnt == 0) {
VI_UNLOCK(vp);
continue;
}
- MNT_IUNLOCK(mp);
if ((error = vget(vp, lockreq, td)) != 0) {
- MNT_ILOCK(mp);
if (error == ENOENT || error == ENOLCK) {
- MNT_VNODE_FOREACH_ABORT_ILOCKED(mp, mvp);
+ MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp);
goto loop;
}
continue;
@@ -1580,9 +1560,7 @@ loop:
if ((error = ffs_syncvnode(vp, waitfor, 0)) != 0)
allerror = error;
vput(vp);
- MNT_ILOCK(mp);
}
- MNT_IUNLOCK(mp);
/*
* Force stale filesystem control information to be flushed.
*/
@@ -1590,10 +1568,8 @@ loop:
if ((error = softdep_flushworklist(ump->um_mountp, &count, td)))
allerror = error;
/* Flushed work items may create new vnodes to clean */
- if (allerror == 0 && count) {
- MNT_ILOCK(mp);
+ if (allerror == 0 && count)
goto loop;
- }
}
#ifdef QUOTA
qsync(mp);
@@ -1608,18 +1584,18 @@ loop:
if ((error = VOP_FSYNC(devvp, waitfor, td)) != 0)
allerror = error;
VOP_UNLOCK(devvp, 0);
- if (allerror == 0 && waitfor == MNT_WAIT) {
- MNT_ILOCK(mp);
+ if (allerror == 0 && waitfor == MNT_WAIT)
goto loop;
- }
} else if (suspend != 0) {
if (softdep_check_suspend(mp,
devvp,
softdep_deps,
softdep_accdeps,
secondary_writes,
- secondary_accwrites) != 0)
+ secondary_accwrites) != 0) {
+ MNT_IUNLOCK(mp);
goto loop; /* More work needed */
+ }
mtx_assert(MNT_MTX(mp), MA_OWNED);
mp->mnt_kern_flag |= MNTK_SUSPEND2 | MNTK_SUSPENDED;
MNT_IUNLOCK(mp);
diff --git a/sys/ufs/ufs/ufs_quota.c b/sys/ufs/ufs/ufs_quota.c
index c98662a..30c28c4e 100644
--- a/sys/ufs/ufs/ufs_quota.c
+++ b/sys/ufs/ufs/ufs_quota.c
@@ -598,32 +598,25 @@ quotaon(struct thread *td, struct mount *mp, int type, void *fname)
* adding references to quota file being opened.
* NB: only need to add dquot's for inodes being modified.
*/
- MNT_ILOCK(mp);
again:
- MNT_VNODE_FOREACH(vp, mp, mvp) {
- VI_LOCK(vp);
- MNT_IUNLOCK(mp);
+ MNT_VNODE_FOREACH_ALL(vp, mp, mvp) {
if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, td)) {
- MNT_ILOCK(mp);
- MNT_VNODE_FOREACH_ABORT_ILOCKED(mp, mvp);
+ MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp);
goto again;
}
if (vp->v_type == VNON || vp->v_writecount == 0) {
VOP_UNLOCK(vp, 0);
vrele(vp);
- MNT_ILOCK(mp);
continue;
}
error = getinoquota(VTOI(vp));
VOP_UNLOCK(vp, 0);
vrele(vp);
- MNT_ILOCK(mp);
if (error) {
- MNT_VNODE_FOREACH_ABORT_ILOCKED(mp, mvp);
+ MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp);
break;
}
}
- MNT_IUNLOCK(mp);
if (error)
quotaoff_inchange(td, mp, type);
@@ -669,19 +662,14 @@ quotaoff1(struct thread *td, struct mount *mp, int type)
* Search vnodes associated with this mount point,
* deleting any references to quota file being closed.
*/
- MNT_ILOCK(mp);
again:
- MNT_VNODE_FOREACH(vp, mp, mvp) {
- VI_LOCK(vp);
- MNT_IUNLOCK(mp);
+ MNT_VNODE_FOREACH_ALL(vp, mp, mvp) {
if (vp->v_type == VNON) {
VI_UNLOCK(vp);
- MNT_ILOCK(mp);
continue;
}
if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, td)) {
- MNT_ILOCK(mp);
- MNT_VNODE_FOREACH_ABORT_ILOCKED(mp, mvp);
+ MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp);
goto again;
}
ip = VTOI(vp);
@@ -690,9 +678,7 @@ again:
dqrele(vp, dq);
VOP_UNLOCK(vp, 0);
vrele(vp);
- MNT_ILOCK(mp);
}
- MNT_IUNLOCK(mp);
dqflush(qvp);
/* Clear um_quotas before closing the quota vnode to prevent
@@ -1057,20 +1043,16 @@ qsync(struct mount *mp)
* Search vnodes associated with this mount point,
* synchronizing any modified dquot structures.
*/
- MNT_ILOCK(mp);
again:
- MNT_VNODE_FOREACH(vp, mp, mvp) {
- VI_LOCK(vp);
+ MNT_VNODE_FOREACH_ALL(vp, mp, mvp) {
if (vp->v_type == VNON) {
VI_UNLOCK(vp);
continue;
}
- MNT_IUNLOCK(mp);
error = vget(vp, LK_EXCLUSIVE | LK_INTERLOCK, td);
if (error) {
- MNT_ILOCK(mp);
if (error == ENOENT) {
- MNT_VNODE_FOREACH_ABORT_ILOCKED(mp, mvp);
+ MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp);
goto again;
}
continue;
@@ -1081,9 +1063,7 @@ again:
dqsync(vp, dq);
}
vput(vp);
- MNT_ILOCK(mp);
}
- MNT_IUNLOCK(mp);
return (0);
}
OpenPOWER on IntegriCloud