[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:
James Smart 2013-09-06 12:22:13 -04:00 committed by James Bottomley
parent 092cb034b5
commit afbd8d8884
2 changed files with 14 additions and 1 deletions

View File

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

View File

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