have to keep b_vp setting inside loop because swstrategy can stomp it
authorKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Fri, 15 Sep 1989 06:04:30 +0000 (22:04 -0800)
committerKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Fri, 15 Sep 1989 06:04:30 +0000 (22:04 -0800)
SCCS-vsn: sys/kern/kern_physio.c 7.10

usr/src/sys/kern/kern_physio.c

index 6c0960d..c9a7209 100644 (file)
@@ -3,7 +3,7 @@
  * All rights reserved.  The Berkeley software License Agreement
  * specifies the terms and conditions for redistribution.
  *
  * All rights reserved.  The Berkeley software License Agreement
  * specifies the terms and conditions for redistribution.
  *
- *     @(#)kern_physio.c       7.9 (Berkeley) %G%
+ *     @(#)kern_physio.c       7.10 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -90,13 +90,13 @@ swap(p, dblkno, addr, nbytes, rdflg, flag, vp, pfcent)
                bp->b_pfcent = pfcent;
        } else
                bp->b_un.b_addr = addr;
                bp->b_pfcent = pfcent;
        } else
                bp->b_un.b_addr = addr;
-       if (bp->b_vp)
-               panic("swap: active vp");
-       VREF(vp);
-       bp->b_vp = vp;
-       bp->b_dev = vp->v_rdev;
        while (nbytes > 0) {
                bp->b_blkno = dblkno;
        while (nbytes > 0) {
                bp->b_blkno = dblkno;
+               if (bp->b_vp)
+                       brelvp(bp);
+               VREF(vp);
+               bp->b_vp = vp;
+               bp->b_dev = vp->v_rdev;
                bp->b_bcount = nbytes;
                minphys(bp);
                c = bp->b_bcount;
                bp->b_bcount = nbytes;
                minphys(bp);
                c = bp->b_bcount;
@@ -126,7 +126,6 @@ swap(p, dblkno, addr, nbytes, rdflg, flag, vp, pfcent)
                dblkno += btodb(c);
        }
        bp->b_flags &= ~(B_BUSY|B_WANTED|B_PHYS|B_PAGET|B_UAREA|B_DIRTY);
                dblkno += btodb(c);
        }
        bp->b_flags &= ~(B_BUSY|B_WANTED|B_PHYS|B_PAGET|B_UAREA|B_DIRTY);
-       brelvp(bp);
        freeswbuf(bp);
        return (error);
 }
        freeswbuf(bp);
        return (error);
 }
@@ -318,6 +317,8 @@ freeswbuf(bp)
        s = splbio();
        bp->av_forw = bswlist.av_forw;
        bswlist.av_forw = bp;
        s = splbio();
        bp->av_forw = bswlist.av_forw;
        bswlist.av_forw = bp;
+       if (bp->b_vp)
+               brelvp(bp);
        if (bswlist.b_flags & B_WANTED) {
                bswlist.b_flags &= ~B_WANTED;
                wakeup((caddr_t)&bswlist);
        if (bswlist.b_flags & B_WANTED) {
                bswlist.b_flags &= ~B_WANTED;
                wakeup((caddr_t)&bswlist);