mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
PCI/sysfs: Return -EINVAL for unsupported I/O BAR mmap
Currently, mmap() of a resourceN file for an I/O BAR fails with -ENODEV on architectures where arch_can_pci_mmap_io() is 0, such as x86, because the attribute has no mmap callback there and the error comes from the generic kernfs dispatch. This is a side effect of commite854d8b2a8("PCI: Add arch_can_pci_mmap_io() on architectures which can mmap() I/O space"), which removed the mmap callback from the I/O resource attribute on these architectures. Previously the request reached the architecture mmap code and failed with -EINVAL, and the same commit deliberately kept -EINVAL for the identical operation on the procfs interface, so the two PCI userspace interfaces have disagreed ever since. Add a pci_mmap_resource_io_unsupported() callback that returns -EINVAL and use it as the mmap handler of the I/O resource attribute when arch_can_pci_mmap_io() is 0, so the failure is produced deliberately by PCI code, consistent with the procfs interface and with the behaviour beforee854d8b2a8. Architectures where arch_can_pci_mmap_io() is non-zero keep the real pci_mmap_resource_uc() handler and are unaffected. The mmap() fails either way. Only the reported error changes from -ENODEV to -EINVAL. Fixes:e854d8b2a8("PCI: Add arch_can_pci_mmap_io() on architectures which can mmap() I/O space") Signed-off-by: Krzysztof Wilczyński <kwilczynski@kernel.org> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Link: https://patch.msgid.link/20260720204624.1503794-1-kwilczynski@kernel.org
This commit is contained in:
parent
b14b2bab88
commit
bad94d3d18
|
|
@ -1274,7 +1274,16 @@ static loff_t pci_llseek_resource(struct file *filep,
|
|||
.llseek = pci_llseek_resource, \
|
||||
.mmap = pci_mmap_resource_uc,
|
||||
#else
|
||||
# define __PCI_RESOURCE_IO_MMAP_ATTRS
|
||||
static int pci_mmap_resource_io_unsupported(struct file *filp,
|
||||
struct kobject *kobj,
|
||||
const struct bin_attribute *attr,
|
||||
struct vm_area_struct *vma)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
# define __PCI_RESOURCE_IO_MMAP_ATTRS \
|
||||
.mmap = pci_mmap_resource_io_unsupported,
|
||||
#endif
|
||||
|
||||
#define pci_dev_resource_io_attr(_bar) \
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user