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 >