summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSatish Kharat <satishkh@cisco.com>2017-02-28 16:15:12 -0800
committerMartin K. Petersen <martin.petersen@oracle.com>2017-03-23 09:57:23 -0400
commitb9202b4ae8171e9eaa21504d5a8c1c2e9d6ecd90 (patch)
tree49c680ef6ae934c8675f74e917a9f3668e79c175
parent7ef539c88d7d394410d547c9f082d477093a2a22 (diff)
downloadlinux-stable-b9202b4ae8171e9eaa21504d5a8c1c2e9d6ecd90.tar.gz
linux-stable-b9202b4ae8171e9eaa21504d5a8c1c2e9d6ecd90.tar.bz2
linux-stable-b9202b4ae8171e9eaa21504d5a8c1c2e9d6ecd90.zip
scsi: fnic: Avoid false out-of-order detection for aborted command
If SCSI-ML has already issued abort on a command i.e FNIC_IOREQ_ABTS_PENDING is set and we get a IO completion, avoid this being flagged as out-of-order completion by setting the FNIC_IO_DONE flag in fnic_fcpio_icmnd_cmpl_handler Signed-off-by: Satish Kharat <satishkh@cisco.com> Signed-off-by: Sesidhar Baddela <sebaddel@cisco.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r--drivers/scsi/fnic/fnic_scsi.c40
1 files changed, 18 insertions, 22 deletions
diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c
index 0650911929fd..ce5de2aa39c7 100644
--- a/drivers/scsi/fnic/fnic_scsi.c
+++ b/drivers/scsi/fnic/fnic_scsi.c
@@ -876,32 +876,28 @@ static void fnic_fcpio_icmnd_cmpl_handler(struct fnic *fnic,
/*
* if SCSI-ML has already issued abort on this command,
- * ignore completion of the IO. The abts path will clean it up
+ * set completion of the IO. The abts path will clean it up
*/
if (CMD_STATE(sc) == FNIC_IOREQ_ABTS_PENDING) {
- spin_unlock_irqrestore(io_lock, flags);
+
+ /*
+ * set the FNIC_IO_DONE so that this doesn't get
+ * flagged as 'out of order' if it was not aborted
+ */
+ CMD_FLAGS(sc) |= FNIC_IO_DONE;
CMD_FLAGS(sc) |= FNIC_IO_ABTS_PENDING;
- switch (hdr_status) {
- case FCPIO_SUCCESS:
- CMD_FLAGS(sc) |= FNIC_IO_DONE;
- FNIC_SCSI_DBG(KERN_INFO, fnic->lport->host,
- "icmnd_cmpl ABTS pending hdr status = %s "
- "sc 0x%p scsi_status %x residual %d\n",
- fnic_fcpio_status_to_str(hdr_status), sc,
- icmnd_cmpl->scsi_status,
- icmnd_cmpl->residual);
- break;
- case FCPIO_ABORTED:
+ spin_unlock_irqrestore(io_lock, flags);
+ if(FCPIO_ABORTED == hdr_status)
CMD_FLAGS(sc) |= FNIC_IO_ABORTED;
- break;
- default:
- FNIC_SCSI_DBG(KERN_INFO, fnic->lport->host,
- "icmnd_cmpl abts pending "
- "hdr status = %s tag = 0x%x sc = 0x%p\n",
- fnic_fcpio_status_to_str(hdr_status),
- id, sc);
- break;
- }
+
+ FNIC_SCSI_DBG(KERN_INFO, fnic->lport->host,
+ "icmnd_cmpl abts pending "
+ "hdr status = %s tag = 0x%x sc = 0x%p"
+ "scsi_status = %x residual = %d\n",
+ fnic_fcpio_status_to_str(hdr_status),
+ id, sc,
+ icmnd_cmpl->scsi_status,
+ icmnd_cmpl->residual);
return;
}