[SCSI] lpfc: Add completion handler to the abort iocbs
authorJames.Smart@Emulex.Com <James.Smart@Emulex.Com>
Sat, 25 Jun 2005 14:34:30 +0000 (10:34 -0400)
committerJames Bottomley <jejb@mulgrave.(none)>
Sat, 2 Jul 2005 23:57:22 +0000 (18:57 -0500)
Add completion handler to the abort iocbs to close a hole where we
could reuse an iotag.

Signed-off-by: James Smart <James.Smart@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/lpfc/lpfc_crtn.h
drivers/scsi/lpfc/lpfc_scsi.c
drivers/scsi/lpfc/lpfc_sli.c

index c504477a6a5d49bfb842cbfdb49362f194065952..ba6728831eab891227c42856a14456dd11c5fd1d 100644 (file)
@@ -195,6 +195,9 @@ int lpfc_sli_issue_iocb_wait_high_priority(struct lpfc_hba * phba,
 void lpfc_sli_wake_iocb_high_priority(struct lpfc_hba * phba,
                                      struct lpfc_iocbq * queue1,
                                      struct lpfc_iocbq * queue2);
+void lpfc_sli_abort_fcp_cmpl(struct lpfc_hba * phba,
+                            struct lpfc_iocbq * cmdiocb,
+                            struct lpfc_iocbq * rspiocb);
 
 void *lpfc_mbuf_alloc(struct lpfc_hba *, int, dma_addr_t *);
 void lpfc_mbuf_free(struct lpfc_hba *, void *, dma_addr_t);
index 4c1ab21f30718943a230b7419e22da6046692332..c1692e69e755d9ad012fdb4cbbb5d691debfe5bb 100644 (file)
@@ -874,6 +874,7 @@ __lpfc_abort_handler(struct scsi_cmnd *cmnd)
                else
                        icmd->ulpCommand = CMD_CLOSE_XRI_CN;
 
+               abtsiocb->iocb_cmpl = lpfc_sli_abort_fcp_cmpl;
                if (lpfc_sli_issue_iocb(phba, pring, abtsiocb, 0) ==
                                                                IOCB_ERROR) {
                        list_add_tail(&abtsiocb->list, lpfc_iocb_list);
index e014288958236cf32b9e4e9b6e10a572a3e2bdf9..048447ac4ca011464e6b4e43fb1351cf66bd60dc 100644 (file)
@@ -2077,8 +2077,6 @@ lpfc_sli_issue_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
                switch (piocb->iocb.ulpCommand) {
                case CMD_QUE_RING_BUF_CN:
                case CMD_QUE_RING_BUF64_CN:
-               case CMD_CLOSE_XRI_CN:
-               case CMD_ABORT_XRI_CN:
                        /*
                         * For IOCBs, like QUE_RING_BUF, that have no rsp ring
                         * completion, iocb_cmpl MUST be 0.
@@ -2561,6 +2559,16 @@ lpfc_sli_sum_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
        return sum;
 }
 
+void
+lpfc_sli_abort_fcp_cmpl(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb,
+                          struct lpfc_iocbq * rspiocb)
+{
+       spin_lock_irq(phba->host->host_lock);
+       list_add_tail(&cmdiocb->list, &phba->lpfc_iocb_list);
+       spin_unlock_irq(phba->host->host_lock);
+       return;
+}
+
 int
 lpfc_sli_abort_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
                    uint16_t tgt_id, uint64_t lun_id, uint32_t ctx,
@@ -2610,6 +2618,8 @@ lpfc_sli_abort_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
                else
                        abtsiocb->iocb.ulpCommand = CMD_CLOSE_XRI_CN;
 
+               /* Setup callback routine and issue the command. */
+               abtsiocb->iocb_cmpl = lpfc_sli_abort_fcp_cmpl;
                ret_val = lpfc_sli_issue_iocb(phba, pring, abtsiocb, 0);
                if (ret_val == IOCB_ERROR) {
                        list_add_tail(&abtsiocb->list, lpfc_iocb_list);