From 343a57bd7d83963b1b4b20a987f760e2645cb563 Mon Sep 17 00:00:00 2001 From: Kirk McKusick Date: Thu, 14 Sep 1989 22:04:30 -0800 Subject: [PATCH 1/1] have to keep b_vp setting inside loop because swstrategy can stomp it SCCS-vsn: sys/kern/kern_physio.c 7.10 --- usr/src/sys/kern/kern_physio.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/usr/src/sys/kern/kern_physio.c b/usr/src/sys/kern/kern_physio.c index 6c0960d65b..c9a72090fc 100644 --- a/usr/src/sys/kern/kern_physio.c +++ b/usr/src/sys/kern/kern_physio.c @@ -3,7 +3,7 @@ * 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" @@ -90,13 +90,13 @@ swap(p, dblkno, addr, nbytes, rdflg, flag, vp, pfcent) 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; + 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; @@ -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); - brelvp(bp); freeswbuf(bp); return (error); } @@ -318,6 +317,8 @@ freeswbuf(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); -- 2.20.1