summaryrefslogtreecommitdiffstats
path: root/sys/ufs
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2004-10-21 15:53:54 +0000
committerphk <phk@FreeBSD.org>2004-10-21 15:53:54 +0000
commit3833976d1250bf118a46939f409012d87e558de6 (patch)
tree9d355bca75100170618443d740a1312fd842af5d /sys/ufs
parentfdf614c0bad1564664cac5105be08477d1bcdd72 (diff)
downloadFreeBSD-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.c7
-rw-r--r--sys/ufs/ffs/ffs_softdep.c13
-rw-r--r--sys/ufs/ffs/ffs_vnops.c10
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);
/*
OpenPOWER on IntegriCloud