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/scsi | |
| 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/scsi')
| -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 | } |
