scsi: vmw_pvscsi: Return DID_RESET for status SAM_STAT_COMMAND_TERMINATED
authorJim Gill <jgill@vmware.com>
Thu, 2 Aug 2018 21:13:30 +0000 (14:13 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 3 Aug 2018 17:56:22 +0000 (13:56 -0400)
Commands that are reset are returned with status
SAM_STAT_COMMAND_TERMINATED. PVSCSI currently returns DID_OK |
SAM_STAT_COMMAND_TERMINATED which fails the command. Instead, set hostbyte
to DID_RESET to allow upper layers to retry.

Tested by copying a large file between two pvscsi disks on same adapter
while performing a bus reset at 1-second intervals. Before fix, commands
sometimes fail with DID_OK. After fix, commands observed to fail with
DID_RESET.

Signed-off-by: Jim Gill <jgill@vmware.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/vmw_pvscsi.c

index 777e5f1e52d10968d5f23e0e316db05b8209511d..0cd947f78b5bfdfa013ce4909afdc8f894b6146b 100644 (file)
@@ -561,9 +561,14 @@ static void pvscsi_complete_request(struct pvscsi_adapter *adapter,
            (btstat == BTSTAT_SUCCESS ||
             btstat == BTSTAT_LINKED_COMMAND_COMPLETED ||
             btstat == BTSTAT_LINKED_COMMAND_COMPLETED_WITH_FLAG)) {
-               cmd->result = (DID_OK << 16) | sdstat;
-               if (sdstat == SAM_STAT_CHECK_CONDITION && cmd->sense_buffer)
-                       cmd->result |= (DRIVER_SENSE << 24);
+               if (sdstat == SAM_STAT_COMMAND_TERMINATED) {
+                       cmd->result = (DID_RESET << 16);
+               } else {
+                       cmd->result = (DID_OK << 16) | sdstat;
+                       if (sdstat == SAM_STAT_CHECK_CONDITION &&
+                           cmd->sense_buffer)
+                               cmd->result |= (DRIVER_SENSE << 24);
+               }
        } else
                switch (btstat) {
                case BTSTAT_SUCCESS: