On Feb 18, 2008 4:11 PM, FUJITA Tomonori <fujita.tomonori@xxxxxxxxxxxxx> wrote: > Can you please help me just once more? 2.6.25-rc2 fixed this bug in a > bit different way by chance. Please test 2.6.25-rc2 with the attached > patch to make sure that ips in 2.6.25 works well. Confirmed...the patch below against 2.6.25-rc2 also works for me. Thank you again Fujita-san! > > diff --git a/drivers/scsi/ips.c b/drivers/scsi/ips.c > index bb152fb..429592a 100644 > --- a/drivers/scsi/ips.c > +++ b/drivers/scsi/ips.c > @@ -1576,7 +1576,7 @@ ips_make_passthru(ips_ha_t *ha, struct scsi_cmnd *SC, ips_scb_t *scb, int intr) > METHOD_TRACE("ips_make_passthru", 1); > > scsi_for_each_sg(SC, sg, scsi_sg_count(SC), i) > - length += sg[i].length; > + length += sg->length; > > if (length < sizeof (ips_passthru_t)) { > /* wrong size */ > @@ -3510,15 +3510,16 @@ ips_scmd_buf_write(struct scsi_cmnd *scmd, void *data, unsigned int count) > struct scatterlist *sg = scsi_sglist(scmd); > > for (i = 0, xfer_cnt = 0; > - (i < scsi_sg_count(scmd)) && (xfer_cnt < count); i++) { > - min_cnt = min(count - xfer_cnt, sg[i].length); > + (i < scsi_sg_count(scmd)) && (xfer_cnt < count); > + i++, sg = sg_next(sg)) { > + min_cnt = min(count - xfer_cnt, sg->length); > > /* kmap_atomic() ensures addressability of the data buffer.*/ > /* local_irq_save() protects the KM_IRQ0 address slot. */ > local_irq_save(flags); > - buffer = kmap_atomic(sg_page(&sg[i]), KM_IRQ0) + sg[i].offset; > + buffer = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset; > memcpy(buffer, &cdata[xfer_cnt], min_cnt); > - kunmap_atomic(buffer - sg[i].offset, KM_IRQ0); > + kunmap_atomic(buffer - sg->offset, KM_IRQ0); > local_irq_restore(flags); > > xfer_cnt += min_cnt; > @@ -3543,15 +3544,16 @@ ips_scmd_buf_read(struct scsi_cmnd *scmd, void *data, unsigned int count) > struct scatterlist *sg = scsi_sglist(scmd); > > for (i = 0, xfer_cnt = 0; > - (i < scsi_sg_count(scmd)) && (xfer_cnt < count); i++) { > - min_cnt = min(count - xfer_cnt, sg[i].length); > + (i < scsi_sg_count(scmd)) && (xfer_cnt < count); > + i++, sg = sg_next(sg)) { > + min_cnt = min(count - xfer_cnt, sg->length); > > /* kmap_atomic() ensures addressability of the data buffer.*/ > /* local_irq_save() protects the KM_IRQ0 address slot. */ > local_irq_save(flags); > - buffer = kmap_atomic(sg_page(&sg[i]), KM_IRQ0) + sg[i].offset; > + buffer = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset; > memcpy(&cdata[xfer_cnt], buffer, min_cnt); > - kunmap_atomic(buffer - sg[i].offset, KM_IRQ0); > + kunmap_atomic(buffer - sg->offset, KM_IRQ0); > local_irq_restore(flags); > > xfer_cnt += min_cnt; - To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html