Commit 42e22cac4e57f3e0b4b631c9489effe97f7d7d6c
Committed by
James Bottomley
1 parent
c62eef0d1b
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
[SCSI] storvsc: Properly handle errors from the host
Hyper-V cannot process some commands like ATA_12 and ATA_16. It also returns a very generic error when this happens (SRB_STATUS_ERROR). Most of the time we treat SRB_STATUS_ERROR as DID_TARGET_FAILURE which causes error handler retry, but in the case of pass through commands, they'll never succeed (and the error handler will offline the device), so put a discriminating block in the command completion routing and send the SRB_STATUS_ERROR upwards with DID_PASSTHROUGH for commands we know should not be retried. Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Showing 1 changed file with 15 additions and 5 deletions Side-by-side Diff
drivers/scsi/storvsc_drv.c
... | ... | @@ -785,12 +785,22 @@ |
785 | 785 | /* |
786 | 786 | * If there is an error; offline the device since all |
787 | 787 | * error recovery strategies would have already been |
788 | - * deployed on the host side. | |
788 | + * deployed on the host side. However, if the command | |
789 | + * were a pass-through command deal with it appropriately. | |
789 | 790 | */ |
790 | - if (vm_srb->srb_status == SRB_STATUS_ERROR) | |
791 | - scmnd->result = DID_TARGET_FAILURE << 16; | |
792 | - else | |
793 | - scmnd->result = vm_srb->scsi_status; | |
791 | + scmnd->result = vm_srb->scsi_status; | |
792 | + | |
793 | + if (vm_srb->srb_status == SRB_STATUS_ERROR) { | |
794 | + switch (scmnd->cmnd[0]) { | |
795 | + case ATA_16: | |
796 | + case ATA_12: | |
797 | + set_host_byte(scmnd, DID_PASSTHROUGH); | |
798 | + break; | |
799 | + default: | |
800 | + set_host_byte(scmnd, DID_TARGET_FAILURE); | |
801 | + } | |
802 | + } | |
803 | + | |
794 | 804 | |
795 | 805 | /* |
796 | 806 | * If the LUN is invalid; remove the device. |