Skip to content

Commit e21d369

Browse files
dwmw2ksacilotto
authored andcommitted
PCI: Fix pci_mmap_fits() for HAVE_PCI_RESOURCE_TO_USER platforms
BugLink: http://bugs.launchpad.net/bugs/1694621 commit 6bccc7f upstream. In the PCI_MMAP_PROCFS case when the address being passed by the user is a 'user visible' resource address based on the bus window, and not the actual contents of the resource, that's what we need to be checking it against. Signed-off-by: David Woodhouse <[email protected]> Signed-off-by: Bjorn Helgaas <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]> Signed-off-by: Stefan Bader <[email protected]> Signed-off-by: Thadeu Lima de Souza Cascardo <[email protected]>
1 parent ae5e3f8 commit e21d369

File tree

1 file changed

+7
-3
lines changed

1 file changed

+7
-3
lines changed

drivers/pci/pci-sysfs.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -977,15 +977,19 @@ void pci_remove_legacy_files(struct pci_bus *b)
977977
int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vma,
978978
enum pci_mmap_api mmap_api)
979979
{
980-
unsigned long nr, start, size, pci_start;
980+
unsigned long nr, start, size;
981+
resource_size_t pci_start = 0, pci_end;
981982

982983
if (pci_resource_len(pdev, resno) == 0)
983984
return 0;
984985
nr = vma_pages(vma);
985986
start = vma->vm_pgoff;
986987
size = ((pci_resource_len(pdev, resno) - 1) >> PAGE_SHIFT) + 1;
987-
pci_start = (mmap_api == PCI_MMAP_PROCFS) ?
988-
pci_resource_start(pdev, resno) >> PAGE_SHIFT : 0;
988+
if (mmap_api == PCI_MMAP_PROCFS) {
989+
pci_resource_to_user(pdev, resno, &pdev->resource[resno],
990+
&pci_start, &pci_end);
991+
pci_start >>= PAGE_SHIFT;
992+
}
989993
if (start >= pci_start && start < pci_start + size &&
990994
start + nr <= pci_start + size)
991995
return 1;

0 commit comments

Comments
 (0)