mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-12 13:55:25 -04:00
xfs: compute rtrmap btree max levels when reflink enabled
Compute the maximum possible height of the realtime rmap btree when reflink is enabled. Signed-off-by: "Darrick J. Wong" <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
@@ -718,6 +718,7 @@ xfs_rtrmapbt_maxrecs(
|
||||
unsigned int
|
||||
xfs_rtrmapbt_maxlevels_ondisk(void)
|
||||
{
|
||||
unsigned long long max_dblocks;
|
||||
unsigned int minrecs[2];
|
||||
unsigned int blocklen;
|
||||
|
||||
@@ -726,8 +727,20 @@ xfs_rtrmapbt_maxlevels_ondisk(void)
|
||||
minrecs[0] = xfs_rtrmapbt_block_maxrecs(blocklen, true) / 2;
|
||||
minrecs[1] = xfs_rtrmapbt_block_maxrecs(blocklen, false) / 2;
|
||||
|
||||
/* We need at most one record for every block in an rt group. */
|
||||
return xfs_btree_compute_maxlevels(minrecs, XFS_MAX_RGBLOCKS);
|
||||
/*
|
||||
* Compute the asymptotic maxlevels for an rtrmapbt on any rtreflink fs.
|
||||
*
|
||||
* On a reflink filesystem, each block in an rtgroup can have up to
|
||||
* 2^32 (per the refcount record format) owners, which means that
|
||||
* theoretically we could face up to 2^64 rmap records. However, we're
|
||||
* likely to run out of blocks in the data device long before that
|
||||
* happens, which means that we must compute the max height based on
|
||||
* what the btree will look like if it consumes almost all the blocks
|
||||
* in the data device due to maximal sharing factor.
|
||||
*/
|
||||
max_dblocks = -1U; /* max ag count */
|
||||
max_dblocks *= XFS_MAX_CRC_AG_BLOCKS;
|
||||
return xfs_btree_space_to_height(minrecs, max_dblocks);
|
||||
}
|
||||
|
||||
int __init
|
||||
@@ -766,9 +779,20 @@ xfs_rtrmapbt_compute_maxlevels(
|
||||
* maximum height is constrained by the size of the data device and
|
||||
* the height required to store one rmap record for each block in an
|
||||
* rt group.
|
||||
*
|
||||
* On a reflink filesystem, each rt block can have up to 2^32 (per the
|
||||
* refcount record format) owners, which means that theoretically we
|
||||
* could face up to 2^64 rmap records. This makes the computation of
|
||||
* maxlevels based on record count meaningless, so we only consider the
|
||||
* size of the data device.
|
||||
*/
|
||||
d_maxlevels = xfs_btree_space_to_height(mp->m_rtrmap_mnr,
|
||||
mp->m_sb.sb_dblocks);
|
||||
if (xfs_has_rtreflink(mp)) {
|
||||
mp->m_rtrmap_maxlevels = d_maxlevels + 1;
|
||||
return;
|
||||
}
|
||||
|
||||
r_maxlevels = xfs_btree_compute_maxlevels(mp->m_rtrmap_mnr,
|
||||
mp->m_groups[XG_TYPE_RTG].blocks);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user