aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/probe.c
diff options
context:
space:
mode:
authorRajesh Shah <rajesh.shah@intel.com>2005-04-28 03:25:48 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2005-06-28 00:52:40 -0400
commite4ea9bb7e9f177e03a917b1f1213de0315f819ee (patch)
tree482599b5f367e997dfe30590860091bb06219882 /drivers/pci/probe.c
parentcc57450f5c044270d2cf1dd437c1850422262109 (diff)
[PATCH] acpi bridge hotadd: Take the PCI lock when modifying pci bus or device lists
With root bridge and pci bridge hot-plug, new buses and devices can be added or removed at run time. Protect the pci bus and device lists with the pci lock when doing so. Signed-off-by: Rajesh Shah <rajesh.shah@intel.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/pci/probe.c')
-rw-r--r--drivers/pci/probe.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 6186f4d7b119..7d171f83257f 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -374,8 +374,11 @@ struct pci_bus * __devinit pci_add_new_bus(struct pci_bus *parent, struct pci_de
374 struct pci_bus *child; 374 struct pci_bus *child;
375 375
376 child = pci_alloc_child_bus(parent, dev, busnr); 376 child = pci_alloc_child_bus(parent, dev, busnr);
377 if (child) 377 if (child) {
378 spin_lock(&pci_bus_lock);
378 list_add_tail(&child->node, &parent->children); 379 list_add_tail(&child->node, &parent->children);
380 spin_unlock(&pci_bus_lock);
381 }
379 return child; 382 return child;
380} 383}
381 384
@@ -765,7 +768,9 @@ pci_scan_single_device(struct pci_bus *bus, int devfn)
765 * and the bus list for fixup functions, etc. 768 * and the bus list for fixup functions, etc.
766 */ 769 */
767 INIT_LIST_HEAD(&dev->global_list); 770 INIT_LIST_HEAD(&dev->global_list);
771 spin_lock(&pci_bus_lock);
768 list_add_tail(&dev->bus_list, &bus->devices); 772 list_add_tail(&dev->bus_list, &bus->devices);
773 spin_unlock(&pci_bus_lock);
769 774
770 return dev; 775 return dev;
771} 776}
@@ -886,7 +891,9 @@ struct pci_bus * __devinit pci_scan_bus_parented(struct device *parent, int bus,
886 pr_debug("PCI: Bus %04x:%02x already known\n", pci_domain_nr(b), bus); 891 pr_debug("PCI: Bus %04x:%02x already known\n", pci_domain_nr(b), bus);
887 goto err_out; 892 goto err_out;
888 } 893 }
894 spin_lock(&pci_bus_lock);
889 list_add_tail(&b->node, &pci_root_buses); 895 list_add_tail(&b->node, &pci_root_buses);
896 spin_unlock(&pci_bus_lock);
890 897
891 memset(dev, 0, sizeof(*dev)); 898 memset(dev, 0, sizeof(*dev));
892 dev->parent = parent; 899 dev->parent = parent;
@@ -928,7 +935,9 @@ class_dev_create_file_err:
928class_dev_reg_err: 935class_dev_reg_err:
929 device_unregister(dev); 936 device_unregister(dev);
930dev_reg_err: 937dev_reg_err:
938 spin_lock(&pci_bus_lock);
931 list_del(&b->node); 939 list_del(&b->node);
940 spin_unlock(&pci_bus_lock);
932err_out: 941err_out:
933 kfree(dev); 942 kfree(dev);
934 kfree(b); 943 kfree(b);