[SCSI] lpfc 8.3.42: Fix driver's abort loop functionality to skip IOs already getting aborted
Signed-off-by: James Smart <james.smart@emulex.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
parent
092cb034b5
commit
afbd8d8884
|
@ -4886,6 +4886,9 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd)
|
|||
goto out_unlock;
|
||||
}
|
||||
|
||||
/* Indicate the IO is being aborted by the driver. */
|
||||
iocb->iocb_flag |= LPFC_DRIVER_ABORTED;
|
||||
|
||||
/*
|
||||
* The scsi command can not be in txq and it is in flight because the
|
||||
* pCmd is still pointig at the SCSI command we have to abort. There
|
||||
|
|
|
@ -9831,6 +9831,13 @@ lpfc_sli_abort_iocb(struct lpfc_vport *vport, struct lpfc_sli_ring *pring,
|
|||
abort_cmd) != 0)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* If the iocbq is already being aborted, don't take a second
|
||||
* action, but do count it.
|
||||
*/
|
||||
if (iocbq->iocb_flag & LPFC_DRIVER_ABORTED)
|
||||
continue;
|
||||
|
||||
/* issue ABTS for this IOCB based on iotag */
|
||||
abtsiocb = lpfc_sli_get_iocbq(phba);
|
||||
if (abtsiocb == NULL) {
|
||||
|
@ -9838,6 +9845,9 @@ lpfc_sli_abort_iocb(struct lpfc_vport *vport, struct lpfc_sli_ring *pring,
|
|||
continue;
|
||||
}
|
||||
|
||||
/* indicate the IO is being aborted by the driver. */
|
||||
iocbq->iocb_flag |= LPFC_DRIVER_ABORTED;
|
||||
|
||||
cmd = &iocbq->iocb;
|
||||
abtsiocb->iocb.un.acxri.abortType = ABORT_TYPE_ABTS;
|
||||
abtsiocb->iocb.un.acxri.abortContextTag = cmd->ulpContext;
|
||||
|
@ -9847,7 +9857,7 @@ lpfc_sli_abort_iocb(struct lpfc_vport *vport, struct lpfc_sli_ring *pring,
|
|||
abtsiocb->iocb.un.acxri.abortIoTag = cmd->ulpIoTag;
|
||||
abtsiocb->iocb.ulpLe = 1;
|
||||
abtsiocb->iocb.ulpClass = cmd->ulpClass;
|
||||
abtsiocb->vport = phba->pport;
|
||||
abtsiocb->vport = vport;
|
||||
|
||||
/* ABTS WQE must go to the same WQ as the WQE to be aborted */
|
||||
abtsiocb->fcp_wqidx = iocbq->fcp_wqidx;
|
||||
|
|
Loading…
Reference in New Issue