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>
This commit is contained in:
Satish Kharat 2017-02-28 16:15:12 -08:00 committed by Martin K. Petersen
parent 7ef539c88d
commit b9202b4ae8
1 changed files with 18 additions and 22 deletions

View 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, * 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) { if (CMD_STATE(sc) == FNIC_IOREQ_ABTS_PENDING) {
spin_unlock_irqrestore(io_lock, flags);
CMD_FLAGS(sc) |= FNIC_IO_ABTS_PENDING; /*
switch (hdr_status) { * set the FNIC_IO_DONE so that this doesn't get
case FCPIO_SUCCESS: * flagged as 'out of order' if it was not aborted
*/
CMD_FLAGS(sc) |= FNIC_IO_DONE; CMD_FLAGS(sc) |= FNIC_IO_DONE;
FNIC_SCSI_DBG(KERN_INFO, fnic->lport->host, CMD_FLAGS(sc) |= FNIC_IO_ABTS_PENDING;
"icmnd_cmpl ABTS pending hdr status = %s " spin_unlock_irqrestore(io_lock, flags);
"sc 0x%p scsi_status %x residual %d\n", if(FCPIO_ABORTED == hdr_status)
fnic_fcpio_status_to_str(hdr_status), sc,
icmnd_cmpl->scsi_status,
icmnd_cmpl->residual);
break;
case FCPIO_ABORTED:
CMD_FLAGS(sc) |= FNIC_IO_ABORTED; CMD_FLAGS(sc) |= FNIC_IO_ABORTED;
break;
default:
FNIC_SCSI_DBG(KERN_INFO, fnic->lport->host, FNIC_SCSI_DBG(KERN_INFO, fnic->lport->host,
"icmnd_cmpl abts pending " "icmnd_cmpl abts pending "
"hdr status = %s tag = 0x%x sc = 0x%p\n", "hdr status = %s tag = 0x%x sc = 0x%p"
"scsi_status = %x residual = %d\n",
fnic_fcpio_status_to_str(hdr_status), fnic_fcpio_status_to_str(hdr_status),
id, sc); id, sc,
break; icmnd_cmpl->scsi_status,
} icmnd_cmpl->residual);
return; return;
} }