]> git.karo-electronics.de Git - linux-beck.git/commitdiff
PCI: Don't scan random busses in pci_scan_bridge()
authorAndreas Noever <andreas.noever@gmail.com>
Thu, 23 Jan 2014 20:59:28 +0000 (21:59 +0100)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 11 Feb 2014 22:21:08 +0000 (15:21 -0700)
When assigning a new bus number in pci_scan_bridge we check whether
max+1 is free by calling pci_find_bus. If it does already exist then we
assume that we are rescanning and that this is the right bus to scan.

This is fragile. If max+1 lies outside of bus->busn_res.end then we will
rescan some random bus from somewhere else in the hierachy. This patch
checks for this case and prints a warning.

[bhelgaas: add parent/child bus number info to dev_warn()]
Signed-off-by: Andreas Noever <andreas.noever@gmail.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/probe.c

index 1436288924c316618288830d9e9029f43e79904a..509494381a7a9acaec0e638d519ae3166b56687a 100644 (file)
@@ -829,12 +829,16 @@ int pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, int pass)
                        goto out;
                }
 
+               if (max >= bus->busn_res.end) {
+                       dev_warn(&dev->dev, "can't allocate child bus %02x from %pR\n",
+                                max, &bus->busn_res);
+                       goto out;
+               }
+
                /* Clear errors */
                pci_write_config_word(dev, PCI_STATUS, 0xffff);
 
-               /* Prevent assigning a bus number that already exists.
-                * This can happen when a bridge is hot-plugged, so in
-                * this case we only re-scan this bus. */
+               /* The bus will already exist if we are rescanning */
                child = pci_find_bus(pci_domain_nr(bus), max+1);
                if (!child) {
                        child = pci_add_new_bus(bus, dev, max+1);