- for (lbn = 0; lbn < lastlbn; lbn++) {
- blkno = fsbtodb(fs, bmap(ip, lbn, B_READ));
- blkflush(ip->i_dev, blkno, blksize(fs, ip, lbn));
+ if (lastlbn < nbuf / 2) {
+ for (lbn = 0; lbn < lastlbn; lbn++) {
+ blkno = fsbtodb(fs, bmap(ip, lbn, B_READ));
+ blkflush(ip->i_dev, blkno, blksize(fs, ip, lbn));
+ }
+ } else {
+ lastbufp = &buf[nbuf];
+ for (bp = buf; bp < lastbufp; bp++) {
+ if (bp->b_dev != ip->i_dev ||
+ (bp->b_flags & B_DELWRI) == 0)
+ continue;
+ s = splbio();
+ if (bp->b_flags & B_BUSY) {
+ bp->b_flags |= B_WANTED;
+ sleep((caddr_t)bp, PRIBIO+1);
+ splx(s);
+ bp--;
+ continue;
+ }
+ splx(s);
+ notavail(bp);
+ bwrite(bp);
+ }