]> Pileus Git - ~andy/linux/commitdiff
[SCSI] lpfc 8.3.43: Fix crash after xri limit is reached.
authorJames Smart <james.smart@emulex.com>
Thu, 10 Oct 2013 16:19:53 +0000 (12:19 -0400)
committerJames Bottomley <JBottomley@Parallels.com>
Fri, 25 Oct 2013 08:58:16 +0000 (09:58 +0100)
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/lpfc/lpfc_scsi.c
drivers/scsi/lpfc/lpfc_sli4.h

index c913e8cc3b269ca82096efd6e356dc8e9e635de9..443bbca9694cbd4b429b4e0d2523589a00191009 100644 (file)
@@ -1012,20 +1012,25 @@ lpfc_new_scsi_buf_s4(struct lpfc_vport *vport, int num_to_alloc)
                        break;
                }
 
-               /* Allocate iotag for psb->cur_iocbq. */
-               iotag = lpfc_sli_next_iotag(phba, &psb->cur_iocbq);
-               if (iotag == 0) {
+
+               lxri = lpfc_sli4_next_xritag(phba);
+               if (lxri == NO_XRI) {
                        pci_pool_free(phba->lpfc_scsi_dma_buf_pool,
-                               psb->data, psb->dma_handle);
+                             psb->data, psb->dma_handle);
                        kfree(psb);
                        break;
                }
 
-               lxri = lpfc_sli4_next_xritag(phba);
-               if (lxri == NO_XRI) {
+               /* Allocate iotag for psb->cur_iocbq. */
+               iotag = lpfc_sli_next_iotag(phba, &psb->cur_iocbq);
+               if (iotag == 0) {
                        pci_pool_free(phba->lpfc_scsi_dma_buf_pool,
-                             psb->data, psb->dma_handle);
+                               psb->data, psb->dma_handle);
                        kfree(psb);
+                       lpfc_printf_log(phba, KERN_ERR, LOG_FCP,
+                                       "3368 Failed to allocated IOTAG for"
+                                       " XRI:0x%x\n", lxri);
+                       lpfc_sli4_free_xri(phba, lxri);
                        break;
                }
                psb->cur_iocbq.sli4_lxritag = lxri;
index 85120b77aa0e99aea4621c2204342a47e11ce5ef..298c8cd1a89d9a2d5cd6b94d92bf08b5cd10de02 100644 (file)
@@ -673,6 +673,7 @@ void lpfc_sli4_queue_unset(struct lpfc_hba *);
 int lpfc_sli4_post_sgl(struct lpfc_hba *, dma_addr_t, dma_addr_t, uint16_t);
 int lpfc_sli4_repost_scsi_sgl_list(struct lpfc_hba *);
 uint16_t lpfc_sli4_next_xritag(struct lpfc_hba *);
+void lpfc_sli4_free_xri(struct lpfc_hba *, int);
 int lpfc_sli4_post_async_mbox(struct lpfc_hba *);
 int lpfc_sli4_post_scsi_sgl_block(struct lpfc_hba *, struct list_head *, int);
 struct lpfc_cq_event *__lpfc_sli4_cq_event_alloc(struct lpfc_hba *);