On Feb 18, 2008 4:11 PM, FUJITA Tomonori <[EMAIL PROTECTED]> 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 [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html