diff options
author | Darrick J. Wong <djwong@kernel.org> | 2021-09-01 11:16:02 -0700 |
---|---|---|
committer | Darrick J. Wong <djwong@kernel.org> | 2021-10-22 16:40:56 -0700 |
commit | 3396bc20567d6592ae2cb684e3abd8b70667d851 (patch) | |
tree | 1b863da3572c26b6354c0a43edac6a66c8373ad6 | |
parent | a20e0fe4c6e5ea9cb8b3d92044b769bb3bdbfdec (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.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 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); |