Commit 7cd9c9bb57476167e83b7780dbc06d1dd601789d
1 parent
591bfc6bf9
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
Revert "driver core: check start node in klist_iter_init_node"
This reverts commit a15d49fd3094cff90e5410ca454a870e0a722fe1 as that patch broke the build. Cc: Hannes Reinecke <hare@suse.de> Reported-by: Stephen Rothwell <sfr@canb.auug.org.au> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Showing 6 changed files with 46 additions and 76 deletions Side-by-side Diff
drivers/base/bus.c
... | ... | @@ -296,13 +296,11 @@ |
296 | 296 | if (!bus) |
297 | 297 | return -EINVAL; |
298 | 298 | |
299 | - error = klist_iter_init_node(&bus->p->klist_devices, &i, | |
300 | - (start ? &start->p->knode_bus : NULL)); | |
301 | - if (!error) { | |
302 | - while ((dev = next_device(&i)) && !error) | |
303 | - error = fn(dev, data); | |
304 | - klist_iter_exit(&i); | |
305 | - } | |
299 | + klist_iter_init_node(&bus->p->klist_devices, &i, | |
300 | + (start ? &start->p->knode_bus : NULL)); | |
301 | + while ((dev = next_device(&i)) && !error) | |
302 | + error = fn(dev, data); | |
303 | + klist_iter_exit(&i); | |
306 | 304 | return error; |
307 | 305 | } |
308 | 306 | EXPORT_SYMBOL_GPL(bus_for_each_dev); |
... | ... | @@ -332,10 +330,8 @@ |
332 | 330 | if (!bus) |
333 | 331 | return NULL; |
334 | 332 | |
335 | - if (klist_iter_init_node(&bus->p->klist_devices, &i, | |
336 | - (start ? &start->p->knode_bus : NULL)) < 0) | |
337 | - return NULL; | |
338 | - | |
333 | + klist_iter_init_node(&bus->p->klist_devices, &i, | |
334 | + (start ? &start->p->knode_bus : NULL)); | |
339 | 335 | while ((dev = next_device(&i))) |
340 | 336 | if (match(dev, data) && get_device(dev)) |
341 | 337 | break; |
... | ... | @@ -388,9 +384,7 @@ |
388 | 384 | return NULL; |
389 | 385 | |
390 | 386 | if (hint) { |
391 | - if (klist_iter_init_node(&subsys->p->klist_devices, &i, | |
392 | - &hint->p->knode_bus) < 0) | |
393 | - return NULL; | |
387 | + klist_iter_init_node(&subsys->p->klist_devices, &i, &hint->p->knode_bus); | |
394 | 388 | dev = next_device(&i); |
395 | 389 | if (dev && dev->id == id && get_device(dev)) { |
396 | 390 | klist_iter_exit(&i); |
... | ... | @@ -452,13 +446,11 @@ |
452 | 446 | if (!bus) |
453 | 447 | return -EINVAL; |
454 | 448 | |
455 | - error = klist_iter_init_node(&bus->p->klist_drivers, &i, | |
456 | - start ? &start->p->knode_bus : NULL); | |
457 | - if (!error) { | |
458 | - while ((drv = next_driver(&i)) && !error) | |
459 | - error = fn(drv, data); | |
460 | - klist_iter_exit(&i); | |
461 | - } | |
449 | + klist_iter_init_node(&bus->p->klist_drivers, &i, | |
450 | + start ? &start->p->knode_bus : NULL); | |
451 | + while ((drv = next_driver(&i)) && !error) | |
452 | + error = fn(drv, data); | |
453 | + klist_iter_exit(&i); | |
462 | 454 | return error; |
463 | 455 | } |
464 | 456 | EXPORT_SYMBOL_GPL(bus_for_each_drv); |
465 | 457 | |
466 | 458 | |
... | ... | @@ -1119,19 +1111,15 @@ |
1119 | 1111 | * otherwise if it is NULL, the iteration starts at the beginning of |
1120 | 1112 | * the list. |
1121 | 1113 | */ |
1122 | -int subsys_dev_iter_init(struct subsys_dev_iter *iter, struct bus_type *subsys, | |
1123 | - struct device *start, const struct device_type *type) | |
1114 | +void subsys_dev_iter_init(struct subsys_dev_iter *iter, struct bus_type *subsys, | |
1115 | + struct device *start, const struct device_type *type) | |
1124 | 1116 | { |
1125 | 1117 | struct klist_node *start_knode = NULL; |
1126 | - int error; | |
1127 | 1118 | |
1128 | 1119 | if (start) |
1129 | 1120 | start_knode = &start->p->knode_bus; |
1130 | - error = klist_iter_init_node(&subsys->p->klist_devices, &iter->ki, | |
1131 | - start_knode); | |
1132 | - if (!error) | |
1133 | - iter->type = type; | |
1134 | - return error; | |
1121 | + klist_iter_init_node(&subsys->p->klist_devices, &iter->ki, start_knode); | |
1122 | + iter->type = type; | |
1135 | 1123 | } |
1136 | 1124 | EXPORT_SYMBOL_GPL(subsys_dev_iter_init); |
1137 | 1125 |
drivers/base/class.c
... | ... | @@ -301,20 +301,15 @@ |
301 | 301 | * otherwise if it is NULL, the iteration starts at the beginning of |
302 | 302 | * the list. |
303 | 303 | */ |
304 | -int class_dev_iter_init(struct class_dev_iter *iter, struct class *class, | |
305 | - struct device *start, const struct device_type *type) | |
304 | +void class_dev_iter_init(struct class_dev_iter *iter, struct class *class, | |
305 | + struct device *start, const struct device_type *type) | |
306 | 306 | { |
307 | 307 | struct klist_node *start_knode = NULL; |
308 | - int error; | |
309 | 308 | |
310 | 309 | if (start) |
311 | 310 | start_knode = &start->knode_class; |
312 | - error = klist_iter_init_node(&class->p->klist_devices, &iter->ki, | |
313 | - start_knode); | |
314 | - if (!error) | |
315 | - iter->type = type; | |
316 | - | |
317 | - return error; | |
311 | + klist_iter_init_node(&class->p->klist_devices, &iter->ki, start_knode); | |
312 | + iter->type = type; | |
318 | 313 | } |
319 | 314 | EXPORT_SYMBOL_GPL(class_dev_iter_init); |
320 | 315 | |
321 | 316 | |
... | ... | @@ -392,15 +387,14 @@ |
392 | 387 | return -EINVAL; |
393 | 388 | } |
394 | 389 | |
395 | - error = class_dev_iter_init(&iter, class, start, NULL); | |
396 | - if (!error) { | |
397 | - while ((dev = class_dev_iter_next(&iter))) { | |
398 | - error = fn(dev, data); | |
399 | - if (error) | |
400 | - break; | |
401 | - } | |
402 | - class_dev_iter_exit(&iter); | |
390 | + class_dev_iter_init(&iter, class, start, NULL); | |
391 | + while ((dev = class_dev_iter_next(&iter))) { | |
392 | + error = fn(dev, data); | |
393 | + if (error) | |
394 | + break; | |
403 | 395 | } |
396 | + class_dev_iter_exit(&iter); | |
397 | + | |
404 | 398 | return error; |
405 | 399 | } |
406 | 400 | EXPORT_SYMBOL_GPL(class_for_each_device); |
... | ... | @@ -440,9 +434,7 @@ |
440 | 434 | return NULL; |
441 | 435 | } |
442 | 436 | |
443 | - if (class_dev_iter_init(&iter, class, start, NULL) < 0) | |
444 | - return NULL; | |
445 | - | |
437 | + class_dev_iter_init(&iter, class, start, NULL); | |
446 | 438 | while ((dev = class_dev_iter_next(&iter))) { |
447 | 439 | if (match(dev, data)) { |
448 | 440 | get_device(dev); |
drivers/base/driver.c
... | ... | @@ -49,13 +49,11 @@ |
49 | 49 | if (!drv) |
50 | 50 | return -EINVAL; |
51 | 51 | |
52 | - error = klist_iter_init_node(&drv->p->klist_devices, &i, | |
53 | - start ? &start->p->knode_driver : NULL); | |
54 | - if (!error) { | |
55 | - while ((dev = next_device(&i)) && !error) | |
56 | - error = fn(dev, data); | |
57 | - klist_iter_exit(&i); | |
58 | - } | |
52 | + klist_iter_init_node(&drv->p->klist_devices, &i, | |
53 | + start ? &start->p->knode_driver : NULL); | |
54 | + while ((dev = next_device(&i)) && !error) | |
55 | + error = fn(dev, data); | |
56 | + klist_iter_exit(&i); | |
59 | 57 | return error; |
60 | 58 | } |
61 | 59 | EXPORT_SYMBOL_GPL(driver_for_each_device); |
... | ... | @@ -85,10 +83,8 @@ |
85 | 83 | if (!drv) |
86 | 84 | return NULL; |
87 | 85 | |
88 | - if (klist_iter_init_node(&drv->p->klist_devices, &i, | |
89 | - (start ? &start->p->knode_driver : NULL)) < 0) | |
90 | - return NULL; | |
91 | - | |
86 | + klist_iter_init_node(&drv->p->klist_devices, &i, | |
87 | + (start ? &start->p->knode_driver : NULL)); | |
92 | 88 | while ((dev = next_device(&i))) |
93 | 89 | if (match(dev, data) && get_device(dev)) |
94 | 90 | break; |
include/linux/device.h
... | ... | @@ -128,7 +128,7 @@ |
128 | 128 | struct klist_iter ki; |
129 | 129 | const struct device_type *type; |
130 | 130 | }; |
131 | -int subsys_dev_iter_init(struct subsys_dev_iter *iter, | |
131 | +void subsys_dev_iter_init(struct subsys_dev_iter *iter, | |
132 | 132 | struct bus_type *subsys, |
133 | 133 | struct device *start, |
134 | 134 | const struct device_type *type); |
... | ... | @@ -380,10 +380,10 @@ |
380 | 380 | void class_compat_remove_link(struct class_compat *cls, struct device *dev, |
381 | 381 | struct device *device_link); |
382 | 382 | |
383 | -extern int class_dev_iter_init(struct class_dev_iter *iter, | |
384 | - struct class *class, | |
385 | - struct device *start, | |
386 | - const struct device_type *type); | |
383 | +extern void class_dev_iter_init(struct class_dev_iter *iter, | |
384 | + struct class *class, | |
385 | + struct device *start, | |
386 | + const struct device_type *type); | |
387 | 387 | extern struct device *class_dev_iter_next(struct class_dev_iter *iter); |
388 | 388 | extern void class_dev_iter_exit(struct class_dev_iter *iter); |
389 | 389 |
include/linux/klist.h
... | ... | @@ -60,7 +60,7 @@ |
60 | 60 | |
61 | 61 | |
62 | 62 | extern void klist_iter_init(struct klist *k, struct klist_iter *i); |
63 | -extern int klist_iter_init_node(struct klist *k, struct klist_iter *i, | |
63 | +extern void klist_iter_init_node(struct klist *k, struct klist_iter *i, | |
64 | 64 | struct klist_node *n); |
65 | 65 | extern void klist_iter_exit(struct klist_iter *i); |
66 | 66 | extern struct klist_node *klist_next(struct klist_iter *i); |
lib/klist.c
... | ... | @@ -278,19 +278,13 @@ |
278 | 278 | * Similar to klist_iter_init(), but starts the action off with @n, |
279 | 279 | * instead of with the list head. |
280 | 280 | */ |
281 | -int klist_iter_init_node(struct klist *k, struct klist_iter *i, | |
282 | - struct klist_node *n) | |
281 | +void klist_iter_init_node(struct klist *k, struct klist_iter *i, | |
282 | + struct klist_node *n) | |
283 | 283 | { |
284 | - if (n) { | |
285 | - kref_get(&n->n_ref); | |
286 | - if (!n->n_klist) { | |
287 | - kref_put(&n->n_ref); | |
288 | - return -ENODEV; | |
289 | - } | |
290 | - } | |
291 | 284 | i->i_klist = k; |
292 | 285 | i->i_cur = n; |
293 | - return 0; | |
286 | + if (n) | |
287 | + kref_get(&n->n_ref); | |
294 | 288 | } |
295 | 289 | EXPORT_SYMBOL_GPL(klist_iter_init_node); |
296 | 290 |