restore missing default
[unix-history] / usr / src / sys / kern / kern_physio.c
index 65da621..2b5a39b 100644 (file)
@@ -1,4 +1,4 @@
-/*     bio.c   4.21    81/05/08        */
+/*     kern_physio.c   4.28    82/03/31        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -85,11 +85,11 @@ int *swpf;
 #ifndef        UNFAST
 #define        notavail(bp) \
 { \
 #ifndef        UNFAST
 #define        notavail(bp) \
 { \
-       int s = spl6(); \
+       int x = spl6(); \
        (bp)->av_back->av_forw = (bp)->av_forw; \
        (bp)->av_forw->av_back = (bp)->av_back; \
        (bp)->b_flags |= B_BUSY; \
        (bp)->av_back->av_forw = (bp)->av_forw; \
        (bp)->av_forw->av_back = (bp)->av_back; \
        (bp)->b_flags |= B_BUSY; \
-       splx(s); \
+       splx(x); \
 }
 #endif
 
 }
 #endif
 
@@ -328,6 +328,10 @@ daddr_t blkno;
  * 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.
+ *
+ * We use splx here because this routine may be called
+ * on the interrupt stack during a dump, and we don't
+ * want to lower the ipl back to 0.
  */
 struct buf *
 getblk(dev, blkno)
  */
 struct buf *
 getblk(dev, blkno)
@@ -339,24 +343,25 @@ daddr_t blkno;
 #ifdef DISKMON
        register int i;
 #endif
 #ifdef DISKMON
        register int i;
 #endif
+       int s;
 
        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:
-       (void) spl0();
        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)
                        continue;
        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)
                        continue;
-               (void) spl6();
+               s = spl6();
                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);
+                       splx(s);
                        goto loop;
                }
                        goto loop;
                }
-               (void) spl0();
+               splx(s);
 #ifdef DISKMON
                i = 0;
                dp = bp->av_forw;
 #ifdef DISKMON
                i = 0;
                dp = bp->av_forw;
@@ -373,16 +378,17 @@ daddr_t blkno;
        }
        if (major(dev) >= nblkdev)
                panic("blkdev");
        }
        if (major(dev) >= nblkdev)
                panic("blkdev");
-       (void) spl6();
+       s = spl6();
        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);
+               splx(s);
                goto loop;
        }
                goto loop;
        }
-       (void) spl0();
+       splx(s);
        bp = ep->av_forw;
        notavail(bp);
        if (bp->b_flags & B_DELWRI) {
        bp = ep->av_forw;
        notavail(bp);
        if (bp->b_flags & B_DELWRI) {
@@ -413,9 +419,10 @@ struct buf *
 geteblk()
 {
        register struct buf *bp, *dp;
 geteblk()
 {
        register struct buf *bp, *dp;
+       int s;
 
 loop:
 
 loop:
-       (void) spl6();
+       s = spl6();
        for (dp = &bfreelist[BQUEUES-1]; dp > bfreelist; dp--)
                if (dp->av_forw != dp)
                        break;
        for (dp = &bfreelist[BQUEUES-1]; dp > bfreelist; dp--)
                if (dp->av_forw != dp)
                        break;
@@ -424,7 +431,7 @@ loop:
                sleep((caddr_t)dp, PRIBIO+1);
                goto loop;
        }
                sleep((caddr_t)dp, PRIBIO+1);
                goto loop;
        }
-       (void) spl0();
+       splx(s);
        bp = dp->av_forw;
        notavail(bp);
        if (bp->b_flags & B_DELWRI) {
        bp = dp->av_forw;
        notavail(bp);
        if (bp->b_flags & B_DELWRI) {
@@ -453,11 +460,12 @@ loop:
 iowait(bp)
 register struct buf *bp;
 {
 iowait(bp)
 register struct buf *bp;
 {
+       int s;
 
 
-       (void) spl6();
+       s = spl6();
        while ((bp->b_flags&B_DONE)==0)
                sleep((caddr_t)bp, PRIBIO);
        while ((bp->b_flags&B_DONE)==0)
                sleep((caddr_t)bp, PRIBIO);
-       (void) spl0();
+       splx(s);
        geterror(bp);
 }
 
        geterror(bp);
 }
 
@@ -559,15 +567,16 @@ swap(p, dblkno, addr, nbytes, rdflg, flag, dev, pfcent)
        register int c;
        int p2dp;
        register struct pte *dpte, *vpte;
        register int c;
        int p2dp;
        register struct pte *dpte, *vpte;
+       int s;
 
 
-       (void) spl6();
+       s = spl6();
        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;
-       (void) spl0();
+       splx(s);
 
        bp->b_flags = B_BUSY | B_PHYS | rdflg | flag;
        if ((bp->b_flags & (B_DIRTY|B_PGIN)) == 0)
 
        bp->b_flags = B_BUSY | B_PHYS | rdflg | flag;
        if ((bp->b_flags & (B_DIRTY|B_PGIN)) == 0)
@@ -606,10 +615,10 @@ swap(p, dblkno, addr, nbytes, rdflg, flag, dev, pfcent)
                                panic("big push");
                        return;
                }
                                panic("big push");
                        return;
                }
-               (void) spl6();
+               s = spl6();
                while((bp->b_flags&B_DONE)==0)
                        sleep((caddr_t)bp, PSWP);
                while((bp->b_flags&B_DONE)==0)
                        sleep((caddr_t)bp, PSWP);
-               (void) spl0();
+               splx(s);
                bp->b_un.b_addr += c;
                bp->b_flags &= ~B_DONE;
                if (bp->b_flags & B_ERROR) {
                bp->b_un.b_addr += c;
                bp->b_flags &= ~B_DONE;
                if (bp->b_flags & B_ERROR) {
@@ -620,7 +629,7 @@ swap(p, dblkno, addr, nbytes, rdflg, flag, dev, pfcent)
                nbytes -= c;
                dblkno += btoc(c);
        }
                nbytes -= c;
                dblkno += btoc(c);
        }
-       (void) spl6();
+       s = spl6();
        bp->b_flags &= ~(B_BUSY|B_WANTED|B_PHYS|B_PAGET|B_UAREA|B_DIRTY);
        bp->av_forw = bswlist.av_forw;
        bswlist.av_forw = bp;
        bp->b_flags &= ~(B_BUSY|B_WANTED|B_PHYS|B_PAGET|B_UAREA|B_DIRTY);
        bp->av_forw = bswlist.av_forw;
        bswlist.av_forw = bp;
@@ -629,7 +638,7 @@ swap(p, dblkno, addr, nbytes, rdflg, flag, dev, pfcent)
                wakeup((caddr_t)&bswlist);
                wakeup((caddr_t)&proc[2]);
        }
                wakeup((caddr_t)&bswlist);
                wakeup((caddr_t)&proc[2]);
        }
