aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2008-03-13 00:48:03 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2008-03-13 13:21:09 -0400
commitcc74d96f47b0d916840f92092595e3be9731e047 (patch)
tree0fa90374b3c0620a2028e7aa7ec28e40c4283039
parent93d74463d018ddf05c169ad399e62e90e0f82fc0 (diff)
PCI: fix issue with busses registering multiple times in sysfs
PCI busses can be registered multiple times, so we need to detect if we have registered our bus structure in sysfs already. If so, don't do it again. Thanks to Guennadi Liakhovetski <g.liakhovetski@gmx.de> for reporting the problem, and to Linus for poking me to get me to believe that it was a real problem. Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/pci/bus.c6
-rw-r--r--include/linux/pci.h1
2 files changed, 6 insertions, 1 deletions
diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c
index 6a9403d79e0c..d708358326e5 100644
--- a/drivers/pci/bus.c
+++ b/drivers/pci/bus.c
@@ -143,14 +143,18 @@ void pci_bus_add_devices(struct pci_bus *bus)
143 /* register the bus with sysfs as the parent is now 143 /* register the bus with sysfs as the parent is now
144 * properly registered. */ 144 * properly registered. */
145 child_bus = dev->subordinate; 145 child_bus = dev->subordinate;
146 if (child_bus->is_added)
147 continue;
146 child_bus->dev.parent = child_bus->bridge; 148 child_bus->dev.parent = child_bus->bridge;
147 retval = device_register(&child_bus->dev); 149 retval = device_register(&child_bus->dev);
148 if (retval) 150 if (retval)
149 dev_err(&dev->dev, "Error registering pci_bus," 151 dev_err(&dev->dev, "Error registering pci_bus,"
150 " continuing...\n"); 152 " continuing...\n");
151 else 153 else {
154 child_bus->is_added = 1;
152 retval = device_create_file(&child_bus->dev, 155 retval = device_create_file(&child_bus->dev,
153 &dev_attr_cpuaffinity); 156 &dev_attr_cpuaffinity);
157 }
154 if (retval) 158 if (retval)
155 dev_err(&dev->dev, "Error creating cpuaffinity" 159 dev_err(&dev->dev, "Error creating cpuaffinity"
156 " file, continuing...\n"); 160 " file, continuing...\n");
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 38eff1947750..9010f5458767 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -278,6 +278,7 @@ struct pci_bus {
278 struct device dev; 278 struct device dev;
279 struct bin_attribute *legacy_io; /* legacy I/O for this bus */ 279 struct bin_attribute *legacy_io; /* legacy I/O for this bus */
280 struct bin_attribute *legacy_mem; /* legacy mem */ 280 struct bin_attribute *legacy_mem; /* legacy mem */
281 unsigned int is_added:1;
281}; 282};
282 283
283#define pci_bus_b(n) list_entry(n, struct pci_bus, node) 284#define pci_bus_b(n) list_entry(n, struct pci_bus, node)