This patch (as1036) causes the SCSI midlayer to take into account the
residue value provided by some low-level drivers.  There's at least
one situation (USB mass storage with the Bulk-only transport) where
the specification states that it is permissible for a device to
indicate some of the data was not transferred correctly merely by
setting the residue value, without issuing a Check Condition.

Signed-off-by: Alan Stern <[EMAIL PROTECTED]>
CC: Boaz Harrosh <[EMAIL PROTECTED]>

---

Index: usb-2.6/drivers/scsi/scsi.c
===================================================================
--- usb-2.6.orig/drivers/scsi/scsi.c
+++ usb-2.6/drivers/scsi/scsi.c
@@ -732,6 +732,7 @@ void scsi_finish_command(struct scsi_cmn
        struct Scsi_Host *shost = sdev->host;
        struct scsi_driver *drv;
        unsigned int good_bytes;
+       unsigned int non_residue_bytes;
 
        scsi_device_unbusy(sdev);
 
@@ -758,11 +759,16 @@ void scsi_finish_command(struct scsi_cmn
                                "(result %x)\n", cmd->result));
 
        good_bytes = scsi_bufflen(cmd);
+       non_residue_bytes = good_bytes - scsi_get_resid(cmd);
         if (cmd->request->cmd_type != REQ_TYPE_BLOCK_PC) {
                drv = scsi_cmd_to_driver(cmd);
                if (drv->done)
                        good_bytes = drv->done(cmd);
        }
+
+       /* If the device sent a meaningful residue, accept it. */
+       if (unlikely(non_residue_bytes < good_bytes))
+               good_bytes = non_residue_bytes;
        scsi_io_completion(cmd, good_bytes);
 }
 EXPORT_SYMBOL(scsi_finish_command);

-
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

Reply via email to