>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 <[email protected]>
>---
> drivers/scsi/vmw_pvscsi.c | 11 ++++++++---
> 1 file changed, 8 insertions(+), 3 deletions(-)
>
>diff --git a/drivers/scsi/vmw_pvscsi.c b/drivers/scsi/vmw_pvscsi.c
>index 777e5f1..0cd947f 100644
>--- a/drivers/scsi/vmw_pvscsi.c
>+++ b/drivers/scsi/vmw_pvscsi.c
>@@ -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:
>-- 
>2.7.4
>

Reply via email to