[PATCH 13/13] xfs_{db,repair}: use m_blockwsize instead of sb_blocksize for rt blocks

Darrick J. Wong
2024-03-26T03:02:49Z

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

In preparation to add block headers to rt bitmap and summary blocks,
convert all the relevant calculations in the userspace tools to use the
per-block word count instead of the raw blocksize. This is key to
adding this support outside of libxfs.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Bill O'Donnell <bodonnel@redhat.com>
---
db/check.c | 4 ++--
repair/phase6.c | 4 ++--
repair/rt.c | 9 +++++----
3 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/db/check.c b/db/check.c
index 103ea4022c3b..2f2fbc7cbd81 100644
--- a/db/check.c
+++ b/db/check.c
@@ -3630,7 +3630,7 @@ process_rtbitmap(
int t;
xfs_rtword_t *words;

- bitsperblock = mp->m_sb.sb_blocksize * NBBY;
+ bitsperblock = mp->m_blockwsize << XFS_NBWORDLOG;
words = malloc(mp->m_blockwsize << XFS_WORDLOG);
if (!words) {
dbprintf(_("could not allocate rtwords buffer\n"));
@@ -3749,7 +3749,7 @@ process_rtsummary(

args.sumbp = iocur_top->bp;
ondisk = xfs_rsumblock_infoptr(&args, 0);
- memcpy(sfile, ondisk, mp->m_sb.sb_blocksize);
+ memcpy(sfile, ondisk, mp->m_blockwsize << XFS_WORDLOG);
pop_cur();
sfile += mp->m_blockwsize;
}
diff --git a/repair/phase6.c b/repair/phase6.c
index 0818ee1a1501..fcb26d594b10 100644
--- a/repair/phase6.c
+++ b/repair/phase6.c
@@ -626,7 +626,7 @@ _("can't access block %" PRIu64 " (fsbno %" PRIu64 ") of realtime bitmap inode %

args.rbmbp = bp;
ondisk = xfs_rbmblock_wordptr(&args, 0);
- memcpy(ondisk, bmp, mp->m_sb.sb_blocksize);
+ memcpy(ondisk, bmp, mp->m_blockwsize << XFS_WORDLOG);

libxfs_trans_log_buf(tp, bp, 0, mp->m_sb.sb_blocksize - 1);

@@ -705,7 +705,7 @@ _("can't access block %" PRIu64 " (fsbno %" PRIu64 ") of realtime summary inode

args.sumbp = bp;
ondisk = xfs_rsumblock_infoptr(&args, 0);
- memcpy(ondisk, smp, mp->m_sb.sb_blocksize);
+ memcpy(ondisk, smp, mp->m_blockwsize << XFS_WORDLOG);

libxfs_trans_log_buf(tp, bp, 0, mp->m_sb.sb_blocksize - 1);

diff --git a/repair/rt.c b/repair/rt.c
index 9aff5a0d3d58..e49487829af2 100644
--- a/repair/rt.c
+++ b/repair/rt.c
@@ -25,8 +25,9 @@ rtinit(xfs_mount_t *mp)
return;

/*
- * realtime init -- blockmap initialization is
- * handled by incore_init()
+ * Allocate buffers for formatting the collected rt free space
+ * information. The rtbitmap buffer must be large enough to compare
+ * against any unused bytes in the last block of the file.
*/
wordcnt = libxfs_rtbitmap_wordcount(mp, mp->m_sb.sb_rextents);
btmcompute = calloc(wordcnt, sizeof(union xfs_rtword_raw));
@@ -87,7 +88,7 @@ generate_rtinfo(

ASSERT(mp->m_rbmip == NULL);

- bitsperblock = mp->m_sb.sb_blocksize * NBBY;
+ bitsperblock = mp->m_blockwsize << XFS_NBWORDLOG;
extno = start_ext = 0;
bmbno = in_extent = start_bmbno = 0;

@@ -199,7 +200,7 @@ check_rtfile_contents(
break;
}

- if (memcmp(bp->b_addr, buf, mp->m_sb.sb_blocksize))
+ if (memcmp(bp->b_addr, buf, mp->m_blockwsize << XFS_WORDLOG))
do_warn(_("discrepancy in %s at dblock 0x%llx\n"),
filename, (unsigned long long)bno);