diff mbox series

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

Message ID 20191224044143.8178-5-deepak.ukey@microchip.com (mailing list archive)
State Changes Requested
Headers show
Series pm80xx : Updates for the driver version 0.1.39. | expand

Commit Message

Deepak Ukey Dec. 24, 2019, 4:41 a.m. UTC
From: Peter Chang <dpf@google.com>

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@google.com>
Signed-off-by: Deepak Ukey <deepak.ukey@microchip.com>
Signed-off-by: Viswas G <Viswas.G@microchip.com>
Signed-off-by: Vishakha Channapattan <vishakhavc@google.com>
Signed-off-by: Bhavesh Jashnani <bjashnani@google.com>
Signed-off-by: Radha Ramachandran <radha@google.com>
Signed-off-by: Akshat Jain <akshatzen@google.com>
Signed-off-by: Yu Zheng <yuuzheng@google.com>
---
 drivers/scsi/pm8001/pm8001_init.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

Comments

Jinpu Wang Jan. 2, 2020, 11:58 a.m. UTC | #1
On Tue, Dec 24, 2019 at 5:41 AM Deepak Ukey <deepak.ukey@microchip.com> wrote:
>
> From: Peter Chang <dpf@google.com>
>
> 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@google.com>
> Signed-off-by: Deepak Ukey <deepak.ukey@microchip.com>
> Signed-off-by: Viswas G <Viswas.G@microchip.com>
> Signed-off-by: Vishakha Channapattan <vishakhavc@google.com>
> Signed-off-by: Bhavesh Jashnani <bjashnani@google.com>
> Signed-off-by: Radha Ramachandran <radha@google.com>
> Signed-off-by: Akshat Jain <akshatzen@google.com>
> Signed-off-by: Yu Zheng <yuuzheng@google.com>
The patch looks fine,
Acked-by: Jack Wang <jinpu.wang@cloud.ionos.com>
> ---
>  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
>
diff mbox series

Patch

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: