- if (bp->b_flags & B_WANTED)
- wakeup((caddr_t)bp);
- if (bfreelist[0].b_flags & B_WANTED) {
- bfreelist[0].b_flags &= ~B_WANTED;
- wakeup((caddr_t)bfreelist);
- }
- /*
- * Retry I/O for locked buffers rather than invalidating them.
- */
- if ((bp->b_flags & B_ERROR) && (bp->b_flags & B_LOCKED))
- bp->b_flags &= ~B_ERROR;
- /*
- * Disassociate buffers that are no longer valid.
- */
- if (bp->b_flags & (B_NOCACHE | B_ERROR))
- bp->b_flags |= B_INVAL;
- if ((bp->b_bufsize <= 0) || (bp->b_flags & (B_ERROR | B_INVAL))) {
- if (bp->b_vp)
- brelvp(bp);
- bp->b_flags &= ~B_DELWRI;
- }
- /*
- * Stick the buffer back on a free list.
- */
- s = splbio();
- if (bp->b_bufsize <= 0) {
- /* block has no buffer ... put at front of unused buffer list */
- flist = &bfreelist[BQ_EMPTY];
- binsheadfree(bp, flist);
- } else if (bp->b_flags & (B_ERROR | B_INVAL)) {
- /* block has no info ... put at front of most free list */
- flist = &bfreelist[BQ_AGE];
- binsheadfree(bp, flist);
- } else {
- if (bp->b_flags & B_LOCKED)
- flist = &bfreelist[BQ_LOCKED];
- else if (bp->b_flags & B_AGE)
- flist = &bfreelist[BQ_AGE];
- else
- flist = &bfreelist[BQ_LRU];
- binstailfree(bp, flist);
- }
- bp->b_flags &= ~(B_WANTED | B_BUSY | B_ASYNC | B_AGE | B_NOCACHE);
- splx(s);