+ bp->b_error = 0;
+ bp->b_proc = u.u_procp;
+#ifdef SECSIZE
+ bp->b_blksize = bsize;
+#endif SECSIZE
+ bp->b_un.b_addr = iov->iov_base;
+ while (iov->iov_len > 0) {
+ bp->b_flags = B_BUSY | B_PHYS | rw;
+ bp->b_dev = dev;
+#ifdef SECSIZE
+ bp->b_blkno = uio->uio_offset / bsize;
+#else SECSIZE
+ bp->b_blkno = btodb(uio->uio_offset);
+#endif SECSIZE
+ bp->b_bcount = iov->iov_len;
+ (*mincnt)(bp);
+ c = bp->b_bcount;
+ u.u_procp->p_flag |= SPHYSIO;
+ vslock(a = bp->b_un.b_addr, c);
+ physstrat(bp, strat, PRIBIO);
+ (void) splbio();
+ vsunlock(a, c, rw);
+ u.u_procp->p_flag &= ~SPHYSIO;
+ if (bp->b_flags&B_WANTED)
+ wakeup((caddr_t)bp);
+ splx(s);
+ c -= bp->b_resid;
+ bp->b_un.b_addr += c;
+ iov->iov_len -= c;
+ uio->uio_resid -= c;
+ uio->uio_offset += c;
+ /* temp kludge for tape drives */
+ if (bp->b_resid || (bp->b_flags&B_ERROR))
+ break;
+ }
+ bp->b_flags &= ~(B_BUSY|B_WANTED|B_PHYS);
+ error = geterror(bp);
+ /* temp kludge for tape drives */
+ if (bp->b_resid || error)
+ return (error);
+ uio->uio_iov++;
+ uio->uio_iovcnt--;