Skip to content

Commit 68da4e0

Browse files
committed
Revert "PCI: Remove struct pci_dev->driver"
This reverts commit b5f9c64. Revert b5f9c64 ("PCI: Remove struct pci_dev->driver"), which is needed to revert 2a4d940 ("PCI: Use to_pci_driver() instead of pci_dev->driver"). 2a4d940 caused a NULL pointer dereference reported by Robert Święcki. Details in the revert of that commit. Fixes: 2a4d940 ("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: Robert Święcki <[email protected]> Tested-by: Robert Święcki <[email protected]> Signed-off-by: Bjorn Helgaas <[email protected]>
1 parent dda4b38 commit 68da4e0

File tree

2 files changed

+5
-0
lines changed

2 files changed

+5
-0
lines changed

drivers/pci/pci-driver.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,10 +319,12 @@ static long local_pci_probe(void *_ddi)
319319
* its remove routine.
320320
*/
321321
pm_runtime_get_sync(dev);
322+
pci_dev->driver = pci_drv;
322323
rc = pci_drv->probe(pci_dev, ddi->id);
323324
if (!rc)
324325
return rc;
325326
if (rc < 0) {
327+
pci_dev->driver = NULL;
326328
pm_runtime_put_sync(dev);
327329
return rc;
328330
}
@@ -388,6 +390,7 @@ static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev,
388390
* @pci_dev: PCI device being probed
389391
*
390392
* returns 0 on success, else error.
393+
* side-effect: pci_dev->driver is set to drv when drv claims pci_dev.
391394
*/
392395
static int __pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev)
393396
{
@@ -462,6 +465,7 @@ static void pci_device_remove(struct device *dev)
462465
pm_runtime_put_noidle(dev);
463466
}
464467
pcibios_free_irq(pci_dev);
468+
pci_dev->driver = NULL;
465469
pci_iov_remove(pci_dev);
466470

467471
/* Undo the runtime PM settings in local_pci_probe() */

include/linux/pci.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,7 @@ struct pci_dev {
342342
u16 pcie_flags_reg; /* Cached PCIe Capabilities Register */
343343
unsigned long *dma_alias_mask;/* Mask of enabled devfn aliases */
344344

345+
struct pci_driver *driver; /* Driver bound to this device */
345346
u64 dma_mask; /* Mask of the bits of bus address this
346347
device implements. Normally this is
347348
0xffffffff. You only need to change

0 commit comments

Comments
 (0)