Re: [PATCH 04/12] pm80xx : Cleanup initialization loading fail path.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Dec 24, 2019 at 5:41 AM Deepak Ukey <deepak.ukey@xxxxxxxxxxxxx> wrote:
>
> From: Peter Chang <dpf@xxxxxxxxxx>
>
> 1)Move the instance tracking down after we think the instance is
> good to go. avoids having a use-after free.
> 2)There are goto targets for trying to cleanup if the hw fails to
> initialize, but there's some overlap depending on who thinks they
> own the sub-structures.
>
> Signed-off-by: Peter Chang <dpf@xxxxxxxxxx>
> Signed-off-by: Deepak Ukey <deepak.ukey@xxxxxxxxxxxxx>
> Signed-off-by: Viswas G <Viswas.G@xxxxxxxxxxxxx>
> Signed-off-by: Vishakha Channapattan <vishakhavc@xxxxxxxxxx>
> Signed-off-by: Bhavesh Jashnani <bjashnani@xxxxxxxxxx>
> Signed-off-by: Radha Ramachandran <radha@xxxxxxxxxx>
> Signed-off-by: Akshat Jain <akshatzen@xxxxxxxxxx>
> Signed-off-by: Yu Zheng <yuuzheng@xxxxxxxxxx>
The patch looks fine,
Acked-by: Jack Wang <jinpu.wang@xxxxxxxxxxxxxxx>
> ---
>  drivers/scsi/pm8001/pm8001_init.c | 17 +++++++++++------
>  1 file changed, 11 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c
> index a002eb5a3fe4..775517f9b39d 100644
> --- a/drivers/scsi/pm8001/pm8001_init.c
> +++ b/drivers/scsi/pm8001/pm8001_init.c
> @@ -1016,6 +1016,7 @@ static int pm8001_pci_probe(struct pci_dev *pdev,
>         struct pm8001_hba_info *pm8001_ha;
>         struct Scsi_Host *shost = NULL;
>         const struct pm8001_chip_info *chip;
> +       struct sas_ha_struct *sha;
>
>         dev_printk(KERN_INFO, &pdev->dev,
>                 "pm80xx: driver version %s\n", DRV_VERSION);
> @@ -1044,12 +1045,12 @@ static int pm8001_pci_probe(struct pci_dev *pdev,
>                 goto err_out_regions;
>         }
>         chip = &pm8001_chips[ent->driver_data];
> -       SHOST_TO_SAS_HA(shost) =
> -               kzalloc(sizeof(struct sas_ha_struct), GFP_KERNEL);
> -       if (!SHOST_TO_SAS_HA(shost)) {
> +       sha = kzalloc(sizeof(struct sas_ha_struct), GFP_KERNEL);
> +       if (!sha) {
>                 rc = -ENOMEM;
>                 goto err_out_free_host;
>         }
> +       SHOST_TO_SAS_HA(shost) = sha;
>
>         rc = pm8001_prep_sas_ha_init(shost, chip);
>         if (rc) {
> @@ -1070,7 +1071,7 @@ static int pm8001_pci_probe(struct pci_dev *pdev,
>                         "pm8001_setup_irq failed [ret: %d]\n", rc));
>                 goto err_out_shost;
>         }
> -       list_add_tail(&pm8001_ha->list, &hba_list);
> +
>         PM8001_CHIP_DISP->chip_soft_rst(pm8001_ha);
>         rc = PM8001_CHIP_DISP->chip_init(pm8001_ha);
>         if (rc) {
> @@ -1105,8 +1106,12 @@ static int pm8001_pci_probe(struct pci_dev *pdev,
>
>         pm8001_post_sas_ha_init(shost, chip);
>         rc = sas_register_ha(SHOST_TO_SAS_HA(shost));
> -       if (rc)
> +       if (rc) {
> +               PM8001_FAIL_DBG(pm8001_ha, pm8001_printk(
> +                       "sas_register_ha failed [ret: %d]\n", rc));
>                 goto err_out_shost;
> +       }
> +       list_add_tail(&pm8001_ha->list, &hba_list);
>         scsi_scan_host(pm8001_ha->shost);
>         pm8001_ha->flags = PM8001F_RUN_TIME;
>         return 0;
> @@ -1116,7 +1121,7 @@ static int pm8001_pci_probe(struct pci_dev *pdev,
>  err_out_ha_free:
>         pm8001_free(pm8001_ha);
>  err_out_free:
> -       kfree(SHOST_TO_SAS_HA(shost));
> +       kfree(sha);
>  err_out_free_host:
>         scsi_host_put(shost);
>  err_out_regions:
> --
> 2.16.3
>



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux