diff options
author | Yinghai Lu <yinghai@kernel.org> | 2013-11-30 14:40:29 -0800 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2013-12-18 13:53:40 -0700 |
commit | ef83b0781a73f9efcb1228256bfdfb97fc9533a8 (patch) | |
tree | 01c8a9940789bfcef622006d9d8eb26fd4ab0ce6 /drivers/pci/remove.c | |
parent | ef37702eb3cae2ec35d56ddd4f096cd47fec3f0d (diff) |
PCI: Remove from bus_list and release resources in pci_release_dev()
Previously we removed the pci_dev from the bus_list and released its
resources in pci_destroy_dev(). But that's too early: it's possible to
call pci_destroy_dev() twice for the same device (e.g., via sysfs), and
that will cause an oops when we try to remove it from bus_list the second
time.
We should remove it from the bus_list only when the last reference to the
pci_dev has been released, i.e., in pci_release_dev().
[bhelgaas: changelog]
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat (limited to 'drivers/pci/remove.c')
-rw-r--r-- | drivers/pci/remove.c | 19 |
1 files changed, 0 insertions, 19 deletions
diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c index 692f4c39ac4..f452148e6d5 100644 --- a/drivers/pci/remove.c +++ b/drivers/pci/remove.c @@ -3,20 +3,6 @@ #include <linux/pci-aspm.h> #include "pci.h" -static void pci_free_resources(struct pci_dev *dev) -{ - int i; - - msi_remove_pci_irq_vectors(dev); - - pci_cleanup_rom(dev); - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *res = dev->resource + i; - if (res->parent) - release_resource(res); - } -} - static void pci_stop_dev(struct pci_dev *dev) { pci_pme_active(dev, false); @@ -36,11 +22,6 @@ static void pci_destroy_dev(struct pci_dev *dev) { device_del(&dev->dev); - down_write(&pci_bus_sem); - list_del(&dev->bus_list); - up_write(&pci_bus_sem); - - pci_free_resources(dev); put_device(&dev->dev); } |