summaryrefslogtreecommitdiff
path: root/fs/xfs/libxfs/xfs_btree.c
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 /fs/xfs/libxfs/xfs_btree.c
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>
Diffstat (limited to 'fs/xfs/libxfs/xfs_btree.c')
-rw-r--r--fs/xfs/libxfs/xfs_btree.c16
1 files changed, 8 insertions, 8 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;
}