| From b53cba38c869817790399102fb8ffbad4159377a Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 28 May 2021 18:43:04 +0530 |
| Subject: scsi: megaraid_sas: Fix resource leak in case of probe failure |
| |
| From: Chandrakanth Patil <chandrakanth.patil@broadcom.com> |
| |
| [ Upstream commit b5438f48fdd8e1c3f130d32637511efd32038152 ] |
| |
| The driver doesn't clean up all the allocated resources properly when |
| scsi_add_host(), megasas_start_aen() function fails during the PCI device |
| probe. |
| |
| Clean up all those resources. |
| |
| Link: https://lore.kernel.org/r/20210528131307.25683-3-chandrakanth.patil@broadcom.com |
| Signed-off-by: Chandrakanth Patil <chandrakanth.patil@broadcom.com> |
| Signed-off-by: Sumit Saxena <sumit.saxena@broadcom.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/scsi/megaraid/megaraid_sas_base.c | 13 +++++++++++++ |
| drivers/scsi/megaraid/megaraid_sas_fusion.c | 1 + |
| 2 files changed, 14 insertions(+) |
| |
| diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c |
| index 63a4f48bdc75..7ab741f03b84 100644 |
| --- a/drivers/scsi/megaraid/megaraid_sas_base.c |
| +++ b/drivers/scsi/megaraid/megaraid_sas_base.c |
| @@ -7478,11 +7478,16 @@ static int megasas_probe_one(struct pci_dev *pdev, |
| return 0; |
| |
| fail_start_aen: |
| + instance->unload = 1; |
| + scsi_remove_host(instance->host); |
| fail_io_attach: |
| megasas_mgmt_info.count--; |
| megasas_mgmt_info.max_index--; |
| megasas_mgmt_info.instance[megasas_mgmt_info.max_index] = NULL; |
| |
| + if (instance->requestorId && !instance->skip_heartbeat_timer_del) |
| + del_timer_sync(&instance->sriov_heartbeat_timer); |
| + |
| instance->instancet->disable_intr(instance); |
| megasas_destroy_irqs(instance); |
| |
| @@ -7490,8 +7495,16 @@ fail_io_attach: |
| megasas_release_fusion(instance); |
| else |
| megasas_release_mfi(instance); |
| + |
| if (instance->msix_vectors) |
| pci_free_irq_vectors(instance->pdev); |
| + instance->msix_vectors = 0; |
| + |
| + if (instance->fw_crash_state != UNAVAILABLE) |
| + megasas_free_host_crash_buffer(instance); |
| + |
| + if (instance->adapter_type != MFI_SERIES) |
| + megasas_fusion_stop_watchdog(instance); |
| fail_init_mfi: |
| scsi_host_put(host); |
| fail_alloc_instance: |
| diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c |
| index 73295cf74cbe..54f8a8073ca0 100644 |
| --- a/drivers/scsi/megaraid/megaraid_sas_fusion.c |
| +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c |
| @@ -5201,6 +5201,7 @@ megasas_alloc_fusion_context(struct megasas_instance *instance) |
| if (!fusion->log_to_span) { |
| dev_err(&instance->pdev->dev, "Failed from %s %d\n", |
| __func__, __LINE__); |
| + kfree(instance->ctrl_context); |
| return -ENOMEM; |
| } |
| } |
| -- |
| 2.30.2 |
| |