Drivers: scsi: storvsc: Properly handle errors from the host
authorK. Y. Srinivasan <[mailto:kys@microsoft.com]>
Fri, 30 Mar 2012 16:47:03 +0000 (17:47 +0100)
committerLeann Ogasawara <leann.ogasawara@canonical.com>
Mon, 2 Apr 2012 20:25:44 +0000 (13:25 -0700)
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>

drivers/scsi/storvsc_drv.c

index 695ffc3..5848a97 100644 (file)
@@ -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.