long t_frextents_delta;/* superblock freextents chg*/
struct list_head t_items; /* log item descriptors */
struct list_head t_dfops; /* deferred operations */
+
+ unsigned int t_dfops_nr;
+ unsigned int t_dfops_nr_max;
+ unsigned int t_dfops_finished;
} xfs_trans_t;
void xfs_trans_init(struct xfs_mount *);
/* Done with the dfp, free it. */
list_del(&dfp->dfp_list);
kmem_cache_free(xfs_defer_pending_cache, dfp);
+ tp->t_dfops_nr--;
+ tp->t_dfops_finished++;
out:
if (ops->finish_cleanup)
ops->finish_cleanup(tp, state, error);
list_splice_init(&(*tp)->t_dfops, &dop_pending);
+ (*tp)->t_dfops_nr_max = max((*tp)->t_dfops_nr,
+ (*tp)->t_dfops_nr_max);
+
if (has_intents < 0) {
error = has_intents;
goto out_shutdown;
xfs_force_shutdown((*tp)->t_mountp, SHUTDOWN_CORRUPT_INCORE);
trace_xfs_defer_finish_error(*tp, error);
xfs_defer_cancel_list((*tp)->t_mountp, &dop_pending);
+ (*tp)->t_dfops_nr = 0;
xfs_defer_cancel(*tp);
return error;
}
trace_xfs_defer_cancel(tp, _RET_IP_);
xfs_defer_trans_abort(tp, &tp->t_dfops);
xfs_defer_cancel_list(mp, &tp->t_dfops);
+ tp->t_dfops_nr = 0;
}
/*
}
dfp = xfs_defer_find_last(tp, ops);
- if (!dfp || !xfs_defer_can_append(dfp, ops))
+ if (!dfp || !xfs_defer_can_append(dfp, ops)) {
dfp = xfs_defer_alloc(&tp->t_dfops, ops);
+ tp->t_dfops_nr++;
+ }
xfs_defer_add_item(dfp, li);
trace_xfs_defer_add_item(tp->t_mountp, dfp, li);
return;
xfs_defer_alloc(&tp->t_dfops, &xfs_barrier_defer_type);
+ tp->t_dfops_nr++;
trace_xfs_defer_add_item(tp->t_mountp, dfp, NULL);
}
struct xfs_trans *stp)
{
list_splice_init(&stp->t_dfops, &dtp->t_dfops);
+ dtp->t_dfops_nr += stp->t_dfops_nr;
+ dtp->t_dfops_nr_max = stp->t_dfops_nr_max;
+ dtp->t_dfops_finished = stp->t_dfops_finished;
+ stp->t_dfops_nr = 0;
+ stp->t_dfops_nr_max = 0;
+ stp->t_dfops_finished = 0;
/*
* Low free space mode was historically controlled by a dfops field.