diff options
author | phk <phk@FreeBSD.org> | 2004-10-21 15:53:54 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2004-10-21 15:53:54 +0000 |
commit | 3833976d1250bf118a46939f409012d87e558de6 (patch) | |
tree | 9d355bca75100170618443d740a1312fd842af5d /sys/ufs | |
parent | fdf614c0bad1564664cac5105be08477d1bcdd72 (diff) | |
download | FreeBSD-src-3833976d1250bf118a46939f409012d87e558de6.zip FreeBSD-src-3833976d1250bf118a46939f409012d87e558de6.tar.gz |
Move the VI_BWAIT flag into no bo_flag element of bufobj and call it BO_WWAIT
Add bufobj_wref(), bufobj_wdrop() and bufobj_wwait() to handle the write
count on a bufobj. Bufobj_wdrop() replaces vwakeup().
Use these functions all relevant places except in ffs_softdep.c where
the use if interlocked_sleep() makes this impossible.
Rename b_vnbufs to b_bobufs now that we touch all the relevant files anyway.
Diffstat (limited to 'sys/ufs')
-rw-r--r-- | sys/ufs/ffs/ffs_rawread.c | 7 | ||||
-rw-r--r-- | sys/ufs/ffs/ffs_softdep.c | 13 | ||||
-rw-r--r-- | sys/ufs/ffs/ffs_vnops.c | 10 |
3 files changed, 12 insertions, 18 deletions
diff --git a/sys/ufs/ffs/ffs_rawread.c b/sys/ufs/ffs/ffs_rawread.c index fcc6193..e5cc03e 100644 --- a/sys/ufs/ffs/ffs_rawread.c +++ b/sys/ufs/ffs/ffs_rawread.c @@ -137,12 +137,9 @@ ffs_rawread_sync(struct vnode *vp, struct thread *td) /* Wait for pending writes to complete */ spl = splbio(); while (vp->v_numoutput) { - vp->v_iflag |= VI_BWAIT; - error = msleep((caddr_t)&vp->v_numoutput, - VI_MTX(vp), - PRIBIO + 1, - "rawrdfls", 0); + error = bufobj_wwait(&vp->v_bufobj, 0, 0); if (error != 0) { + /* XXX: can't happen with a zero timeout ??? */ splx(spl); VI_UNLOCK(vp); if (upgraded != 0) diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c index 435e32d..aeaa867 100644 --- a/sys/ufs/ffs/ffs_softdep.c +++ b/sys/ufs/ffs/ffs_softdep.c @@ -2068,7 +2068,7 @@ softdep_setup_freeblocks(ip, length, flags) VI_LOCK(vp); drain_output(vp, 1); restart: - TAILQ_FOREACH(bp, &vp->v_dirtyblkhd, b_vnbufs) { + TAILQ_FOREACH(bp, &vp->v_dirtyblkhd, b_bobufs) { if (((flags & IO_EXT) == 0 && (bp->b_xflags & BX_ALTDATA)) || ((flags & IO_NORMAL) == 0 && (bp->b_xflags & BX_ALTDATA) == 0)) @@ -4925,7 +4925,7 @@ softdep_fsync_mountdev(vp) ACQUIRE_LOCK(&lk); VI_LOCK(vp); for (bp = TAILQ_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { - nbp = TAILQ_NEXT(bp, b_vnbufs); + nbp = TAILQ_NEXT(bp, b_bobufs); /* * If it is already scheduled, skip to the next buffer. */ @@ -5185,7 +5185,7 @@ loop: return (error); } VI_LOCK(vp); - nbp = getdirtybuf(&TAILQ_NEXT(bp, b_vnbufs), VI_MTX(vp), MNT_WAIT); + nbp = getdirtybuf(&TAILQ_NEXT(bp, b_bobufs), VI_MTX(vp), MNT_WAIT); if (nbp == NULL) VI_UNLOCK(vp); FREE_LOCK(&lk); @@ -5926,9 +5926,10 @@ drain_output(vp, islocked) if (!islocked) ACQUIRE_LOCK(&lk); - while (vp->v_numoutput) { - vp->v_iflag |= VI_BWAIT; - interlocked_sleep(&lk, SLEEP, (caddr_t)&vp->v_numoutput, + while (vp->v_bufobj.bo_numoutput) { + vp->v_bufobj.bo_flag |= BO_WWAIT; + interlocked_sleep(&lk, SLEEP, + (caddr_t)&vp->v_bufobj.bo_numoutput, VI_MTX(vp), PRIBIO + 1, "drainvp", 0); } if (!islocked) diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c index f087e5e..1532674 100644 --- a/sys/ufs/ffs/ffs_vnops.c +++ b/sys/ufs/ffs/ffs_vnops.c @@ -197,10 +197,10 @@ ffs_fsync(ap) s = splbio(); VI_LOCK(vp); loop: - TAILQ_FOREACH(bp, &vp->v_dirtyblkhd, b_vnbufs) + TAILQ_FOREACH(bp, &vp->v_dirtyblkhd, b_bobufs) bp->b_vflags &= ~BV_SCANNED; for (bp = TAILQ_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { - nbp = TAILQ_NEXT(bp, b_vnbufs); + nbp = TAILQ_NEXT(bp, b_bobufs); /* * Reasons to skip this buffer: it has already been considered * on this pass, this pass is the first time through on a @@ -285,11 +285,7 @@ loop: } if (wait) { - while (vp->v_numoutput) { - vp->v_iflag |= VI_BWAIT; - msleep((caddr_t)&vp->v_numoutput, VI_MTX(vp), - PRIBIO + 4, "ffsfsn", 0); - } + bufobj_wwait(&vp->v_bufobj, 3, 0); VI_UNLOCK(vp); /* |