OSDN Git Service

scsi: lpfc: Fix crash doing IO with resets
authorJames Smart <jsmart2021@gmail.com>
Fri, 16 Jun 2017 05:56:48 +0000 (22:56 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 20 Jun 2017 01:40:44 +0000 (21:40 -0400)
During every reset, IOCBs are allocated. So, at one point, number of
allocated IOCBs reaches maximum limit and lpfc_sli_next_iotag fails.

Allocate IOCBs only during initialization. Reuse them after every reset
instead of allocating new set of IOCBs.

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_sli.c

index 8de70b9..e948ea0 100644 (file)
@@ -6927,18 +6927,6 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
                cnt = phba->cfg_iocb_cnt * 1024;
                /* We need 1 iocbq for every SGL, for IO processing */
                cnt += phba->sli4_hba.nvmet_xri_cnt;
-               /* Initialize and populate the iocb list per host */
-               lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
-                               "2821 initialize iocb list %d total %d\n",
-                               phba->cfg_iocb_cnt, cnt);
-               rc = lpfc_init_iocb_list(phba, cnt);
-               if (rc) {
-                       lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
-                                       "1413 Failed to init iocb list.\n");
-                       goto out_destroy_queue;
-               }
-
-               lpfc_nvmet_create_targetport(phba);
        } else {
                /* update host scsi xri-sgl sizes and mappings */
                rc = lpfc_sli4_scsi_sgl_update(phba);
@@ -6959,18 +6947,24 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
                }
 
                cnt = phba->cfg_iocb_cnt * 1024;
+       }
+
+       if (!phba->sli.iocbq_lookup) {
                /* Initialize and populate the iocb list per host */
                lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
-                               "2820 initialize iocb list %d total %d\n",
+                               "2821 initialize iocb list %d total %d\n",
                                phba->cfg_iocb_cnt, cnt);
                rc = lpfc_init_iocb_list(phba, cnt);
                if (rc) {
                        lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
-                                       "6301 Failed to init iocb list.\n");
+                                       "1413 Failed to init iocb list.\n");
                        goto out_destroy_queue;
                }
        }
 
+       if (phba->nvmet_support)
+               lpfc_nvmet_create_targetport(phba);
+
        if (phba->nvmet_support && phba->cfg_nvmet_mrq) {
                /* Post initial buffers to all RQs created */
                for (i = 0; i < phba->cfg_nvmet_mrq; i++) {