- register struct buf *bp;
- struct buf *nbp, *blist;
- int s, dirty = 0;
-
-loop: for (bp = vp->v_dirtyblkhd; bp; bp = nbp) {
- nbp = bp->b_blockf;
- s = splbio();
- if (bp->b_flags & B_BUSY) {
- bp->b_flags |= B_WANTED;
- sleep((caddr_t)bp, PRIBIO + 1);
- splx(s);
- goto loop;
- }
- bremfree(bp);
- splx(s);
- dirty++;
- brelse(bp);
- }
- if (dirty)
- lfs_segwrite(vp->v_mount, 0);
-
- /* Remove blocks from the clean list. */
- for (bp = vp->v_cleanblkhd; bp; bp = nbp) {
- nbp = bp->b_blockf;
- bremfree(bp);
- bp->b_flags |= B_INVAL;
- brelse(bp);
- }
-
- if (vp->v_dirtyblkhd || vp->v_cleanblkhd)
- panic("lfs_vinvalbuf: flush failed");
- return (dirty);