diff options
author | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-03-08 19:24:17 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-06-05 10:23:45 -0400 |
commit | 427e59f09fdba387547106de7bab980b7fff77be (patch) | |
tree | 4701ebff8882da0f5ff15f1dab3468d259b2c5dd /drivers | |
parent | 19c4158bcdf42ee3b2394342caf14f8471d2c78e (diff) |
[SCSI] make use of the residue value
USB sometimes doesn't return an error but instead returns a residue
value indicating part (or all) of the command wasn't completed. So if
the driver _done() error processing indicates the command was fully
processed, subtract off the residue so that this USB error gets
propagated.
Cc: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/scsi.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index 110e776d1a07..36c92f961e15 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c | |||
@@ -855,9 +855,18 @@ void scsi_finish_command(struct scsi_cmnd *cmd) | |||
855 | 855 | ||
856 | good_bytes = scsi_bufflen(cmd); | 856 | good_bytes = scsi_bufflen(cmd); |
857 | if (cmd->request->cmd_type != REQ_TYPE_BLOCK_PC) { | 857 | if (cmd->request->cmd_type != REQ_TYPE_BLOCK_PC) { |
858 | int old_good_bytes = good_bytes; | ||
858 | drv = scsi_cmd_to_driver(cmd); | 859 | drv = scsi_cmd_to_driver(cmd); |
859 | if (drv->done) | 860 | if (drv->done) |
860 | good_bytes = drv->done(cmd); | 861 | good_bytes = drv->done(cmd); |
862 | /* | ||
863 | * USB may not give sense identifying bad sector and | ||
864 | * simply return a residue instead, so subtract off the | ||
865 | * residue if drv->done() error processing indicates no | ||
866 | * change to the completion length. | ||
867 | */ | ||
868 | if (good_bytes == old_good_bytes) | ||
869 | good_bytes -= scsi_get_resid(cmd); | ||
861 | } | 870 | } |
862 | scsi_io_completion(cmd, good_bytes); | 871 | scsi_io_completion(cmd, good_bytes); |
863 | } | 872 | } |