Anyone still using ioprbs(4)? If so, please test the diff below and
report back to me.
Index: dev/i2o/ioprbs.c
===================================================================
RCS file: /cvs/src/sys/dev/i2o/ioprbs.c,v
retrieving revision 1.20
diff -u -p dev/i2o/ioprbs.c
--- dev/i2o/ioprbs.c 23 Mar 2010 01:57:19 -0000 1.20
+++ dev/i2o/ioprbs.c 28 Jun 2010 19:59:33 -0000
@@ -544,7 +544,7 @@ ioprbs_intr(struct device *dv, struct iop_msg *im, voi
{
struct i2o_rbs_reply *rb = reply;
struct ioprbs_ccb *ccb = im->im_dvcontext;
- struct buf *bp = ccb->ic_xs->bp;
+ struct scsi_xfer *xs = ccb->ic_xs;
struct ioprbs_softc *sc = (struct ioprbs_softc *)dv;
struct iop_softc *iop = (struct iop_softc *)dv->dv_parent;
int err, detail;
@@ -554,7 +554,7 @@ ioprbs_intr(struct device *dv, struct iop_msg *im, voi
DPRINTF(("ioprbs_intr(%p, %p, %p) ", dv, im, reply));
- timeout_del(&ccb->ic_xs->stimeout);
+ timeout_del(&xs->stimeout);
err = ((rb->msgflags & I2O_MSGFLAGS_FAIL) != 0);
@@ -572,18 +572,14 @@ ioprbs_intr(struct device *dv, struct iop_msg *im, voi
err = 1;
}
- if (bp) {
- if (err) {
- bp->b_flags |= B_ERROR;
- bp->b_error = EIO;
- bp->b_resid = bp->b_bcount;
- } else
- bp->b_resid = bp->b_bcount - letoh32(rb->transfercount);
- }
+ if (err)
+ xs->error = XS_DRIVER_STUFFUP;
+ else
+ xs->resid = xs->datalen - letoh32(rb->transfercount);
iop_msg_unmap(iop, im);
iop_msg_free(iop, im);
- scsi_done(ccb->ic_xs);
+ scsi_done(xs);
ioprbs_free_ccb(sc, ccb);
}