PCI: Supply CPU physical address (not bus address) to iomem_is_exclusive()
authorBjorn Helgaas <bhelgaas@google.com>
Fri, 8 Apr 2016 00:15:14 +0000 (17:15 -0700)
committerBen Hutchings <ben@decadent.org.uk>
Mon, 22 Aug 2016 21:37:08 +0000 (22:37 +0100)
commitc94e97f3a7795cbf6c0296fba1341e5508492055
tree8ac9f99f1008ffd634a4f9b60462100a4746e37d
parent79171d6541547fd3cf47aed2e5b5a61682f2e00b
PCI: Supply CPU physical address (not bus address) to iomem_is_exclusive()

commit ca620723d4ff9ea7ed484eab46264c3af871b9ae upstream.

iomem_is_exclusive() requires a CPU physical address, but on some arches we
supplied a PCI bus address instead.

On most arches, pci_resource_to_user(res) returns "res->start", which is a
CPU physical address.  But on microblaze, mips, powerpc, and sparc, it
returns the PCI bus address corresponding to "res->start".

The result is that pci_mmap_resource() may fail when it shouldn't (if the
bus address happens to match an existing resource), or it may succeed when
it should fail (if the resource is exclusive but the bus address doesn't
match it).

Call iomem_is_exclusive() with "res->start", which is always a CPU physical
address, not the result of pci_resource_to_user().

Fixes: e8de1481fd71 ("resource: allow MMIO exclusivity for device drivers")
Suggested-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
CC: Arjan van de Ven <arjan@linux.intel.com>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/pci/pci-sysfs.c