diff options
| -rw-r--r-- | fs/xfs/xfs_trans_ail.c | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 7ed7425478de..4d6330eddc8d 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c | |||
| @@ -34,9 +34,9 @@ STATIC xfs_log_item_t * xfs_ail_min(xfs_ail_entry_t *); | |||
| 34 | STATIC xfs_log_item_t * xfs_ail_next(xfs_ail_entry_t *, xfs_log_item_t *); | 34 | STATIC xfs_log_item_t * xfs_ail_next(xfs_ail_entry_t *, xfs_log_item_t *); |
| 35 | 35 | ||
| 36 | #ifdef DEBUG | 36 | #ifdef DEBUG |
| 37 | STATIC void xfs_ail_check(xfs_ail_entry_t *); | 37 | STATIC void xfs_ail_check(xfs_ail_entry_t *, xfs_log_item_t *); |
| 38 | #else | 38 | #else |
| 39 | #define xfs_ail_check(a) | 39 | #define xfs_ail_check(a,l) |
| 40 | #endif /* DEBUG */ | 40 | #endif /* DEBUG */ |
| 41 | 41 | ||
| 42 | 42 | ||
| @@ -563,7 +563,7 @@ xfs_ail_insert( | |||
| 563 | next_lip->li_ail.ail_forw = lip; | 563 | next_lip->li_ail.ail_forw = lip; |
| 564 | lip->li_ail.ail_forw->li_ail.ail_back = lip; | 564 | lip->li_ail.ail_forw->li_ail.ail_back = lip; |
| 565 | 565 | ||
| 566 | xfs_ail_check(base); | 566 | xfs_ail_check(base, lip); |
| 567 | return; | 567 | return; |
| 568 | } | 568 | } |
| 569 | 569 | ||
| @@ -577,12 +577,12 @@ xfs_ail_delete( | |||
| 577 | xfs_log_item_t *lip) | 577 | xfs_log_item_t *lip) |
| 578 | /* ARGSUSED */ | 578 | /* ARGSUSED */ |
| 579 | { | 579 | { |
| 580 | xfs_ail_check(base, lip); | ||
| 580 | lip->li_ail.ail_forw->li_ail.ail_back = lip->li_ail.ail_back; | 581 | lip->li_ail.ail_forw->li_ail.ail_back = lip->li_ail.ail_back; |
| 581 | lip->li_ail.ail_back->li_ail.ail_forw = lip->li_ail.ail_forw; | 582 | lip->li_ail.ail_back->li_ail.ail_forw = lip->li_ail.ail_forw; |
| 582 | lip->li_ail.ail_forw = NULL; | 583 | lip->li_ail.ail_forw = NULL; |
| 583 | lip->li_ail.ail_back = NULL; | 584 | lip->li_ail.ail_back = NULL; |
| 584 | 585 | ||
| 585 | xfs_ail_check(base); | ||
| 586 | return lip; | 586 | return lip; |
| 587 | } | 587 | } |
| 588 | 588 | ||
| @@ -626,13 +626,13 @@ xfs_ail_next( | |||
| 626 | */ | 626 | */ |
| 627 | STATIC void | 627 | STATIC void |
| 628 | xfs_ail_check( | 628 | xfs_ail_check( |
| 629 | xfs_ail_entry_t *base) | 629 | xfs_ail_entry_t *base, |
| 630 | xfs_log_item_t *lip) | ||
| 630 | { | 631 | { |
| 631 | xfs_log_item_t *lip; | ||
| 632 | xfs_log_item_t *prev_lip; | 632 | xfs_log_item_t *prev_lip; |
| 633 | 633 | ||
| 634 | lip = base->ail_forw; | 634 | prev_lip = base->ail_forw; |
| 635 | if (lip == (xfs_log_item_t*)base) { | 635 | if (prev_lip == (xfs_log_item_t*)base) { |
| 636 | /* | 636 | /* |
| 637 | * Make sure the pointers are correct when the list | 637 | * Make sure the pointers are correct when the list |
| 638 | * is empty. | 638 | * is empty. |
| @@ -642,9 +642,27 @@ xfs_ail_check( | |||
| 642 | } | 642 | } |
| 643 | 643 | ||
| 644 | /* | 644 | /* |
| 645 | * Check the next and previous entries are valid. | ||
| 646 | */ | ||
| 647 | ASSERT((lip->li_flags & XFS_LI_IN_AIL) != 0); | ||
| 648 | prev_lip = lip->li_ail.ail_back; | ||
| 649 | if (prev_lip != (xfs_log_item_t*)base) { | ||
| 650 | ASSERT(prev_lip->li_ail.ail_forw == lip); | ||
| 651 | ASSERT(XFS_LSN_CMP(prev_lip->li_lsn, lip->li_lsn) <= 0); | ||
| 652 | } | ||
| 653 | prev_lip = lip->li_ail.ail_forw; | ||
| 654 | if (prev_lip != (xfs_log_item_t*)base) { | ||
| 655 | ASSERT(prev_lip->li_ail.ail_back == lip); | ||
| 656 | ASSERT(XFS_LSN_CMP(prev_lip->li_lsn, lip->li_lsn) >= 0); | ||
| 657 | } | ||
| 658 | |||
| 659 | |||
| 660 | #ifdef XFS_TRANS_DEBUG | ||
| 661 | /* | ||
| 645 | * Walk the list checking forward and backward pointers, | 662 | * Walk the list checking forward and backward pointers, |
| 646 | * lsn ordering, and that every entry has the XFS_LI_IN_AIL | 663 | * lsn ordering, and that every entry has the XFS_LI_IN_AIL |
| 647 | * flag set. | 664 | * flag set. This is really expensive, so only do it when |
| 665 | * specifically debugging the transaction subsystem. | ||
| 648 | */ | 666 | */ |
| 649 | prev_lip = (xfs_log_item_t*)base; | 667 | prev_lip = (xfs_log_item_t*)base; |
| 650 | while (lip != (xfs_log_item_t*)base) { | 668 | while (lip != (xfs_log_item_t*)base) { |
| @@ -659,5 +677,6 @@ xfs_ail_check( | |||
| 659 | } | 677 | } |
| 660 | ASSERT(lip == (xfs_log_item_t*)base); | 678 | ASSERT(lip == (xfs_log_item_t*)base); |
| 661 | ASSERT(base->ail_back == prev_lip); | 679 | ASSERT(base->ail_back == prev_lip); |
| 680 | #endif /* XFS_TRANS_DEBUG */ | ||
| 662 | } | 681 | } |
| 663 | #endif /* DEBUG */ | 682 | #endif /* DEBUG */ |
