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