| From 37d99fd2aa64f8fac8e1459c27538e50717e7c69 Mon Sep 17 00:00:00 2001 |
| From: Johannes Thumshirn <johannes.thumshirn@wdc.com> |
| Date: Wed, 1 Jul 2020 22:14:54 +0900 |
| Subject: [PATCH] scsi: mpt3sas: Fix error returns in BRM_status_show |
| |
| commit 0fd181456aa0826057adbfb6c79c40f4083cfd75 upstream. |
| |
| BRM_status_show() has several error branches, but none of them record the |
| error in the error return. |
| |
| Also while at it remove the manual mutex_unlock() of the pci_access_mutex |
| in case of an ongoing pci error recovery or host removal and jump to the |
| cleanup label instead. |
| |
| Note: We can safely jump to out from here as io_unit_pg3 is initialized to |
| NULL and if it hasn't been allocated, kfree() skips the NULL pointer. |
| |
| [mkp: compilation warning] |
| |
| Link: https://lore.kernel.org/r/20200701131454.5255-1-johannes.thumshirn@wdc.com |
| Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com> |
| Acked-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com> |
| Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/scsi/mpt3sas/mpt3sas_ctl.c b/drivers/scsi/mpt3sas/mpt3sas_ctl.c |
| index 521e18302b8b..10f8e1791a5a 100644 |
| --- a/drivers/scsi/mpt3sas/mpt3sas_ctl.c |
| +++ b/drivers/scsi/mpt3sas/mpt3sas_ctl.c |
| @@ -2897,15 +2897,14 @@ _ctl_BRM_status_show(struct device *cdev, struct device_attribute *attr, |
| } |
| /* pci_access_mutex lock acquired by sysfs show path */ |
| mutex_lock(&ioc->pci_access_mutex); |
| - if (ioc->pci_error_recovery || ioc->remove_host) { |
| - mutex_unlock(&ioc->pci_access_mutex); |
| - return 0; |
| - } |
| + if (ioc->pci_error_recovery || ioc->remove_host) |
| + goto out; |
| |
| /* allocate upto GPIOVal 36 entries */ |
| sz = offsetof(Mpi2IOUnitPage3_t, GPIOVal) + (sizeof(u16) * 36); |
| io_unit_pg3 = kzalloc(sz, GFP_KERNEL); |
| if (!io_unit_pg3) { |
| + rc = -ENOMEM; |
| ioc_err(ioc, "%s: failed allocating memory for iounit_pg3: (%d) bytes\n", |
| __func__, sz); |
| goto out; |
| @@ -2915,6 +2914,7 @@ _ctl_BRM_status_show(struct device *cdev, struct device_attribute *attr, |
| 0) { |
| ioc_err(ioc, "%s: failed reading iounit_pg3\n", |
| __func__); |
| + rc = -EINVAL; |
| goto out; |
| } |
| |
| @@ -2922,12 +2922,14 @@ _ctl_BRM_status_show(struct device *cdev, struct device_attribute *attr, |
| if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { |
| ioc_err(ioc, "%s: iounit_pg3 failed with ioc_status(0x%04x)\n", |
| __func__, ioc_status); |
| + rc = -EINVAL; |
| goto out; |
| } |
| |
| if (io_unit_pg3->GPIOCount < 25) { |
| ioc_err(ioc, "%s: iounit_pg3->GPIOCount less than 25 entries, detected (%d) entries\n", |
| __func__, io_unit_pg3->GPIOCount); |
| + rc = -EINVAL; |
| goto out; |
| } |
| |
| -- |
| 2.27.0 |
| |