scsi: lpfc: Fix crash caused by switch reboot
authorJames Smart <jsmart2021@gmail.com>
Mon, 1 Mar 2021 17:18:16 +0000 (09:18 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 4 Mar 2021 22:37:05 +0000 (17:37 -0500)
Driver is causing a crash in __lpfc_sli_release_iocbq_s4() when it
dereferences the els_wq which is NULL.

Validate the pring for the els_wq before dereferencing. Reorg the code to
move the pring assignment closer to where it is actually used.

Link: https://lore.kernel.org/r/20210301171821.3427-18-jsmart2021@gmail.com
Co-developed-by: Dick Kennedy <dick.kennedy@broadcom.com>
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_sli.c

index 56112c9fb6aa3da8ce89d3c85b65422b5e4c315b..941540fe67ba042abf742a060ee7bc968a53f0db 100644 (file)
@@ -1403,7 +1403,6 @@ __lpfc_sli_release_iocbq_s4(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
                        goto out;
                }
 
-               pring = phba->sli4_hba.els_wq->pring;
                if ((iocbq->iocb_flag & LPFC_EXCHANGE_BUSY) &&
                        (sglq->state != SGL_XRI_ABORTED)) {
                        spin_lock_irqsave(&phba->sli4_hba.sgl_list_lock,
@@ -1426,9 +1425,9 @@ __lpfc_sli_release_iocbq_s4(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq)
                                      &phba->sli4_hba.lpfc_els_sgl_list);
                        spin_unlock_irqrestore(
                                &phba->sli4_hba.sgl_list_lock, iflag);
-
+                       pring = lpfc_phba_elsring(phba);
                        /* Check if TXQ queue needs to be serviced */
-                       if (!list_empty(&pring->txq))
+                       if (pring && (!list_empty(&pring->txq)))
                                lpfc_worker_wake_up(phba);
                }
        }