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-10-22 16:40:56 -0700
commit3396bc20567d6592ae2cb684e3abd8b70667d851 (patch)
tree1b863da3572c26b6354c0a43edac6a66c8373ad6
parenta20e0fe4c6e5ea9cb8b3d92044b769bb3bdbfdec (diff)
xfs: widen btree maxlevels computation to handle 64-bit record countsbtree-cleanups_2021-10-22
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. We also need this to compute the theoretical maximum number of inodes that can be stored in a 1TB AG with 256 byte inodes. 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 77cd6d1ced53..b610f2f97687 100644
--- a/fs/xfs/libxfs/xfs_btree.c
+++ b/fs/xfs/libxfs/xfs_btree.c
@@ -4753,19 +4753,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 88035c92ce45..e1cc9d700212 100644
--- a/fs/xfs/libxfs/xfs_btree.h
+++ b/fs/xfs/libxfs/xfs_btree.h
@@ -484,7 +484,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);