[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;
|
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
|
* 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
|
* 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)
|
abort_cmd) != 0)
|
||||||
continue;
|
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 */
|
/* issue ABTS for this IOCB based on iotag */
|
||||||
abtsiocb = lpfc_sli_get_iocbq(phba);
|
abtsiocb = lpfc_sli_get_iocbq(phba);
|
||||||
if (abtsiocb == NULL) {
|
if (abtsiocb == NULL) {
|
||||||
|
@ -9838,6 +9845,9 @@ lpfc_sli_abort_iocb(struct lpfc_vport *vport, struct lpfc_sli_ring *pring,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* indicate the IO is being aborted by the driver. */
|
||||||
|
iocbq->iocb_flag |= LPFC_DRIVER_ABORTED;
|
||||||
|
|
||||||
cmd = &iocbq->iocb;
|
cmd = &iocbq->iocb;
|
||||||
abtsiocb->iocb.un.acxri.abortType = ABORT_TYPE_ABTS;
|
abtsiocb->iocb.un.acxri.abortType = ABORT_TYPE_ABTS;
|
||||||
abtsiocb->iocb.un.acxri.abortContextTag = cmd->ulpContext;
|
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.un.acxri.abortIoTag = cmd->ulpIoTag;
|
||||||
abtsiocb->iocb.ulpLe = 1;
|
abtsiocb->iocb.ulpLe = 1;
|
||||||
abtsiocb->iocb.ulpClass = cmd->ulpClass;
|
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 */
|
/* ABTS WQE must go to the same WQ as the WQE to be aborted */
|
||||||
abtsiocb->fcp_wqidx = iocbq->fcp_wqidx;
|
abtsiocb->fcp_wqidx = iocbq->fcp_wqidx;
|
||||||
|
|
Loading…
Reference in New Issue