aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorK. Y. Srinivasan <[mailto:kys@microsoft.com]>2012-03-30 17:47:03 +0100
committerJohn Rigby <john.rigby@linaro.org>2012-06-23 23:19:52 -0600
commit60463d5916abdbf933198b3116a4953dbf33cfe7 (patch)
tree18b61ee6786e0daf44a8af5ea726c29ad082efd9
parent5cd798d8f4d05960e171b65cebe35bd566a97840 (diff)
Drivers: scsi: storvsc: Properly handle errors from the host
If the host returns error for pass through commands, deal with appropriately. I would like to thank James for patiently helping me with this patch. Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com> Receieved directly from the upstream maintainer. This is the current state of the art for this patch, though discussion continues. Signed-off-by: Andy Whitcroft <apw@canonical.com>
-rw-r--r--drivers/scsi/storvsc_drv.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c
index 83a1972a199..50537696335 100644
--- a/drivers/scsi/storvsc_drv.c
+++ b/drivers/scsi/storvsc_drv.c
@@ -785,12 +785,24 @@ static void storvsc_command_completion(struct storvsc_cmd_request *cmd_request)
/*
* If there is an error; offline the device since all
* error recovery strategies would have already been
- * deployed on the host side.
+ * deployed on the host side. However, if the command
+ * were a pass-through command deal with it appropriately.
*/
- if (vm_srb->srb_status == SRB_STATUS_ERROR)
- scmnd->result = DID_TARGET_FAILURE << 16;
- else
+ switch (vm_srb->srb_status) {
+ case SRB_STATUS_ERROR:
+ switch (scmnd->cmnd[0]) {
+ case ATA_16:
+ case ATA_12:
+ scmnd->result = DID_PASSTHROUGH << 16;
+ break;
+ default:
+ scmnd->result = DID_TARGET_FAILURE << 16;
+ }
+ break;
+ default:
scmnd->result = vm_srb->scsi_status;
+ }
+
/*
* If the LUN is invalid; remove the device.