* Assign a buffer for the given block. If the appropriate
* block is already associated, return it; otherwise search
* for the oldest non-busy buffer and reassign it.
* Assign a buffer for the given block. If the appropriate
* block is already associated, return it; otherwise search
* for the oldest non-busy buffer and reassign it.
if ((unsigned)blkno >= 1 << (sizeof(int)*NBBY-PGSHIFT))
blkno = 1 << ((sizeof(int)*NBBY-PGSHIFT) + 1);
dblkno = fsbtodb(blkno);
dp = BUFHASH(dev, dblkno);
loop:
if ((unsigned)blkno >= 1 << (sizeof(int)*NBBY-PGSHIFT))
blkno = 1 << ((sizeof(int)*NBBY-PGSHIFT) + 1);
dblkno = fsbtodb(blkno);
dp = BUFHASH(dev, dblkno);
loop:
if (bp->b_flags&B_BUSY) {
bp->b_flags |= B_WANTED;
sleep((caddr_t)bp, PRIBIO+1);
if (bp->b_flags&B_BUSY) {
bp->b_flags |= B_WANTED;
sleep((caddr_t)bp, PRIBIO+1);
for (ep = &bfreelist[BQUEUES-1]; ep > bfreelist; ep--)
if (ep->av_forw != ep)
break;
if (ep == bfreelist) { /* no free blocks at all */
ep->b_flags |= B_WANTED;
sleep((caddr_t)ep, PRIBIO+1);
for (ep = &bfreelist[BQUEUES-1]; ep > bfreelist; ep--)
if (ep->av_forw != ep)
break;
if (ep == bfreelist) { /* no free blocks at all */
ep->b_flags |= B_WANTED;
sleep((caddr_t)ep, 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 (flist = bfreelist; flist < &bfreelist[BQUEUES]; flist++)
for (bp = flist->av_forw; bp != flist; bp = bp->av_forw) {
if (bp->b_flags&B_DELWRI && (dev == NODEV||dev==bp->b_dev)) {
for (flist = bfreelist; flist < &bfreelist[BQUEUES]; flist++)
for (bp = flist->av_forw; bp != flist; bp = bp->av_forw) {
if (bp->b_flags&B_DELWRI && (dev == NODEV||dev==bp->b_dev)) {
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);