scsi: fnic: Avoid false out-of-order detection for aborted command
authorSatish Kharat <satishkh@cisco.com>
Wed, 1 Mar 2017 00:15:12 +0000 (16:15 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 23 Mar 2017 13:57:23 +0000 (09:57 -0400)
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>
drivers/scsi/fnic/fnic_scsi.c

index 0650911..ce5de2a 100644 (file)
@@ -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;
        }