dpt_i2o.c: fix transferred data length for scsi_set_resid()
PATCH 1/1 dpt_i2o.c: fix transferred data length for scsi_set_resid()
This should go into 2.6.28 and -stable, I think.
dpt_i2o-fix-xferlen-for-scsi_set_resid.patch
[PATCH] dpt_i2o.c: fix transferred data length for scsi_set_resid()
dpt_i2o.c::adpt_i2o_to_scsi() reads the value at (reply+5) which should contain the length in bytes of the transferred data. This would be correct if reply was a u32 *. However it is a void * here, so we need to read the value at (reply+20) instead.
The value at (reply+5) is usually 0xff0000, which is apparently 'large enough' and didn't cause any trouble until 2.6.27 where 427e59f09fdba387547106de7bab980b7fff77be caused this to become visible through e.g. iostat -x .
drivers/scsi/dpt_i2o.c renamed from drivers/scsi/dpt_i2o.c.ORIG +2 -2
@@ -2445,7 +2445,7 @@ hba_status = detailed_status >>8 ;// calculate resid for sg -scsi_set_resid (cmd,scsi_bufflen (cmd) -readl (reply+5 )); +scsi_set_resid (cmd,scsi_bufflen (cmd) -readl (reply+20 )); pHba = (adpt_hba *) cmd->device->host->hostdata[0 ];
@@ -2456,7 +2456,7 @@case I2O_SCSI_DSC_SUCCESS : cmd->result = (DID_OK <<16 );// handle underflow -if (readl (reply+5 ) < cmd->underflow ) { +if (readl (reply+20 ) < cmd->underflow) { cmd->result = (DID_ERROR <<16 );printk (KERN_WARNING "%s: SCSI CMD underflow\n" ,pHba->name); }
Quoted 21 lines · Miquel van Smoorenburg
This should go into 2.6.28 and -stable, I think.
dpt_i2o-fix-xferlen-for-scsi_set_resid.patch
[PATCH]
dpt_i2o.c: fix transferred data length forscsi_set_resid()
dpt_i2o.c::adpt_i2o_to_scsi()reads the value at (reply+5) which should contain the length in bytes of the transferred data. This would be correct if reply was a u32 *. However it is a void * here, so we need to read the value at (reply+20) instead.The value at (reply+5) is usually
0xff0000, which is apparently 'large enough' and didn't cause any trouble until 2.6.27 where427e59f09fdba387547106de7bab980b7fff77becaused this to become visible through e.g. iostat -x .Signed-off-by Miquel van Smoorenburg <[email protected]>
drivers/scsi/dpt_i2o.c line 2449
Quoted 6 lines
drivers/scsi/dpt_i2o.c renamed from drivers/scsi/dpt_i2o.c.ORIG +1
-1@@ -2445,7 +2445,7 @@ hba_status = detailed_status >>8 ;// calculate resid for sg -scsi_set_resid (cmd,scsi_bufflen (cmd) -readl (reply+5 )); +scsi_set_resid (cmd,scsi_bufflen (cmd) -readl (reply+20 ));
I do wish that someone could do a:
+ scsi_set_resid(cmd, scsi_bufflen(cmd) - readl(REG_BYTE_COUNT));
or what ever. To prevent just these errors from happening.
drivers/scsi/dpt_i2o.c line 2459
Quoted 8 lines
drivers/scsi/dpt_i2o.c renamed from drivers/scsi/dpt_i2o.c.ORIG +1
-1pHba = (adpt_hba *) cmd->device->host->hostdata[0 ];@@ -2456,7 +2456,7 @@case I2O_SCSI_DSC_SUCCESS : cmd->result = (DID_OK <<16 );// handle underflow -if (readl (reply+5 ) < cmd->underflow ) { +if (readl (reply+20 ) < cmd->underflow) {
Look here it is used a gain. I would say it calls for a constant
drivers/scsi/dpt_i2o.c line 2462
Quoted 3 lines
drivers/scsi/dpt_i2o.c renamed from drivers/scsi/dpt_i2o.c.ORIG +0
-0cmd->result = (DID_ERROR <<16 );printk (KERN_WARNING "%s: SCSI CMD underflow\n" ,pHba->name); }
I understand that this is not your fault, but Just for the record, as a "TODO:" comment for us all.
Thanks
Boaz
Quoted 9 lines · Boaz Harrosh
Quoted 3 lines · Miquel van Smoorenburg
This should go into 2.6.28 and -stable, I think.
dpt_i2o-fix-xferlen-for-scsi_set_resid.patch
I do wish that someone could do a:
(quoted diff) +1
-0+ scsi_set_resid(cmd, scsi_bufflen(cmd) - readl(REG_BYTE_COUNT));
Quoted 4 lines
or what ever. To prevent just these errors from happening.
I understand that this is not your fault, but Just for the record, as a "TODO:" comment for us all.
Yes, dpt_i2o could use some more cleaning up. A while ago I said I'd look at that (after I did the 64-bit support patches), but due to circumstances I have even less time available than usual.
Anyway, this is the minimal patch for 2.6.28 and 2.6.27-stable, which is correct for -rc and -stable patches, right ?
Mike.