-#define BUFHASH(dev,blkno) \
- ((struct buf *)&bufhash[((int)dev+(int)blkno) % BUFHSZ])
+#define BUFHASH(dev, dblkno) \
+ ((struct buf *)&bufhash[((int)(dev)+(int)(dblkno)) % BUFHSZ])
* page push, when the I/O completes, it is inserted
* in a list of cleaned pages to be processed by the pageout daemon.
*/
* page push, when the I/O completes, it is inserted
* in a list of cleaned pages to be processed by the pageout daemon.
*/
#endif
}
if (rablkno && !incore(dev, rablkno)) {
rabp = getblk(dev, rablkno);
if (rabp->b_flags & B_DONE) {
brelse(rabp);
#endif
}
if (rablkno && !incore(dev, rablkno)) {
rabp = getblk(dev, rablkno);
if (rabp->b_flags & B_DONE) {
brelse(rabp);
- if ((bp->b_flags&B_ERROR) && bp->b_dev != NODEV)
- bp->b_dev = NODEV; /* no assoc. on error */
+ if (bp->b_flags&B_ERROR)
+ if (bp->b_flags & B_LOCKED)
+ bp->b_flags &= ~B_ERROR; /* try again later */
+ else
+ bp->b_dev = NODEV; /* no assoc */
for (bp = dp->b_forw; bp != dp; bp = bp->b_forw)
if (bp->b_blkno == dblkno && bp->b_dev == dev &&
!(bp->b_flags & B_INVAL))
for (bp = dp->b_forw; bp != dp; bp = bp->b_forw)
if (bp->b_blkno == dblkno && bp->b_dev == dev &&
!(bp->b_flags & B_INVAL))
* 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);
- printf("killed on swap error\n");
+ printf(mesg = "killed on swap error\n");
+ uprintf("sorry, pid %d was %s", p->p_pid, mesg);
/*
* To be sure no looping (e.g. in vmsched trying to
* swap out) mark process locked in core (as though
/*
* To be sure no looping (e.g. in vmsched trying to
* swap out) mark process locked in core (as though
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);
- register struct buf *bp, *dp;
+ register struct buf *bp;
+ register struct bufhd *hp;
+#define dp ((struct buf *)hp)
- dp = bdevsw[major(dev)].d_tab;
- for (bp = dp->b_forw; bp != dp; bp = bp->b_forw)
- if (bp->b_dev == dev)
- bp->b_flags |= B_INVAL;
+ for (hp = bufhash; hp < &bufhash[BUFHSZ]; hp++)
+ for (bp = dp->b_forw; bp != dp; bp = bp->b_forw)
+ if (bp->b_dev == dev)
+ bp->b_flags |= B_INVAL;