Driver Core: add ability for class_find_device to start in middle of list

This mirrors the functionality that driver_find_device has as well.

We add a start variable, and all callers of the function are fixed up at
the same time.

The block layer will be using this new functionality in a follow-on
patch.


Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Greg Kroah-Hartman
2008-05-22 17:21:08 -04:00
parent 93562b5376
commit 695794ae0c
8 changed files with 28 additions and 19 deletions

View File

@ -302,6 +302,7 @@ EXPORT_SYMBOL_GPL(class_for_each_device);
/**
* class_find_device - device iterator for locating a particular device
* @class: the class we're iterating
* @start: Device to begin with
* @data: data for the match function
* @match: function to check device
*
@ -319,8 +320,9 @@ EXPORT_SYMBOL_GPL(class_for_each_device);
* re-acquired in @match, otherwise it will self-deadlocking. For
* example, calls to add or remove class members would be verboten.
*/
struct device *class_find_device(struct class *class, void *data,
int (*match)(struct device *, void *))
struct device *class_find_device(struct class *class, struct device *start,
void *data,
int (*match)(struct device *, void *))
{
struct device *dev;
int found = 0;
@ -330,15 +332,17 @@ struct device *class_find_device(struct class *class, void *data,
down(&class->sem);
list_for_each_entry(dev, &class->devices, node) {
if (start) {
if (start == dev)
start = NULL;
continue;
}
dev = get_device(dev);
if (dev) {
if (match(dev, data)) {
found = 1;
break;
} else
put_device(dev);
} else
if (match(dev, data)) {
found = 1;
break;
} else
put_device(dev);
}
up(&class->sem);