Message ID | 20230404072133.1022-1-lishuchang@hust.edu.cn (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | [v2] scsi: lpfc: fix ioremap issues in 'lpfc_sli4_pci_mem_setup' | expand |
Looks okay. Reviewed-by: Justin Tee <justin.tee@broadcom.com> Thanks, Justin On Tue, Apr 4, 2023 at 12:24 AM <lishuchang@hust.edu.cn> wrote: > > From: Shuchang Li <lishuchang@hust.edu.cn> > > When if_type equals to zero and pci_resource_start(pdev, PCI_64BIT_BAR4) > returns false, drbl_regs_memmap_p is not remapped.This passes a NULL > pointer to iounmap(), which can trigger a WARN() on certain arches. > > When if_type equals to six and pci_resource_start(pdev, PCI_64BIT_BAR4) > returns true, drbl_regs_memmap_p may has been remapped and > ctrl_regs_memmap_p is not remapped. This is a resource leak and passes > a NULL pointer to iounmap(). > > To fix these issues, we need to add null checks before iounmap(), and > change some goto lables. > > Fixes: 1351e69fc6db ("scsi: lpfc: Add push-to-adapter support to sli4") > Signed-off-by: Shuchang Li <lishuchang@hust.edu.cn> > --- > drivers/scsi/lpfc/lpfc_init.c | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c > index 4f7485958c49..ed75230b0209 100644 > --- a/drivers/scsi/lpfc/lpfc_init.c > +++ b/drivers/scsi/lpfc/lpfc_init.c > @@ -12026,7 +12026,7 @@ lpfc_sli4_pci_mem_setup(struct lpfc_hba *phba) > goto out_iounmap_all; > } else { > error = -ENOMEM; > - goto out_iounmap_all; > + goto out_iounmap_ctrl; > } > } > > @@ -12044,7 +12044,7 @@ lpfc_sli4_pci_mem_setup(struct lpfc_hba *phba) > dev_err(&pdev->dev, > "ioremap failed for SLI4 HBA dpp registers.\n"); > error = -ENOMEM; > - goto out_iounmap_ctrl; > + goto out_iounmap_all; > } > phba->pci_bar4_memmap_p = phba->sli4_hba.dpp_regs_memmap_p; > } > @@ -12069,9 +12069,11 @@ lpfc_sli4_pci_mem_setup(struct lpfc_hba *phba) > return 0; > > out_iounmap_all: > - iounmap(phba->sli4_hba.drbl_regs_memmap_p); > + if (phba->sli4_hba.drbl_regs_memmap_p) > + iounmap(phba->sli4_hba.drbl_regs_memmap_p); > out_iounmap_ctrl: > - iounmap(phba->sli4_hba.ctrl_regs_memmap_p); > + if (phba->sli4_hba.ctrl_regs_memmap_p) > + iounmap(phba->sli4_hba.ctrl_regs_memmap_p); > out_iounmap_conf: > iounmap(phba->sli4_hba.conf_regs_memmap_p); > > -- > 2.25.1 >
> When if_type equals to zero and pci_resource_start(pdev, > PCI_64BIT_BAR4) returns false, drbl_regs_memmap_p is not remapped.This > passes a NULL pointer to iounmap(), which can trigger a WARN() on > certain arches. Applied to 6.4/scsi-staging, thanks!
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 4f7485958c49..ed75230b0209 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -12026,7 +12026,7 @@ lpfc_sli4_pci_mem_setup(struct lpfc_hba *phba) goto out_iounmap_all; } else { error = -ENOMEM; - goto out_iounmap_all; + goto out_iounmap_ctrl; } } @@ -12044,7 +12044,7 @@ lpfc_sli4_pci_mem_setup(struct lpfc_hba *phba) dev_err(&pdev->dev, "ioremap failed for SLI4 HBA dpp registers.\n"); error = -ENOMEM; - goto out_iounmap_ctrl; + goto out_iounmap_all; } phba->pci_bar4_memmap_p = phba->sli4_hba.dpp_regs_memmap_p; } @@ -12069,9 +12069,11 @@ lpfc_sli4_pci_mem_setup(struct lpfc_hba *phba) return 0; out_iounmap_all: - iounmap(phba->sli4_hba.drbl_regs_memmap_p); + if (phba->sli4_hba.drbl_regs_memmap_p) + iounmap(phba->sli4_hba.drbl_regs_memmap_p); out_iounmap_ctrl: - iounmap(phba->sli4_hba.ctrl_regs_memmap_p); + if (phba->sli4_hba.ctrl_regs_memmap_p) + iounmap(phba->sli4_hba.ctrl_regs_memmap_p); out_iounmap_conf: iounmap(phba->sli4_hba.conf_regs_memmap_p);