scsi: libfc: do not overwrite DID_TIME_OUT status
authorHannes Reinecke <hare@suse.de>
Thu, 13 Oct 2016 13:10:43 +0000 (15:10 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 8 Nov 2016 22:29:51 +0000 (17:29 -0500)
When a command is aborted it might already have the DID_TIME_OUT
status set, so we shouldn't be overwriting that.

Signed-off-by: Hannes Reinecke <hare@suse.com>
Acked-by: Johannes Thumshirn <jth@kernel.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/libfc/fc_fcp.c

index 10faca2686bad05a23278099b13bd3fc9315d3da..0e2a2016af71af4ec98ad92d25d06bb32e0d8b80 100644 (file)
@@ -2008,9 +2008,15 @@ static void fc_io_compl(struct fc_fcp_pkt *fsp)
                sc_cmd->result = (DID_ERROR << 16) | fsp->cdb_status;
                break;
        case FC_CMD_ABORTED:
-               FC_FCP_DBG(fsp, "Returning DID_ERROR to scsi-ml "
-                         "due to FC_CMD_ABORTED\n");
-               sc_cmd->result = (DID_ERROR << 16) | fsp->io_status;
+               if (host_byte(sc_cmd->result) == DID_TIME_OUT)
+                       FC_FCP_DBG(fsp, "Returning DID_TIME_OUT to scsi-ml "
+                                  "due to FC_CMD_ABORTED\n");
+               else {
+                       FC_FCP_DBG(fsp, "Returning DID_ERROR to scsi-ml "
+                                  "due to FC_CMD_ABORTED\n");
+                       set_host_byte(sc_cmd, DID_ERROR);
+               }
+               sc_cmd->result |= fsp->io_status;
                break;
        case FC_CMD_RESET:
                FC_FCP_DBG(fsp, "Returning DID_RESET to scsi-ml "