diff options
Diffstat (limited to 'include/linux/list.h')
-rw-r--r-- | include/linux/list.h | 79 |
1 files changed, 53 insertions, 26 deletions
diff --git a/include/linux/list.h b/include/linux/list.h index f4d8a2f12a33..ef9594171062 100644 --- a/include/linux/list.h +++ b/include/linux/list.h | |||
@@ -362,6 +362,17 @@ static inline void list_splice_tail_init(struct list_head *list, | |||
362 | list_entry((ptr)->next, type, member) | 362 | list_entry((ptr)->next, type, member) |
363 | 363 | ||
364 | /** | 364 | /** |
365 | * list_last_entry - get the last element from a list | ||
366 | * @ptr: the list head to take the element from. | ||
367 | * @type: the type of the struct this is embedded in. | ||
368 | * @member: the name of the list_struct within the struct. | ||
369 | * | ||
370 | * Note, that list is expected to be not empty. | ||
371 | */ | ||
372 | #define list_last_entry(ptr, type, member) \ | ||
373 | list_entry((ptr)->prev, type, member) | ||
374 | |||
375 | /** | ||
365 | * list_first_entry_or_null - get the first element from a list | 376 | * list_first_entry_or_null - get the first element from a list |
366 | * @ptr: the list head to take the element from. | 377 | * @ptr: the list head to take the element from. |
367 | * @type: the type of the struct this is embedded in. | 378 | * @type: the type of the struct this is embedded in. |
@@ -373,6 +384,22 @@ static inline void list_splice_tail_init(struct list_head *list, | |||
373 | (!list_empty(ptr) ? list_first_entry(ptr, type, member) : NULL) | 384 | (!list_empty(ptr) ? list_first_entry(ptr, type, member) : NULL) |
374 | 385 | ||
375 | /** | 386 | /** |
387 | * list_next_entry - get the next element in list | ||
388 | * @pos: the type * to cursor | ||
389 | * @member: the name of the list_struct within the struct. | ||
390 | */ | ||
391 | #define list_next_entry(pos, member) \ | ||
392 | list_entry((pos)->member.next, typeof(*(pos)), member) | ||
393 | |||
394 | /** | ||
395 | * list_prev_entry - get the prev element in list | ||
396 | * @pos: the type * to cursor | ||
397 | * @member: the name of the list_struct within the struct. | ||
398 | */ | ||
399 | #define list_prev_entry(pos, member) \ | ||
400 | list_entry((pos)->member.prev, typeof(*(pos)), member) | ||
401 | |||
402 | /** | ||
376 | * list_for_each - iterate over a list | 403 | * list_for_each - iterate over a list |
377 | * @pos: the &struct list_head to use as a loop cursor. | 404 | * @pos: the &struct list_head to use as a loop cursor. |
378 | * @head: the head for your list. | 405 | * @head: the head for your list. |
@@ -416,9 +443,9 @@ static inline void list_splice_tail_init(struct list_head *list, | |||
416 | * @member: the name of the list_struct within the struct. | 443 | * @member: the name of the list_struct within the struct. |
417 | */ | 444 | */ |
418 | #define list_for_each_entry(pos, head, member) \ | 445 | #define list_for_each_entry(pos, head, member) \ |
419 | for (pos = list_entry((head)->next, typeof(*pos), member); \ | 446 | for (pos = list_first_entry(head, typeof(*pos), member); \ |
420 | &pos->member != (head); \ | 447 | &pos->member != (head); \ |
421 | pos = list_entry(pos->member.next, typeof(*pos), member)) | 448 | pos = list_next_entry(pos, member)) |
422 | 449 | ||
423 | /** | 450 | /** |
424 | * list_for_each_entry_reverse - iterate backwards over list of given type. | 451 | * list_for_each_entry_reverse - iterate backwards over list of given type. |
@@ -427,9 +454,9 @@ static inline void list_splice_tail_init(struct list_head *list, | |||
427 | * @member: the name of the list_struct within the struct. | 454 | * @member: the name of the list_struct within the struct. |
428 | */ | 455 | */ |
429 | #define list_for_each_entry_reverse(pos, head, member) \ | 456 | #define list_for_each_entry_reverse(pos, head, member) \ |
430 | for (pos = list_entry((head)->prev, typeof(*pos), member); \ | 457 | for (pos = list_last_entry(head, typeof(*pos), member); \ |
431 | &pos->member != (head); \ | 458 | &pos->member != (head); \ |
432 | pos = list_entry(pos->member.prev, typeof(*pos), member)) | 459 | pos = list_prev_entry(pos, member)) |
433 | 460 | ||
434 | /** | 461 | /** |
435 | * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue() | 462 | * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue() |
@@ -452,9 +479,9 @@ static inline void list_splice_tail_init(struct list_head *list, | |||
452 | * the current position. | 479 | * the current position. |
453 | */ | 480 | */ |
454 | #define list_for_each_entry_continue(pos, head, member) \ | 481 | #define list_for_each_entry_continue(pos, head, member) \ |
455 | for (pos = list_entry(pos->member.next, typeof(*pos), member); \ | 482 | for (pos = list_next_entry(pos, member); \ |
456 | &pos->member != (head); \ | 483 | &pos->member != (head); \ |
457 | pos = list_entry(pos->member.next, typeof(*pos), member)) | 484 | pos = list_next_entry(pos, member)) |
458 | 485 | ||
459 | /** | 486 | /** |
460 | * list_for_each_entry_continue_reverse - iterate backwards from the given point | 487 | * list_for_each_entry_continue_reverse - iterate backwards from the given point |
@@ -466,9 +493,9 @@ static inline void list_splice_tail_init(struct list_head *list, | |||
466 | * the current position. | 493 | * the current position. |
467 | */ | 494 | */ |
468 | #define list_for_each_entry_continue_reverse(pos, head, member) \ | 495 | #define list_for_each_entry_continue_reverse(pos, head, member) \ |
469 | for (pos = list_entry(pos->member.prev, typeof(*pos), member); \ | 496 | for (pos = list_prev_entry(pos, member); \ |
470 | &pos->member != (head); \ | 497 | &pos->member != (head); \ |
471 | pos = list_entry(pos->member.prev, typeof(*pos), member)) | 498 | pos = list_prev_entry(pos, member)) |
472 | 499 | ||
473 | /** | 500 | /** |
474 | * list_for_each_entry_from - iterate over list of given type from the current point | 501 | * list_for_each_entry_from - iterate over list of given type from the current point |
@@ -479,8 +506,8 @@ static inline void list_splice_tail_init(struct list_head *list, | |||
479 | * Iterate over list of given type, continuing from current position. | 506 | * Iterate over list of given type, continuing from current position. |
480 | */ | 507 | */ |
481 | #define list_for_each_entry_from(pos, head, member) \ | 508 | #define list_for_each_entry_from(pos, head, member) \ |
482 | for (; &pos->member != (head); \ | 509 | for (; &pos->member != (head); \ |
483 | pos = list_entry(pos->member.next, typeof(*pos), member)) | 510 | pos = list_next_entry(pos, member)) |
484 | 511 | ||
485 | /** | 512 | /** |
486 | * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry | 513 | * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry |
@@ -490,10 +517,10 @@ static inline void list_splice_tail_init(struct list_head *list, | |||
490 | * @member: the name of the list_struct within the struct. | 517 | * @member: the name of the list_struct within the struct. |
491 | */ | 518 | */ |
492 | #define list_for_each_entry_safe(pos, n, head, member) \ | 519 | #define list_for_each_entry_safe(pos, n, head, member) \ |
493 | for (pos = list_entry((head)->next, typeof(*pos), member), \ | 520 | for (pos = list_first_entry(head, typeof(*pos), member), \ |
494 | n = list_entry(pos->member.next, typeof(*pos), member); \ | 521 | n = list_next_entry(pos, member); \ |
495 | &pos->member != (head); \ | 522 | &pos->member != (head); \ |
496 | pos = n, n = list_entry(n->member.next, typeof(*n), member)) | 523 | pos = n, n = list_next_entry(n, member)) |
497 | 524 | ||
498 | /** | 525 | /** |
499 | * list_for_each_entry_safe_continue - continue list iteration safe against removal | 526 | * list_for_each_entry_safe_continue - continue list iteration safe against removal |
@@ -506,10 +533,10 @@ static inline void list_splice_tail_init(struct list_head *list, | |||
506 | * safe against removal of list entry. | 533 | * safe against removal of list entry. |
507 | */ | 534 | */ |
508 | #define list_for_each_entry_safe_continue(pos, n, head, member) \ | 535 | #define list_for_each_entry_safe_continue(pos, n, head, member) \ |
509 | for (pos = list_entry(pos->member.next, typeof(*pos), member), \ | 536 | for (pos = list_next_entry(pos, member), \ |
510 | n = list_entry(pos->member.next, typeof(*pos), member); \ | 537 | n = list_next_entry(pos, member); \ |
511 | &pos->member != (head); \ | 538 | &pos->member != (head); \ |
512 | pos = n, n = list_entry(n->member.next, typeof(*n), member)) | 539 | pos = n, n = list_next_entry(n, member)) |
513 | 540 | ||
514 | /** | 541 | /** |
515 | * list_for_each_entry_safe_from - iterate over list from current point safe against removal | 542 | * list_for_each_entry_safe_from - iterate over list from current point safe against removal |
@@ -522,9 +549,9 @@ static inline void list_splice_tail_init(struct list_head *list, | |||
522 | * removal of list entry. | 549 | * removal of list entry. |
523 | */ | 550 | */ |
524 | #define list_for_each_entry_safe_from(pos, n, head, member) \ | 551 | #define list_for_each_entry_safe_from(pos, n, head, member) \ |
525 | for (n = list_entry(pos->member.next, typeof(*pos), member); \ | 552 | for (n = list_next_entry(pos, member); \ |
526 | &pos->member != (head); \ | 553 | &pos->member != (head); \ |
527 | pos = n, n = list_entry(n->member.next, typeof(*n), member)) | 554 | pos = n, n = list_next_entry(n, member)) |
528 | 555 | ||
529 | /** | 556 | /** |
530 | * list_for_each_entry_safe_reverse - iterate backwards over list safe against removal | 557 | * list_for_each_entry_safe_reverse - iterate backwards over list safe against removal |
@@ -537,10 +564,10 @@ static inline void list_splice_tail_init(struct list_head *list, | |||
537 | * of list entry. | 564 | * of list entry. |
538 | */ | 565 | */ |
539 | #define list_for_each_entry_safe_reverse(pos, n, head, member) \ | 566 | #define list_for_each_entry_safe_reverse(pos, n, head, member) \ |
540 | for (pos = list_entry((head)->prev, typeof(*pos), member), \ | 567 | for (pos = list_last_entry(head, typeof(*pos), member), \ |
541 | n = list_entry(pos->member.prev, typeof(*pos), member); \ | 568 | n = list_prev_entry(pos, member); \ |
542 | &pos->member != (head); \ | 569 | &pos->member != (head); \ |
543 | pos = n, n = list_entry(n->member.prev, typeof(*n), member)) | 570 | pos = n, n = list_prev_entry(n, member)) |
544 | 571 | ||
545 | /** | 572 | /** |
546 | * list_safe_reset_next - reset a stale list_for_each_entry_safe loop | 573 | * list_safe_reset_next - reset a stale list_for_each_entry_safe loop |
@@ -555,7 +582,7 @@ static inline void list_splice_tail_init(struct list_head *list, | |||
555 | * completing the current iteration of the loop body. | 582 | * completing the current iteration of the loop body. |
556 | */ | 583 | */ |
557 | #define list_safe_reset_next(pos, n, member) \ | 584 | #define list_safe_reset_next(pos, n, member) \ |
558 | n = list_entry(pos->member.next, typeof(*pos), member) | 585 | n = list_next_entry(pos, member) |
559 | 586 | ||
560 | /* | 587 | /* |
561 | * Double linked lists with a single pointer list head. | 588 | * Double linked lists with a single pointer list head. |