|
@@ -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;
|