[PATCH 11/13] xfs_{db,repair}: use helpers for rtsummary block/wordcount computations

Darrick J. Wong
2024-03-13T01:52:32Z

From: Darrick J. Wong <djwong@kernel.org>

Port xfs_db and xfs_repair to use the new helper functions that compute
the number of blocks or words necessary to store the rt summary file.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
db/check.c | 8 ++++++--
libxfs/init.c | 8 ++++----
libxfs/libxfs_api_defs.h | 2 ++
repair/rt.c | 5 ++++-
4 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/db/check.c b/db/check.c
index 3b3f90e5e0c9..6e916f335b14 100644
--- a/db/check.c
+++ b/db/check.c
@@ -1944,10 +1944,14 @@ init(
inodata[c] = xcalloc(inodata_hash_size, sizeof(**inodata));
}
if (rt) {
+ unsigned long long words;
+
dbmap[c] = xcalloc(mp->m_sb.sb_rblocks, sizeof(**dbmap));
inomap[c] = xcalloc(mp->m_sb.sb_rblocks, sizeof(**inomap));
- sumfile = xcalloc(mp->m_rsumsize, 1);
- sumcompute = xcalloc(mp->m_rsumsize, 1);
+ words = libxfs_rtsummary_wordcount(mp, mp->m_rsumlevels,
+ mp->m_sb.sb_rbmblocks);
+ sumfile = xcalloc(words, sizeof(xfs_suminfo_t));
+ sumcompute = xcalloc(words, sizeof(xfs_suminfo_t));
}
nflag = sflag = tflag = verbose = optind = 0;
while ((c = getopt(argc, argv, "b:i:npstv")) != EOF) {
diff --git a/libxfs/init.c b/libxfs/init.c
index 63c506a69964..c903d60707b7 100644
--- a/libxfs/init.c
+++ b/libxfs/init.c
@@ -284,6 +284,7 @@ rtmount_init(
{
struct xfs_buf *bp; /* buffer for last block of subvolume */
xfs_daddr_t d; /* address of last block of subvolume */
+ unsigned int rsumblocks;
int error;

if (mp->m_sb.sb_rblocks == 0)
@@ -309,10 +310,9 @@ rtmount_init(
return -1;
}
mp->m_rsumlevels = mp->m_sb.sb_rextslog + 1;
- mp->m_rsumsize =
- (uint)sizeof(xfs_suminfo_t) * mp->m_rsumlevels *
- mp->m_sb.sb_rbmblocks;
- mp->m_rsumsize = roundup(mp->m_rsumsize, mp->m_sb.sb_blocksize);
+ rsumblocks = xfs_rtsummary_blockcount(mp, mp->m_rsumlevels,
+ mp->m_sb.sb_rbmblocks);
+ mp->m_rsumsize = XFS_FSB_TO_B(mp, rsumblocks);
mp->m_rbmip = mp->m_rsumip = NULL;

/*
diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h
index feecc05c4ecc..e87195cb1ac9 100644
--- a/libxfs/libxfs_api_defs.h
+++ b/libxfs/libxfs_api_defs.h
@@ -179,6 +179,8 @@
#define xfs_rtbitmap_setword libxfs_rtbitmap_setword
#define xfs_rtbitmap_wordcount libxfs_rtbitmap_wordcount

+#define xfs_rtsummary_wordcount libxfs_rtsummary_wordcount
+
#define xfs_rtfree_extent libxfs_rtfree_extent
#define xfs_rtfree_blocks libxfs_rtfree_blocks
#define xfs_sb_from_disk libxfs_sb_from_disk
diff --git a/repair/rt.c b/repair/rt.c
index 213f0812250e..6ab709a000cb 100644
--- a/repair/rt.c
+++ b/repair/rt.c
@@ -34,7 +34,10 @@ rtinit(xfs_mount_t *mp)
do_error(
_("couldn't allocate memory for incore realtime bitmap.\n"));

- if ((sumcompute = calloc(mp->m_rsumsize, 1)) == NULL)
+ wordcnt = libxfs_rtsummary_wordcount(mp, mp->m_rsumlevels,
+ mp->m_sb.sb_rbmblocks);
+ sumcompute = calloc(wordcnt, sizeof(xfs_suminfo_t));
+ if (!sumcompute)
do_error(
_("couldn't allocate memory for incore realtime summary info.\n"));
}