diff options
author | Dave Chinner <dchinner@redhat.com> | 2010-12-19 20:34:26 -0500 |
---|---|---|
committer | Dave Chinner <david@fromorbit.com> | 2010-12-19 20:34:26 -0500 |
commit | e60599492990d1b52c70e9ed2f8e062fe11ca937 (patch) | |
tree | cff4380f728123db94f432e46cc4b1028ba61073 /fs/xfs | |
parent | 3013683253ad04f67d8cfaa25be708353686b90a (diff) |
xfs: use AIL bulk update function to implement single updates
We now have two copies of AIL insert operations that are mostly
duplicate functionality. The single log item updates can be
implemented via the bulk updates by turning xfs_trans_ail_update()
into a simple wrapper. This removes all the duplicate insert
functionality and associated helpers.
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'fs/xfs')
-rw-r--r-- | fs/xfs/xfs_log_recover.c | 2 | ||||
-rw-r--r-- | fs/xfs/xfs_trans_ail.c | 88 | ||||
-rw-r--r-- | fs/xfs/xfs_trans_priv.h | 19 |
3 files changed, 13 insertions, 96 deletions
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index d7219e29d9a..4abe7a9b380 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c | |||
@@ -2573,7 +2573,7 @@ xlog_recover_efi_pass2( | |||
2573 | /* | 2573 | /* |
2574 | * xfs_trans_ail_update() drops the AIL lock. | 2574 | * xfs_trans_ail_update() drops the AIL lock. |
2575 | */ | 2575 | */ |
2576 | xfs_trans_ail_update(log->l_ailp, (xfs_log_item_t *)efip, lsn); | 2576 | xfs_trans_ail_update(log->l_ailp, &efip->efi_item, lsn); |
2577 | return 0; | 2577 | return 0; |
2578 | } | 2578 | } |
2579 | 2579 | ||
diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 218f96861c8..8481a5a6d6c 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c | |||
@@ -28,7 +28,6 @@ | |||
28 | #include "xfs_trans_priv.h" | 28 | #include "xfs_trans_priv.h" |
29 | #include "xfs_error.h" | 29 | #include "xfs_error.h" |
30 | 30 | ||
31 | STATIC void xfs_ail_insert(struct xfs_ail *, xfs_log_item_t *); | ||
32 | STATIC void xfs_ail_splice(struct xfs_ail *, struct list_head *, xfs_lsn_t); | 31 | STATIC void xfs_ail_splice(struct xfs_ail *, struct list_head *, xfs_lsn_t); |
33 | STATIC void xfs_ail_delete(struct xfs_ail *, xfs_log_item_t *); | 32 | STATIC void xfs_ail_delete(struct xfs_ail *, xfs_log_item_t *); |
34 | STATIC xfs_log_item_t * xfs_ail_min(struct xfs_ail *); | 33 | STATIC xfs_log_item_t * xfs_ail_min(struct xfs_ail *); |
@@ -450,58 +449,6 @@ xfs_trans_unlocked_item( | |||
450 | xfs_log_move_tail(ailp->xa_mount, 1); | 449 | xfs_log_move_tail(ailp->xa_mount, 1); |
451 | } /* xfs_trans_unlocked_item */ | 450 | } /* xfs_trans_unlocked_item */ |
452 | 451 | ||
453 | |||
454 | /* | ||
455 | * Update the position of the item in the AIL with the new | ||
456 | * lsn. If it is not yet in the AIL, add it. Otherwise, move | ||
457 | * it to its new position by removing it and re-adding it. | ||
458 | * | ||
459 | * Wakeup anyone with an lsn less than the item's lsn. If the item | ||
460 | * we move in the AIL is the minimum one, update the tail lsn in the | ||
461 | * log manager. | ||
462 | * | ||
463 | * This function must be called with the AIL lock held. The lock | ||
464 | * is dropped before returning. | ||
465 | */ | ||
466 | void | ||
467 | xfs_trans_ail_update( | ||
468 | struct xfs_ail *ailp, | ||
469 | xfs_log_item_t *lip, | ||
470 | xfs_lsn_t lsn) __releases(ailp->xa_lock) | ||
471 | { | ||
472 | xfs_log_item_t *mlip; /* ptr to minimum lip */ | ||
473 | xfs_lsn_t tail_lsn; | ||
474 | |||
475 | mlip = xfs_ail_min(ailp); | ||
476 | |||
477 | if (lip->li_flags & XFS_LI_IN_AIL) { | ||
478 | xfs_ail_delete(ailp, lip); | ||
479 | } else { | ||
480 | lip->li_flags |= XFS_LI_IN_AIL; | ||
481 | } | ||
482 | |||
483 | lip->li_lsn = lsn; | ||
484 | xfs_ail_insert(ailp, lip); | ||
485 | |||
486 | if (mlip == lip) { | ||
487 | mlip = xfs_ail_min(ailp); | ||
488 | /* | ||
489 | * It is not safe to access mlip after the AIL lock is | ||
490 | * dropped, so we must get a copy of li_lsn before we do | ||
491 | * so. This is especially important on 32-bit platforms | ||
492 | * where accessing and updating 64-bit values like li_lsn | ||
493 | * is not atomic. | ||
494 | */ | ||
495 | tail_lsn = mlip->li_lsn; | ||
496 | spin_unlock(&ailp->xa_lock); | ||
497 | xfs_log_move_tail(ailp->xa_mount, tail_lsn); | ||
498 | } else { | ||
499 | spin_unlock(&ailp->xa_lock); | ||
500 | } | ||
501 | |||
502 | |||
503 | } /* xfs_trans_update_ail */ | ||
504 | |||
505 | /* | 452 | /* |
506 | * xfs_trans_ail_update - bulk AIL insertion operation. | 453 | * xfs_trans_ail_update - bulk AIL insertion operation. |
507 | * | 454 | * |
@@ -764,41 +711,6 @@ xfs_trans_ail_destroy( | |||
764 | } | 711 | } |
765 | 712 | ||
766 | /* | 713 | /* |
767 | * Insert the given log item into the AIL. | ||
768 | * We almost always insert at the end of the list, so on inserts | ||
769 | * we search from the end of the list to find where the | ||
770 | * new item belongs. | ||
771 | */ | ||
772 | STATIC void | ||
773 | xfs_ail_insert( | ||
774 | struct xfs_ail *ailp, | ||
775 | xfs_log_item_t *lip) | ||
776 | { | ||
777 | xfs_log_item_t *next_lip; | ||
778 | |||
779 | /* | ||
780 | * If the list is empty, just insert the item. | ||
781 | */ | ||
782 | if (list_empty(&ailp->xa_ail)) { | ||
783 | list_add(&lip->li_ail, &ailp->xa_ail); | ||
784 | return; | ||
785 | } | ||
786 | |||
787 | list_for_each_entry_reverse(next_lip, &ailp->xa_ail, li_ail) { | ||
788 | if (XFS_LSN_CMP(next_lip->li_lsn, lip->li_lsn) <= 0) | ||
789 | break; | ||
790 | } | ||
791 | |||
792 | ASSERT(&next_lip->li_ail == &ailp->xa_ail || | ||
793 | XFS_LSN_CMP(next_lip->li_lsn, lip->li_lsn) <= 0); | ||
794 | |||
795 | list_add(&lip->li_ail, &next_lip->li_ail); | ||
796 | |||
797 | xfs_ail_check(ailp, lip); | ||
798 | return; | ||
799 | } | ||
800 | |||
801 | /* | ||
802 | * splice the log item list into the AIL at the given LSN. | 714 | * splice the log item list into the AIL at the given LSN. |
803 | */ | 715 | */ |
804 | STATIC void | 716 | STATIC void |
diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index 246ca4dcb5c..f46920589ca 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h | |||
@@ -75,13 +75,18 @@ struct xfs_ail { | |||
75 | /* | 75 | /* |
76 | * From xfs_trans_ail.c | 76 | * From xfs_trans_ail.c |
77 | */ | 77 | */ |
78 | void xfs_trans_ail_update(struct xfs_ail *ailp, | 78 | void xfs_trans_ail_update_bulk(struct xfs_ail *ailp, |
79 | struct xfs_log_item *lip, xfs_lsn_t lsn) | 79 | struct xfs_log_item **log_items, int nr_items, |
80 | __releases(ailp->xa_lock); | 80 | xfs_lsn_t lsn) __releases(ailp->xa_lock); |
81 | void xfs_trans_ail_update_bulk(struct xfs_ail *ailp, | 81 | static inline void |
82 | struct xfs_log_item **log_items, | 82 | xfs_trans_ail_update( |
83 | int nr_items, xfs_lsn_t lsn) | 83 | struct xfs_ail *ailp, |
84 | __releases(ailp->xa_lock); | 84 | struct xfs_log_item *lip, |
85 | xfs_lsn_t lsn) __releases(ailp->xa_lock) | ||
86 | { | ||
87 | xfs_trans_ail_update_bulk(ailp, &lip, 1, lsn); | ||
88 | } | ||
89 | |||
85 | void xfs_trans_ail_delete(struct xfs_ail *ailp, | 90 | void xfs_trans_ail_delete(struct xfs_ail *ailp, |
86 | struct xfs_log_item *lip) | 91 | struct xfs_log_item *lip) |
87 | __releases(ailp->xa_lock); | 92 | __releases(ailp->xa_lock); |