+ * Insure that no part of a specified block is in an incore buffer.
+ */
+blkflush(dev, blkno, size)
+ dev_t dev;
+ daddr_t blkno;
+ long size;
+{
+ register struct buf *ep;
+ struct buf *dp;
+ daddr_t start, last;
+ int s;
+
+ start = blkno;
+ last = start + btodb(size) - 1;
+ dp = BUFHASH(dev, blkno);
+loop:
+ for (ep = dp->b_forw; ep != dp; ep = ep->b_forw) {
+ if (ep->b_dev != dev || (ep->b_flags&B_INVAL))
+ continue;
+ /* look for overlap */
+ if (ep->b_bcount == 0 || ep->b_blkno > last ||
+ ep->b_blkno + btodb(ep->b_bcount) <= start)
+ continue;
+ s = splbio();
+ if (ep->b_flags&B_BUSY) {
+ ep->b_flags |= B_WANTED;
+ sleep((caddr_t)ep, PRIBIO+1);
+ splx(s);
+ goto loop;
+ }
+ if (ep->b_flags & B_DELWRI) {
+ splx(s);
+ notavail(ep);
+ bwrite(ep);
+ goto loop;
+ }
+ splx(s);
+ }
+}
+
+/*
+ * Make sure all write-behind blocks