@@ -593,6 +593,8 @@ xfs_defer_capture(
/* Move the dfops chain and transaction state to the freezer. */
list_splice_init(&tp->t_dfops, &dfc->dfc_dfops);
dfc->dfc_tpflags = tp->t_flags & XFS_TRANS_LOWMODE;
+ dfc->dfc_blkres = tp->t_blk_res - tp->t_blk_res_used;
+ tp->t_blk_res = tp->t_blk_res_used;
xfs_defer_reset(tp);
/*
@@ -622,6 +624,8 @@ xfs_defer_continue(
list_splice_init(&dfc->dfc_dfops, &tp->t_dfops);
tp->t_flags |= dfc->dfc_tpflags;
dfc->dfc_tpflags = 0;
+ tp->t_blk_res += dfc->dfc_blkres;
+ dfc->dfc_blkres = 0;
}
/* Release all resources that we used to capture deferred ops. */
@@ -76,6 +76,7 @@ struct xfs_defer_capture {
/* Deferred ops state saved from the transaction. */
struct list_head dfc_dfops;
unsigned int dfc_tpflags;
+ unsigned int dfc_blkres;
};
/*
@@ -2501,26 +2501,10 @@ xlog_finish_defer_ops(
{
struct xfs_defer_capture *dfc, *next;
struct xfs_trans *tp;
- int64_t freeblks;
- uint64_t resblks;
int error = 0;
list_for_each_entry_safe(dfc, next, capture_list, dfc_list) {
- /*
- * We're finishing the defer_ops that accumulated as a result
- * of recovering unfinished intent items during log recovery.
- * We reserve an itruncate transaction because it is the
- * largest permanent transaction type. Since we're the only
- * user of the fs right now, take 93% (15/16) of the available
- * free blocks. Use weird math to avoid a 64-bit division.
- */
- freeblks = percpu_counter_sum(&mp->m_fdblocks);
- if (freeblks <= 0)
- return -ENOSPC;
-
- resblks = min_t(uint64_t, UINT_MAX, freeblks);
- resblks = (resblks * 15) >> 4;
- error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, resblks,
+ error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0,
0, XFS_TRANS_RESERVE, &tp);
if (error)
return error;