scsi: lpfc: Fix panic when FW-log buffsize is not initialized
authorJames Smart <jsmart2021@gmail.com>
Fri, 30 Nov 2018 00:09:27 +0000 (16:09 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sat, 8 Dec 2018 03:35:31 +0000 (22:35 -0500)
While trying to get adapter fw-log for a function whose buffsize was set to
0, kernel panic occurred.

When buffsize is 0, the kernel buffer for the log won't be allocated.  When
fw log usage was enabled, it failed to check the buffer size, and log usage
was started. Eventually the driver referenced the unallocated log buffer.

Added checks of the buffer size before allowing fw logging to be enabled
and added check for valid buffer if enabling fw log.

Performed a couple other minor cleanups while fixing this:
 - clarified log messages
 - re-evaluated log message severity
 - treat any error as an error, not only a couple codes

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_bsg.c
drivers/scsi/lpfc/lpfc_init.c
drivers/scsi/lpfc/lpfc_sli.c

index 43dcd1daa6165c759fafc5a3a10719f799da0435..9b8edfb06cb03358d6ca52909f88374b3ba1a272 100644 (file)
@@ -5348,7 +5348,7 @@ lpfc_bsg_get_ras_config(struct bsg_job *job)
            sizeof(struct fc_bsg_request) +
            sizeof(struct lpfc_bsg_ras_req)) {
                lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
-                               "6181 Received RAS_LOG request "
+                               "6192 FW_LOG request received "
                                "below minimum size\n");
                rc = -EINVAL;
                goto ras_job_error;
@@ -5356,7 +5356,7 @@ lpfc_bsg_get_ras_config(struct bsg_job *job)
 
        /* Check FW log status */
        rc = lpfc_check_fwlog_support(phba);
-       if (rc == -EACCES || rc == -EPERM)
+       if (rc)
                goto ras_job_error;
 
        ras_reply = (struct lpfc_bsg_get_ras_config_reply *)
@@ -5430,7 +5430,7 @@ lpfc_bsg_set_ras_config(struct bsg_job *job)
 
        /* Check FW log status */
        rc = lpfc_check_fwlog_support(phba);
-       if (rc == -EACCES || rc == -EPERM)
+       if (rc)
                goto ras_job_error;
 
        ras_req = (struct lpfc_bsg_set_ras_config_req *)
@@ -5500,7 +5500,7 @@ lpfc_bsg_get_ras_lwpd(struct bsg_job *job)
        int rc = 0;
 
        rc = lpfc_check_fwlog_support(phba);
-       if (rc == -EACCES || rc == -EPERM)
+       if (rc)
                goto ras_job_error;
 
        if (job->request_len <
@@ -5516,6 +5516,12 @@ lpfc_bsg_get_ras_lwpd(struct bsg_job *job)
        ras_reply = (struct lpfc_bsg_get_ras_lwpd *)
                bsg_reply->reply_data.vendor_reply.vendor_rsp;
 
+       if (!ras_fwlog->lwpd.virt) {
+               lpfc_printf_log(phba, KERN_ERR, LOG_LIBDFC,
+                               "6193 Restart FW Logging\n");
+               return -EINVAL;
+       }
+
        /* Get lwpd offset */
        lwpd_ptr = (uint32_t *)(ras_fwlog->lwpd.virt);
        ras_reply->offset = be32_to_cpu(*lwpd_ptr & 0xffffffff);
@@ -5557,7 +5563,7 @@ lpfc_bsg_get_ras_fwlog(struct bsg_job *job)
        ras_fwlog = &phba->ras_fwlog;
 
        rc = lpfc_check_fwlog_support(phba);
-       if (rc == -EACCES || rc == -EPERM)
+       if (rc)
                goto ras_job_error;
 
        /* Logging to be stopped before reading */
index 7d8135591401ac7cf399024cd4a5690d7d3f07cf..d20a55aa153b45cc35becab66a3d329a0a735f48 100644 (file)
@@ -12635,7 +12635,8 @@ lpfc_sli4_ras_init(struct lpfc_hba *phba)
        case PCI_DEVICE_ID_LANCER_G6_FC:
        case PCI_DEVICE_ID_LANCER_G7_FC:
                phba->ras_fwlog.ras_hwsupport = true;
-               if (phba->cfg_ras_fwlog_func == PCI_FUNC(phba->pcidev->devfn))
+               if (phba->cfg_ras_fwlog_func == PCI_FUNC(phba->pcidev->devfn) &&
+                   phba->cfg_ras_fwlog_buffsize)
                        phba->ras_fwlog.ras_enabled = true;
                else
                        phba->ras_fwlog.ras_enabled = false;
index 3912a2d0b95d5cdb7bad9489da9192d7a3aeaad2..770cef54aaa4bf2612676ddcdf3dd194ceaa2fc0 100644 (file)
@@ -6212,7 +6212,7 @@ lpfc_sli4_ras_dma_alloc(struct lpfc_hba *phba,
                                            &ras_fwlog->lwpd.phys,
                                            GFP_KERNEL);
        if (!ras_fwlog->lwpd.virt) {
-               lpfc_printf_log(phba, KERN_WARNING, LOG_INIT,
+               lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
                                "6185 LWPD Memory Alloc Failed\n");
 
                return -ENOMEM;
@@ -6274,11 +6274,13 @@ lpfc_sli4_ras_mbox_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
        shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
 
        if (mb->mbxStatus != MBX_SUCCESS || shdr_status) {
-               lpfc_printf_log(phba, KERN_WARNING, LOG_MBOX,
+               lpfc_printf_log(phba, KERN_ERR, LOG_MBOX,
                                "6188 FW LOG mailbox "
                                "completed with status x%x add_status x%x,"
                                " mbx status x%x\n",
                                shdr_status, shdr_add_status, mb->mbxStatus);
+
+               ras_fwlog->ras_hwsupport = false;
                goto disable_ras;
        }
 
@@ -6326,7 +6328,7 @@ lpfc_sli4_ras_fwlog_init(struct lpfc_hba *phba,
                rc = lpfc_sli4_ras_dma_alloc(phba, fwlog_entry_count);
                if (rc) {
                        lpfc_printf_log(phba, KERN_WARNING, LOG_INIT,
-                                       "6189 RAS FW Log Support Not Enabled");
+                                       "6189 FW Log Memory Allocation Failed");
                        return rc;
                }
        }
@@ -6334,7 +6336,7 @@ lpfc_sli4_ras_fwlog_init(struct lpfc_hba *phba,
        /* Setup Mailbox command */
        mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
        if (!mbox) {
-               lpfc_printf_log(phba, KERN_WARNING, LOG_INIT,
+               lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
                                "6190 RAS MBX Alloc Failed");
                rc = -ENOMEM;
                goto mem_free;
@@ -6379,8 +6381,8 @@ lpfc_sli4_ras_fwlog_init(struct lpfc_hba *phba,
        rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT);
 
        if (rc == MBX_NOT_FINISHED) {
-               lpfc_printf_log(phba, KERN_WARNING, LOG_INIT,
-                               "6191 RAS Mailbox failed. "
+               lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
+                               "6191 FW-Log Mailbox failed. "
                                "status %d mbxStatus : x%x", rc,
                                bf_get(lpfc_mqe_status, &mbox->u.mqe));
                mempool_free(mbox, phba->mbox_mem_pool);