@@ -356,11 +356,14 @@ xfs_defer_relog(
struct xfs_trans **tpp,
struct list_head *dfops)
{
+ struct xlog *log = (*tpp)->t_mountp->m_log;
struct xfs_defer_pending *dfp;
ASSERT((*tpp)->t_flags & XFS_TRANS_PERM_LOG_RES);
list_for_each_entry(dfp, dfops, dfp_list) {
+ xfs_lsn_t threshold_lsn;
+
/*
* If the log intent item for this deferred op is not a part of
* the current log checkpoint, relog the intent item to keep
@@ -372,6 +375,15 @@ xfs_defer_relog(
xfs_log_item_in_current_chkpt(dfp->dfp_intent))
continue;
+ /*
+ * Figure out where we need the tail to be in order to maintain
+ * the minimum required free space in the log.
+ */
+ threshold_lsn = xlog_grant_push_threshold(log, 0);
+ if (threshold_lsn == NULLCOMMITLSN ||
+ XFS_LSN_CMP(dfp->dfp_intent->li_lsn, threshold_lsn) >= 0)
+ continue;
+
trace_xfs_defer_relog_intent((*tpp)->t_mountp, dfp);
dfp->dfp_intent = xfs_trans_item_relog(dfp->dfp_intent, *tpp);
}