PCI: don't publish new root bus until it's fully initialized
authorBjorn Helgaas <bhelgaas@google.com>
Fri, 24 Feb 2012 03:18:59 +0000 (20:18 -0700)
committerBjorn Helgaas <bhelgaas@google.com>
Fri, 24 Feb 2012 03:18:59 +0000 (20:18 -0700)
When pci_create_root_bus() adds the new struct pci_bus to the global
pci_root_buses list, the bus becomes visible to other parts of the
kernel, so it should be fully initialized.

This patch delays adding the bus to the pci_root_buses list until after
all the struct pci_bus initialization is finished.

Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/probe.c

index dc904bd4b569c35d56c0a1e287896c0f23e68fc5..e4c0d1c6324dcacbb26bb8b444562c1f449cfab7 100644 (file)
@@ -1569,10 +1569,6 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
                goto err_out;
        }
 
-       down_write(&pci_bus_sem);
-       list_add_tail(&b->node, &pci_root_buses);
-       up_write(&pci_bus_sem);
-
        dev->parent = parent;
        dev->release = pci_release_bus_bridge_dev;
        dev_set_name(dev, "pci%04x:%02x", pci_domain_nr(b), bus);
@@ -1612,6 +1608,10 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
                        dev_info(&b->dev, "root bus resource %pR\n", res);
        }
 
+       down_write(&pci_bus_sem);
+       list_add_tail(&b->node, &pci_root_buses);
+       up_write(&pci_bus_sem);
+
        return b;
 
 class_dev_reg_err: