summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2021-09-01 11:16:02 -0700
committerDarrick J. Wong <djwong@kernel.org>2021-09-17 18:55:13 -0700
commit9c9d8ea9d87296181bec2237d17ad0231abfedc1 (patch)
tree0248b99c6c17478184a5898fdb39156ca9caf26a
parent059a12f82e4f6d3193edd3f40b0d022cfd53a8e4 (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.c16
-rw-r--r--fs/xfs/libxfs/xfs_btree.h3
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);