[PATCH 077/145] xfs: account for the refcount btree in the alloc/free log reservation
Darrick J. Wong
darrick.wong at oracle.com
Thu Jun 16 20:38:53 CDT 2016
Every time we allocate or free an extent, we might need to split the
refcount btree. Reserve some blocks in the transaction to handle
this possibility.
(Reproduced by generic/167 over NFS atop XFS)
Signed-off-by: Christoph Hellwig <hch at lst.de>
[darrick.wong at oracle.com: add commit message]
Signed-off-by: Darrick J. Wong <darrick.wong at oracle.com>
---
libxfs/xfs_trans_resv.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/libxfs/xfs_trans_resv.c b/libxfs/xfs_trans_resv.c
index 10234bb..5b6bbcd 100644
--- a/libxfs/xfs_trans_resv.c
+++ b/libxfs/xfs_trans_resv.c
@@ -66,7 +66,8 @@ xfs_calc_buf_res(
* Per-extent log reservation for the btree changes involved in freeing or
* allocating an extent. In classic XFS there were two trees that will be
* modified (bnobt + cntbt). With rmap enabled, there are three trees
- * (rmapbt). The number of blocks reserved is based on the formula:
+ * (rmapbt). With reflink, there are four trees (refcountbt). The number of
+ * blocks reserved is based on the formula:
*
* num trees * ((2 blocks/level * max depth) - 1)
*
@@ -82,6 +83,8 @@ xfs_allocfree_log_count(
blocks = num_ops * 2 * (2 * mp->m_ag_maxlevels - 1);
if (xfs_sb_version_hasrmapbt(&mp->m_sb))
blocks += num_ops * (2 * mp->m_rmap_maxlevels - 1);
+ if (xfs_sb_version_hasreflink(&mp->m_sb))
+ blocks += num_ops * (2 * mp->m_refc_maxlevels - 1);
return blocks;
}
More information about the xfs
mailing list