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);
/*
* 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; CMD_FLAGS(sc) |= FNIC_IO_ABTS_PENDING;
switch (hdr_status) { spin_unlock_irqrestore(io_lock, flags);
case FCPIO_SUCCESS: if(FCPIO_ABORTED == hdr_status)
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:
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"
"hdr status = %s tag = 0x%x sc = 0x%p\n", "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;
} }