Skip to contentSkip to conversation

dpt_i2o.c: fix transferred data length for scsi_set_resid()

PATCH In review Miquel van Smoorenburg 2 participants 3 messages Nov 4, 2008 – Nov 6, 2008 SCSI

lore
Share & tools
lore
#0 lore raw

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);
 			}
#1 lore raw
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 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 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 -1
 	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) {

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 -0
 				cmd->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

#2 lore raw
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.