diff options
author | Darrick J. Wong <djwong@kernel.org> | 2021-09-01 11:16:02 -0700 |
---|---|---|
committer | Darrick J. Wong <djwong@kernel.org> | 2021-09-17 18:55:13 -0700 |
commit | 9c9d8ea9d87296181bec2237d17ad0231abfedc1 (patch) | |
tree | 0248b99c6c17478184a5898fdb39156ca9caf26a | |
parent | 059a12f82e4f6d3193edd3f40b0d022cfd53a8e4 (diff) |
xfs: widen btree maxlevels computation to handle 64-bit record countsbtree-cleanups_2021-09-17
Rework xfs_btree_compute_maxlevels to handle larger record counts, since
we're about to add support for very large indices for the realtime rmap
btree.
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
-rw-r--r-- | fs/xfs/libxfs/xfs_btree.c | 16 | ||||
-rw-r--r-- | fs/xfs/libxfs/xfs_btree.h | 3 |
2 files changed, 10 insertions, 9 deletions
diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index 80bcb80af652..92edad845a76 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -4764,19 +4764,19 @@ xfs_btree_sblock_verify( /* * Calculate the number of btree levels needed to store a given number of - * records in a short-format btree. + * records in btree blocks. This does not include the inode root level. */ -uint +unsigned int xfs_btree_compute_maxlevels( - uint *limits, - unsigned long len) + unsigned int *limits, + unsigned long long len) { - uint level; - unsigned long maxblocks; + unsigned int level; + unsigned long long maxblocks; - maxblocks = (len + limits[0] - 1) / limits[0]; + maxblocks = howmany_64(len, limits[0]); for (level = 1; maxblocks > 1; level++) - maxblocks = (maxblocks + limits[1] - 1) / limits[1]; + maxblocks = howmany_64(maxblocks, limits[1]); return level; } diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h index 361a8c830f38..025256720526 100644 --- a/fs/xfs/libxfs/xfs_btree.h +++ b/fs/xfs/libxfs/xfs_btree.h @@ -477,7 +477,8 @@ xfs_failaddr_t xfs_btree_lblock_v5hdr_verify(struct xfs_buf *bp, xfs_failaddr_t xfs_btree_lblock_verify(struct xfs_buf *bp, unsigned int max_recs); -uint xfs_btree_compute_maxlevels(uint *limits, unsigned long len); +unsigned int xfs_btree_compute_maxlevels(unsigned int *limits, + unsigned long long len); unsigned int xfs_btree_compute_maxlevels_size(unsigned long long max_btblocks, unsigned int leaf_mnr); unsigned long long xfs_btree_calc_size(uint *limits, unsigned long long len); |