struct pci_bus *child;
 
        child = pci_alloc_child_bus(parent, dev, busnr);
-       if (child)
+       if (child) {
+               spin_lock(&pci_bus_lock);
                list_add_tail(&child->node, &parent->children);
+               spin_unlock(&pci_bus_lock);
+       }
        return child;
 }
 
         * and the bus list for fixup functions, etc.
         */
        INIT_LIST_HEAD(&dev->global_list);
+       spin_lock(&pci_bus_lock);
        list_add_tail(&dev->bus_list, &bus->devices);
+       spin_unlock(&pci_bus_lock);
 
        return dev;
 }
                pr_debug("PCI: Bus %04x:%02x already known\n", pci_domain_nr(b), bus);
                goto err_out;
        }
+       spin_lock(&pci_bus_lock);
        list_add_tail(&b->node, &pci_root_buses);
+       spin_unlock(&pci_bus_lock);
 
        memset(dev, 0, sizeof(*dev));
        dev->parent = parent;
 class_dev_reg_err:
        device_unregister(dev);
 dev_reg_err:
+       spin_lock(&pci_bus_lock);
        list_del(&b->node);
+       spin_unlock(&pci_bus_lock);
 err_out:
        kfree(dev);
        kfree(b);