summaryrefslogtreecommitdiff
path: root/fs/xfs/libxfs/xfs_defer.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/libxfs/xfs_defer.c')
-rw-r--r--fs/xfs/libxfs/xfs_defer.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/fs/xfs/libxfs/xfs_defer.c b/fs/xfs/libxfs/xfs_defer.c
index 95f15a4b2126..54a6be06e6cd 100644
--- a/fs/xfs/libxfs/xfs_defer.c
+++ b/fs/xfs/libxfs/xfs_defer.c
@@ -459,6 +459,25 @@ xfs_defer_cancel_list(
xfs_defer_pending_cancel_work(mp, dfp);
}
+static inline void
+xfs_defer_relog_intent(
+ struct xfs_trans *tp,
+ struct xfs_defer_pending *dfp)
+{
+ struct xfs_log_item *lip;
+ const struct xfs_defer_op_type *ops = defer_op_types[dfp->dfp_type];
+
+ xfs_defer_create_done(tp, dfp);
+
+ lip = ops->relog_intent(tp, dfp->dfp_intent, dfp->dfp_done);
+ if (lip) {
+ xfs_trans_add_item(tp, lip);
+ set_bit(XFS_LI_DIRTY, &lip->li_flags);
+ }
+ dfp->dfp_done = NULL;
+ dfp->dfp_intent = lip;
+}
+
/*
* Prevent a log intent item from pinning the tail of the log by logging a
* done item to release the intent item; and then log a new intent item.
@@ -477,8 +496,6 @@ xfs_defer_relog(
ASSERT((*tpp)->t_flags & XFS_TRANS_PERM_LOG_RES);
list_for_each_entry(dfp, dfops, dfp_list) {
- struct xfs_log_item *lip;
-
/*
* If the log intent item for this deferred op is not a part of
* the current log checkpoint, relog the intent item to keep
@@ -506,15 +523,7 @@ xfs_defer_relog(
trace_xfs_defer_relog_intent((*tpp)->t_mountp, dfp);
XFS_STATS_INC((*tpp)->t_mountp, defer_relog);
- xfs_defer_create_done(*tpp, dfp);
- lip = xfs_trans_item_relog(dfp->dfp_intent, dfp->dfp_done,
- *tpp);
- if (lip) {
- xfs_trans_add_item(*tpp, lip);
- set_bit(XFS_LI_DIRTY, &lip->li_flags);
- }
- dfp->dfp_done = NULL;
- dfp->dfp_intent = lip;
+ xfs_defer_relog_intent(*tpp, dfp);
}
if ((*tpp)->t_flags & XFS_TRANS_DIRTY)