Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b65f1d4d authored by Sreekanth Reddy's avatar Sreekanth Reddy Committed by Christoph Hellwig
Browse files

mpt3sas, mpt2sas: fix scsi_add_host error handling problems in _scsih_probe



In _scsih_probe, propagate the return value from scsi_add_host.
In mpt3sas, avoid calling list_del twice if that returns an
error, which causes list_del corruption warnings if an error
is returned.

Tested with blk-mq and scsi-mq patches to properly cleanup
from and propagate blk_mq_init_rq_map errors.

Signed-off-by: default avatarRobert Elliott <elliott@hp.com>
Acked-by: default avatarSreekanth Reddy <Sreekanth.Reddy@avagotech.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 70d8c86e
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -8147,6 +8147,7 @@ _scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)
{
	struct MPT2SAS_ADAPTER *ioc;
	struct Scsi_Host *shost;
	int rv;

	shost = scsi_host_alloc(&scsih_driver_template,
	    sizeof(struct MPT2SAS_ADAPTER));
@@ -8242,6 +8243,7 @@ _scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)
	if (!ioc->firmware_event_thread) {
		printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
		    ioc->name, __FILE__, __LINE__, __func__);
		rv = -ENODEV;
		goto out_thread_fail;
	}

@@ -8249,6 +8251,7 @@ _scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)
	if ((mpt2sas_base_attach(ioc))) {
		printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
		    ioc->name, __FILE__, __LINE__, __func__);
		rv = -ENODEV;
		goto out_attach_fail;
	}

@@ -8266,7 +8269,8 @@ _scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)
	} else
		ioc->hide_drives = 0;

	if ((scsi_add_host(shost, &pdev->dev))) {
	rv = scsi_add_host(shost, &pdev->dev);
	if (rv) {
		printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
		    ioc->name, __FILE__, __LINE__, __func__);
		goto out_add_shost_fail;
@@ -8283,7 +8287,7 @@ _scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 out_thread_fail:
	list_del(&ioc->list);
	scsi_host_put(shost);
	return -ENODEV;
	return rv;
}

#ifdef CONFIG_PM
+6 −3
Original line number Diff line number Diff line
@@ -7781,6 +7781,7 @@ _scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)
{
	struct MPT3SAS_ADAPTER *ioc;
	struct Scsi_Host *shost;
	int rv;

	shost = scsi_host_alloc(&scsih_driver_template,
	    sizeof(struct MPT3SAS_ADAPTER));
@@ -7873,6 +7874,7 @@ _scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)
	if (!ioc->firmware_event_thread) {
		pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
		    ioc->name, __FILE__, __LINE__, __func__);
		rv = -ENODEV;
		goto out_thread_fail;
	}

@@ -7880,12 +7882,13 @@ _scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)
	if ((mpt3sas_base_attach(ioc))) {
		pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
		    ioc->name, __FILE__, __LINE__, __func__);
		rv = -ENODEV;
		goto out_attach_fail;
	}
	if ((scsi_add_host(shost, &pdev->dev))) {
	rv = scsi_add_host(shost, &pdev->dev);
	if (rv) {
		pr_err(MPT3SAS_FMT "failure at %s:%d/%s()!\n",
		    ioc->name, __FILE__, __LINE__, __func__);
		list_del(&ioc->list);
		goto out_add_shost_fail;
	}

@@ -7898,7 +7901,7 @@ _scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 out_thread_fail:
	list_del(&ioc->list);
	scsi_host_put(shost);
	return -ENODEV;
	return rv;
}

#ifdef CONFIG_PM