Re: [PATCH] Yet more PCI fixes for 2.5.70

Greg KH
2003-06-10T19:45:38Z

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);