-       (void) spl0();
+       splx(s);
 }
 
 /*
 }
 
 /*
@@ -670,9 +679,10 @@ dev_t dev;
 {
        register struct buf *bp;
        register struct buf *flist;
 {
        register struct buf *bp;
        register struct buf *flist;
+       int s;
 
 loop:
 
 loop:
-       (void) spl6();
+       s = spl6();
        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)) {
@@ -682,7 +692,7 @@ loop:
                        goto loop;
                }
        }
                        goto loop;
                }
        }
-       (void) spl0();
+       splx(s);
 }
 
 /*
 }
 
 /*
@@ -706,16 +716,18 @@ unsigned (*mincnt)();
 {
        register int c;
        char *a;
 {
        register int c;
        char *a;
+       int s;
 
        if (useracc(u.u_base,u.u_count,rw==B_READ?B_WRITE:B_READ) == NULL) {
                u.u_error = EFAULT;
                return;
        }
 
        if (useracc(u.u_base,u.u_count,rw==B_READ?B_WRITE:B_READ) == NULL) {
                u.u_error = EFAULT;
                return;
        }
-       (void) spl6();
+       s = spl6();
        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);
        }
+       splx(s);
        bp->b_error = 0;
        bp->b_proc = u.u_procp;
        bp->b_un.b_addr = u.u_base;
        bp->b_error = 0;
        bp->b_proc = u.u_procp;
        bp->b_un.b_addr = u.u_base;
@@ -736,7 +748,7 @@ unsigned (*mincnt)();
                u.u_procp->p_flag &= ~SPHYSIO;
                if (bp->b_flags&B_WANTED)
                        wakeup((caddr_t)bp);
                u.u_procp->p_flag &= ~SPHYSIO;
                if (bp->b_flags&B_WANTED)
                        wakeup((caddr_t)bp);
-               (void) spl0();
+               splx(s);
                bp->b_un.b_addr += c;
                u.u_count -= c;
                u.u_offset += c;
                bp->b_un.b_addr += c;
                u.u_count -= c;
                u.u_offset += c;
@@ -754,8 +766,8 @@ minphys(bp)
 struct buf *bp;
 {
 
 struct buf *bp;
 {
 
-       if (bp->b_bcount > 60 * 1024)
-               bp->b_bcount = 60 * 1024;
+       if (bp->b_bcount > 63 * 1024)
+               bp->b_bcount = 63 * 1024;
 }
 
 /*
 }
 
 /*