Create a helper to generate AG btree height calculator functions. This will be used (much) later when we get to the refcount btree. v2: Use a helper function instead of a macro. v3: We can (theoretically) store more than 2^32 records in a btree, so widen the fields to accept that. v4: Don't modify xfs_bmap_worst_indlen; the purpose of /that/ function is to estimate the worst-case number of blocks needed for a bmbt expansion, not to calculate the space required to store nr records. Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --- libxfs/xfs_btree.c | 27 +++++++++++++++++++++++++++ libxfs/xfs_btree.h | 3 +++ 2 files changed, 30 insertions(+) diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 1448fd6..27e58b2 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -4152,3 +4152,30 @@ xfs_btree_sblock_verify( return true; } + +/* + * Calculate the number of blocks needed to store a given number of records + * in a short-format (per-AG metadata) btree. + */ +xfs_extlen_t +xfs_btree_calc_size( + struct xfs_mount *mp, + uint *limits, + unsigned long long len) +{ + int level; + int maxrecs; + xfs_extlen_t rval; + + maxrecs = limits[0]; + for (level = 0, rval = 0; len > 0; level++) { + len += maxrecs - 1; + do_div(len, maxrecs); + rval += len; + if (len == 1) + return rval; + if (level == 0) + maxrecs = limits[1]; + } + return rval; +} diff --git a/libxfs/xfs_btree.h b/libxfs/xfs_btree.h index 9a88839..b330f19 100644 --- a/libxfs/xfs_btree.h +++ b/libxfs/xfs_btree.h @@ -475,4 +475,7 @@ static inline int xfs_btree_get_level(struct xfs_btree_block *block) bool xfs_btree_sblock_v5hdr_verify(struct xfs_buf *bp); bool xfs_btree_sblock_verify(struct xfs_buf *bp, unsigned int max_recs); +xfs_extlen_t xfs_btree_calc_size(struct xfs_mount *mp, uint *limits, + unsigned long long len); + #endif /* __XFS_BTREE_H__ */ _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs