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. |
