diff options
author | Rajesh Shah <rajesh.shah@intel.com> | 2005-04-28 03:25:48 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2005-06-28 00:52:40 -0400 |
commit | e4ea9bb7e9f177e03a917b1f1213de0315f819ee (patch) | |
tree | 482599b5f367e997dfe30590860091bb06219882 /drivers/pci/probe.c | |
parent | cc57450f5c044270d2cf1dd437c1850422262109 (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.c | 11 |
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: | |||
928 | class_dev_reg_err: | 935 | class_dev_reg_err: |
929 | device_unregister(dev); | 936 | device_unregister(dev); |
930 | dev_reg_err: | 937 | dev_reg_err: |
938 | spin_lock(&pci_bus_lock); | ||
931 | list_del(&b->node); | 939 | list_del(&b->node); |
940 | spin_unlock(&pci_bus_lock); | ||
932 | err_out: | 941 | err_out: |
933 | kfree(dev); | 942 | kfree(dev); |
934 | kfree(b); | 943 | kfree(b); |