ChangeSet 1.1386, 2003/06/10 10:30:30-07:00, greg@kroah.com

[PATCH] PCI: add pci_find_next_bus() function to prevent people from walking pci bus lists themselves.


 drivers/pci/search.c |   25 ++++++++++++++++++++++---
 include/linux/pci.h  |    1 +
 2 files changed, 23 insertions(+), 3 deletions(-)


diff -Nru a/drivers/pci/search.c b/drivers/pci/search.c
--- a/drivers/pci/search.c	Tue Jun 10 11:15:57 2003
+++ b/drivers/pci/search.c	Tue Jun 10 11:15:57 2003
@@ -29,10 +29,10 @@
 struct pci_bus *
 pci_find_bus(unsigned char busnr)
 {
-	struct pci_bus* bus;
+	struct pci_bus* bus = NULL;
 	struct pci_bus* tmp_bus;
 
-	pci_for_each_bus(bus) {
+	while ((bus = pci_find_next_bus(bus)) != NULL)  {
 		tmp_bus = pci_do_find_bus(bus, busnr);
 		if(tmp_bus)
 			return tmp_bus;
@@ -41,6 +41,26 @@
 }
 
 /**
+ * pci_find_next_bus - begin or continue searching for a PCI bus
+ * @from: Previous PCI bus found, or %NULL for new search.
+ *
+ * Iterates through the list of known PCI busses.  A new search is
+ * initiated by passing %NULL to the @from argument.  Otherwise if
+ * @from is not %NULL, searches continue from next device on the
+ * global list.
+ */
+struct pci_bus * 
+pci_find_next_bus(const struct pci_bus *from)
+{
+	struct list_head *n = from ? from->node.next : pci_root_buses.next;
+	struct pci_bus *b = NULL;
+
+	if (n != &pci_root_buses)
+		b = pci_bus_b(n);
+	return b;
+}
+
+/**
  * pci_find_slot - locate PCI device from a given PCI slot
  * @bus: number of PCI bus on which desired PCI device resides
  * @devfn: encodes number of PCI slot in which the desired PCI 
@@ -96,7 +116,6 @@
 	}
 	return NULL;
 }
-
 
 /**
  * pci_find_device - begin or continue searching for a PCI device by vendor/device id
diff -Nru a/include/linux/pci.h b/include/linux/pci.h
--- a/include/linux/pci.h	Tue Jun 10 11:15:57 2003
+++ b/include/linux/pci.h	Tue Jun 10 11:15:57 2003
@@ -568,6 +568,7 @@
 struct pci_dev *pci_find_class (unsigned int class, const struct pci_dev *from);
 struct pci_dev *pci_find_slot (unsigned int bus, unsigned int devfn);
 int pci_find_capability (struct pci_dev *dev, int cap);
+struct pci_bus * pci_find_next_bus(const struct pci_bus *from);
 
 int pci_bus_read_config_byte (struct pci_bus *bus, unsigned int devfn, int where, u8 *val);
 int pci_bus_read_config_word (struct pci_bus *bus, unsigned int devfn, int where, u16 *val);
