]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: mpt3sas: Block PCI config access from userspace during reset
authorSreekanth Reddy <sreekanth.reddy@broadcom.com>
Tue, 30 Mar 2021 10:51:37 +0000 (16:21 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 11 May 2021 12:04:02 +0000 (14:04 +0200)
commit 3c8604691d2acc7b7d4795d9695070de9eaa5828 upstream.

While diag reset is in progress there is short duration where all access to
controller's PCI config space from the host needs to be blocked. This is
due to a hardware limitation of the IOC controllers.

Block all access to controller's config space from userland applications by
calling pci_cfg_access_lock() while diag reset is in progress and unlocking
it again after the controller comes back to ready state.

Link: https://lore.kernel.org/r/20210330105137.20728-1-sreekanth.reddy@broadcom.com
Cc: stable@vger.kernel.org #v5.4.108+
Signed-off-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/scsi/mpt3sas/mpt3sas_base.c

index b6d42b2ce6fe449dc06c95d6ef3f8255d908c137..e72f1dbc91f7ff7dec3acbae912926dfd90fd79e 100644 (file)
@@ -6572,6 +6572,8 @@ _base_diag_reset(struct MPT3SAS_ADAPTER *ioc)
 
        ioc_info(ioc, "sending diag reset !!\n");
 
+       pci_cfg_access_lock(ioc->pdev);
+
        drsprintk(ioc, ioc_info(ioc, "clear interrupts\n"));
 
        count = 0;
@@ -6653,10 +6655,12 @@ _base_diag_reset(struct MPT3SAS_ADAPTER *ioc)
                goto out;
        }
 
+       pci_cfg_access_unlock(ioc->pdev);
        ioc_info(ioc, "diag reset: SUCCESS\n");
        return 0;
 
  out:
+       pci_cfg_access_unlock(ioc->pdev);
        ioc_err(ioc, "diag reset: FAILED\n");
        return -EFAULT;
 }