@@ -158,7 +158,6 @@ libxfs_trans_read_buf(
}
#define xfs_log_item_in_current_chkpt(lip) (false)
-#define xfs_trans_item_relog(lip, dip, tp) (NULL)
/* Contorted mess to make gcc shut up about unused vars. */
#define xlog_grant_push_threshold(log, need) \
@@ -453,6 +453,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.
@@ -471,8 +490,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
@@ -500,15 +517,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)
@@ -59,6 +59,9 @@ struct xfs_defer_op_type {
void (*cancel_item)(struct list_head *item);
int (*recover_work)(struct xfs_defer_pending *dfp,
struct list_head *capture_list);
+ struct xfs_log_item *(*relog_intent)(struct xfs_trans *tp,
+ struct xfs_log_item *intent,
+ struct xfs_log_item *done_item);
unsigned int max_items;
};