diff options
| author | Greg Kroah-Hartman <gregkh@suse.de> | 2008-05-22 17:21:08 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2008-07-22 00:54:47 -0400 |
| commit | 695794ae0c5bdd9bd06e35b118801e2e9be04f9e (patch) | |
| tree | 71011d17230e67798c6e474ffac10cb93d72919e /drivers/base | |
| parent | 93562b537659fc0f63920fd4d9d24f54e434f4c4 (diff) | |
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>
Diffstat (limited to 'drivers/base')
| -rw-r--r-- | drivers/base/class.c | 22 | ||||
| -rw-r--r-- | drivers/base/core.c | 2 |
2 files changed, 14 insertions, 10 deletions
diff --git a/drivers/base/class.c b/drivers/base/class.c index 2eb7048003a8..3918d0e432d4 100644 --- a/drivers/base/class.c +++ b/drivers/base/class.c | |||
| @@ -302,6 +302,7 @@ EXPORT_SYMBOL_GPL(class_for_each_device); | |||
| 302 | /** | 302 | /** |
| 303 | * class_find_device - device iterator for locating a particular device | 303 | * class_find_device - device iterator for locating a particular device |
| 304 | * @class: the class we're iterating | 304 | * @class: the class we're iterating |
| 305 | * @start: Device to begin with | ||
| 305 | * @data: data for the match function | 306 | * @data: data for the match function |
| 306 | * @match: function to check device | 307 | * @match: function to check device |
| 307 | * | 308 | * |
| @@ -319,8 +320,9 @@ EXPORT_SYMBOL_GPL(class_for_each_device); | |||
| 319 | * re-acquired in @match, otherwise it will self-deadlocking. For | 320 | * re-acquired in @match, otherwise it will self-deadlocking. For |
| 320 | * example, calls to add or remove class members would be verboten. | 321 | * example, calls to add or remove class members would be verboten. |
| 321 | */ | 322 | */ |
| 322 | struct device *class_find_device(struct class *class, void *data, | 323 | struct device *class_find_device(struct class *class, struct device *start, |
| 323 | int (*match)(struct device *, void *)) | 324 | void *data, |
| 325 | int (*match)(struct device *, void *)) | ||
| 324 | { | 326 | { |
| 325 | struct device *dev; | 327 | struct device *dev; |
| 326 | int found = 0; | 328 | int found = 0; |
| @@ -330,15 +332,17 @@ struct device *class_find_device(struct class *class, void *data, | |||
| 330 | 332 | ||
| 331 | down(&class->sem); | 333 | down(&class->sem); |
| 332 | list_for_each_entry(dev, &class->devices, node) { | 334 | list_for_each_entry(dev, &class->devices, node) { |
| 335 | if (start) { | ||
| 336 | if (start == dev) | ||
| 337 | start = NULL; | ||
| 338 | continue; | ||
| 339 | } | ||
| 333 | dev = get_device(dev); | 340 | dev = get_device(dev); |
| 334 | if (dev) { | 341 | if (match(dev, data)) { |
| 335 | if (match(dev, data)) { | 342 | found = 1; |
| 336 | found = 1; | ||
| 337 | break; | ||
| 338 | } else | ||
| 339 | put_device(dev); | ||
| 340 | } else | ||
| 341 | break; | 343 | break; |
| 344 | } else | ||
| 345 | put_device(dev); | ||
| 342 | } | 346 | } |
| 343 | up(&class->sem); | 347 | up(&class->sem); |
| 344 | 348 | ||
diff --git a/drivers/base/core.c b/drivers/base/core.c index 9ae28aa709d5..9f05de6f80b5 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
| @@ -1289,7 +1289,7 @@ void device_destroy(struct class *class, dev_t devt) | |||
| 1289 | { | 1289 | { |
| 1290 | struct device *dev; | 1290 | struct device *dev; |
| 1291 | 1291 | ||
| 1292 | dev = class_find_device(class, &devt, __match_devt); | 1292 | dev = class_find_device(class, NULL, &devt, __match_devt); |
| 1293 | if (dev) { | 1293 | if (dev) { |
| 1294 | put_device(dev); | 1294 | put_device(dev); |
| 1295 | device_unregister(dev); | 1295 | device_unregister(dev); |
