+ int s;
+ s = splbio();
+ if (bp->b_flags & B_CLUSTER) {
+ struct buf *tbp;
+ bp->b_resid = bp->b_bcount;
+ while ( tbp = bp->b_clusterf) {
+ bp->b_clusterf = tbp->av_forw;
+ bp->b_resid -= tbp->b_bcount;
+ tbp->b_resid = 0;
+ if( bp->b_resid <= 0) {
+ tbp->b_error = bp->b_error;
+ tbp->b_flags |= (bp->b_flags & B_ERROR);
+ tbp->b_resid = -bp->b_resid;
+ bp->b_resid = 0;
+ }
+/*
+ printf("rdc (%d,%d,%d) ", tbp->b_blkno, tbp->b_bcount, tbp->b_resid);
+*/
+
+ biodone(tbp);
+ }
+#ifndef NOBOUNCE
+ vm_bounce_kva_free( bp->b_un.b_addr, bp->b_bufsize, 0);
+#endif
+ relpbuf(bp);
+ splx(s);
+ return;
+ }
+
+#ifndef NOBOUNCE
+ if (bp->b_flags & B_BOUNCE)
+ vm_bounce_free(bp);
+#endif