提交 68da4e0e 编写于 作者: B Bjorn Helgaas

Revert "PCI: Remove struct pci_dev->driver"

This reverts commit b5f9c644.

Revert b5f9c644 ("PCI: Remove struct pci_dev->driver"), which is needed
to revert 2a4d9408 ("PCI: Use to_pci_driver() instead of
pci_dev->driver").

2a4d9408 caused a NULL pointer dereference reported by Robert Święcki.
Details in the revert of that commit.

Fixes: 2a4d9408 ("PCI: Use to_pci_driver() instead of pci_dev->driver")
Link: https://lore.kernel.org/linux-i2c/CAP145pgdrdiMAT7=-iB1DMgA7t_bMqTcJL4N0=6u8kNY3EU0dw@mail.gmail.com/Reported-by: NRobert Święcki <robert@swiecki.net>
Tested-by: NRobert Święcki <robert@swiecki.net>
Signed-off-by: NBjorn Helgaas <bhelgaas@google.com>
上级 dda4b381
...@@ -319,10 +319,12 @@ static long local_pci_probe(void *_ddi) ...@@ -319,10 +319,12 @@ static long local_pci_probe(void *_ddi)
* its remove routine. * its remove routine.
*/ */
pm_runtime_get_sync(dev); pm_runtime_get_sync(dev);
pci_dev->driver = pci_drv;
rc = pci_drv->probe(pci_dev, ddi->id); rc = pci_drv->probe(pci_dev, ddi->id);
if (!rc) if (!rc)
return rc; return rc;
if (rc < 0) { if (rc < 0) {
pci_dev->driver = NULL;
pm_runtime_put_sync(dev); pm_runtime_put_sync(dev);
return rc; return rc;
} }
...@@ -388,6 +390,7 @@ static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev, ...@@ -388,6 +390,7 @@ static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev,
* @pci_dev: PCI device being probed * @pci_dev: PCI device being probed
* *
* returns 0 on success, else error. * returns 0 on success, else error.
* side-effect: pci_dev->driver is set to drv when drv claims pci_dev.
*/ */
static int __pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev) static int __pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev)
{ {
...@@ -462,6 +465,7 @@ static void pci_device_remove(struct device *dev) ...@@ -462,6 +465,7 @@ static void pci_device_remove(struct device *dev)
pm_runtime_put_noidle(dev); pm_runtime_put_noidle(dev);
} }
pcibios_free_irq(pci_dev); pcibios_free_irq(pci_dev);
pci_dev->driver = NULL;
pci_iov_remove(pci_dev); pci_iov_remove(pci_dev);
/* Undo the runtime PM settings in local_pci_probe() */ /* Undo the runtime PM settings in local_pci_probe() */
......
...@@ -342,6 +342,7 @@ struct pci_dev { ...@@ -342,6 +342,7 @@ struct pci_dev {
u16 pcie_flags_reg; /* Cached PCIe Capabilities Register */ u16 pcie_flags_reg; /* Cached PCIe Capabilities Register */
unsigned long *dma_alias_mask;/* Mask of enabled devfn aliases */ unsigned long *dma_alias_mask;/* Mask of enabled devfn aliases */
struct pci_driver *driver; /* Driver bound to this device */
u64 dma_mask; /* Mask of the bits of bus address this u64 dma_mask; /* Mask of the bits of bus address this
device implements. Normally this is device implements. Normally this is
0xffffffff. You only need to change 0xffffffff. You only need to change
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册