for (bp = &buf[bufhash[BUFHASH(blkno)]]; bp != &buf[-1];
bp = &buf[bp->b_hlink]) {
if (bp->b_blkno != dblkno || bp->b_dev != dev)
continue;
for (bp = &buf[bufhash[BUFHASH(blkno)]]; bp != &buf[-1];
bp = &buf[bp->b_hlink]) {
if (bp->b_blkno != dblkno || bp->b_dev != dev)
continue;
if (bp->b_flags&B_BUSY) {
bp->b_flags |= B_WANTED;
sleep((caddr_t)bp, PRIBIO+1);
goto loop;
}
if (bp->b_flags&B_BUSY) {
bp->b_flags |= B_WANTED;
sleep((caddr_t)bp, PRIBIO+1);
goto loop;
}
if (bfreelist.av_forw == &bfreelist) {
bfreelist.b_flags |= B_WANTED;
sleep((caddr_t)&bfreelist, PRIBIO+1);
if (bfreelist.av_forw == &bfreelist) {
bfreelist.b_flags |= B_WANTED;
sleep((caddr_t)&bfreelist, PRIBIO+1);
while (bfreelist.av_forw == &bfreelist) {
bfreelist.b_flags |= B_WANTED;
sleep((caddr_t)&bfreelist, PRIBIO+1);
}
while (bfreelist.av_forw == &bfreelist) {
bfreelist.b_flags |= B_WANTED;
sleep((caddr_t)&bfreelist, PRIBIO+1);
}
while ((bp->b_flags&B_DONE)==0)
sleep((caddr_t)bp, PRIBIO);
while ((bp->b_flags&B_DONE)==0)
sleep((caddr_t)bp, PRIBIO);
while (bswlist.av_forw == NULL) {
bswlist.b_flags |= B_WANTED;
sleep((caddr_t)&bswlist, PSWP+1);
}
bp = bswlist.av_forw;
bswlist.av_forw = bp->av_forw;
while (bswlist.av_forw == NULL) {
bswlist.b_flags |= B_WANTED;
sleep((caddr_t)&bswlist, PSWP+1);
}
bp = bswlist.av_forw;
bswlist.av_forw = bp->av_forw;
while((bp->b_flags&B_DONE)==0)
sleep((caddr_t)bp, PSWP);
while((bp->b_flags&B_DONE)==0)
sleep((caddr_t)bp, PSWP);
for (bp = bfreelist.av_forw; bp != &bfreelist; bp = bp->av_forw) {
if (bp->b_flags&B_DELWRI && (dev == NODEV||dev==bp->b_dev)) {
bp->b_flags |= B_ASYNC;
for (bp = bfreelist.av_forw; bp != &bfreelist; bp = bp->av_forw) {
if (bp->b_flags&B_DELWRI && (dev == NODEV||dev==bp->b_dev)) {
bp->b_flags |= B_ASYNC;
while (bp->b_flags&B_BUSY) {
bp->b_flags |= B_WANTED;
sleep((caddr_t)bp, PRIBIO+1);
while (bp->b_flags&B_BUSY) {
bp->b_flags |= B_WANTED;
sleep((caddr_t)bp, PRIBIO+1);
u.u_procp->p_flag |= SPHYSIO;
vslock(a = bp->b_un.b_addr, c);
(*strat)(bp);
u.u_procp->p_flag |= SPHYSIO;
vslock(a = bp->b_un.b_addr, c);
(*strat)(bp);
while ((bp->b_flags&B_DONE) == 0)
sleep((caddr_t)bp, PRIBIO);
vsunlock(a, c, rw);
u.u_procp->p_flag &= ~SPHYSIO;
if (bp->b_flags&B_WANTED)
wakeup((caddr_t)bp);
while ((bp->b_flags&B_DONE) == 0)
sleep((caddr_t)bp, PRIBIO);
vsunlock(a, c, rw);
u.u_procp->p_flag &= ~SPHYSIO;
if (bp->b_flags&B_WANTED)
wakeup((caddr_t)bp);