diff mbox series

[13/15] xfs: widen btree maxlevels computation to handle 64-bit record counts

Message ID 163408162537.4151249.5138465633448556647.stgit@magnolia (mailing list archive)
State New, archived
Headers show
Series xfs: support dynamic btree cursor height | expand

Commit Message

Darrick J. Wong Oct. 12, 2021, 11:33 p.m. UTC
From: Darrick J. Wong <djwong@kernel.org>

Rework xfs_btree_compute_maxlevels to handle larger record counts, since
we're about to add support for very large data forks.  Eventually the
realtime reverse mapping btree will need this too.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
 fs/xfs/libxfs/xfs_btree.c |   16 ++++++++--------
 fs/xfs/libxfs/xfs_btree.h |    3 ++-
 2 files changed, 10 insertions(+), 9 deletions(-)

Comments

Dave Chinner Oct. 13, 2021, 7:28 a.m. UTC | #1
On Tue, Oct 12, 2021 at 04:33:45PM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <djwong@kernel.org>
> 
> Rework xfs_btree_compute_maxlevels to handle larger record counts, since
> we're about to add support for very large data forks.  Eventually the
> realtime reverse mapping btree will need this too.
> 
> Signed-off-by: Darrick J. Wong <djwong@kernel.org>
> ---
>  fs/xfs/libxfs/xfs_btree.c |   16 ++++++++--------
>  fs/xfs/libxfs/xfs_btree.h |    3 ++-
>  2 files changed, 10 insertions(+), 9 deletions(-)

Looks good. howmany_64() uses do_div() properly so there shouldn't
be any issues with this on 32 bit platforms.

Reviewed-by: Dave Chinner <dchinner@redhat.com>
diff mbox series

Patch

diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c
index 201b81d54622..b95c817ad90d 100644
--- a/fs/xfs/libxfs/xfs_btree.c
+++ b/fs/xfs/libxfs/xfs_btree.c
@@ -4515,19 +4515,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 d5f03550cec9..20a2828c11ef 100644
--- a/fs/xfs/libxfs/xfs_btree.h
+++ b/fs/xfs/libxfs/xfs_btree.h
@@ -480,7 +480,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);