From: Darrick J. Wong <djwong@xxxxxxxxxx> There are a bunch of places in xfs_db and xfs_repair where we use open-coded logic to find a pointer to an xfs_rtword_t within a rt bitmap buffer. Convert all that to helper functions for better type safety. Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> Reviewed-by: Christoph Hellwig <hch@xxxxxx> Reviewed-by: Bill O'Donnell <bodonnel@xxxxxxxxxx> --- db/check.c | 12 +++++++++--- repair/phase6.c | 12 ++++++++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/db/check.c b/db/check.c index 6e06499b9..a8f6310fc 100644 --- a/db/check.c +++ b/db/check.c @@ -3608,8 +3608,11 @@ process_rtbitmap( bitsperblock = mp->m_sb.sb_blocksize * NBBY; bit = extno = prevbit = start_bmbno = start_bit = 0; bmbno = NULLFILEOFF; - while ((bmbno = blkmap_next_off(blkmap, bmbno, &t)) != - NULLFILEOFF) { + while ((bmbno = blkmap_next_off(blkmap, bmbno, &t)) != NULLFILEOFF) { + struct xfs_rtalloc_args args = { + .mp = mp, + }; + bno = blkmap_get(blkmap, bmbno); if (bno == NULLFSBLOCK) { if (!sflag) @@ -3622,7 +3625,7 @@ process_rtbitmap( push_cur(); set_cur(&typtab[TYP_RTBITMAP], XFS_FSB_TO_DADDR(mp, bno), blkbb, DB_RING_IGN, NULL); - if ((words = iocur_top->data) == NULL) { + if (!iocur_top->bp) { if (!sflag) dbprintf(_("can't read block %lld for rtbitmap " "inode\n"), @@ -3631,6 +3634,9 @@ process_rtbitmap( pop_cur(); continue; } + + args.rbmbp = iocur_top->bp; + words = (xfs_rtword_t *)xfs_rbmblock_wordptr(&args, 0); for (bit = 0; bit < bitsperblock && extno < mp->m_sb.sb_rextents; bit++, extno++) { diff --git a/repair/phase6.c b/repair/phase6.c index 3870c5c93..7b2044fd1 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -593,6 +593,12 @@ fill_rbmino(xfs_mount_t *mp) } while (bno < mp->m_sb.sb_rbmblocks) { + struct xfs_rtalloc_args args = { + .mp = mp, + .tp = tp, + }; + union xfs_rtword_raw *ondisk; + /* * fill the file one block at a time */ @@ -618,11 +624,13 @@ _("can't access block %" PRIu64 " (fsbno %" PRIu64 ") of realtime bitmap inode % return(1); } - memmove(bp->b_addr, bmp, mp->m_sb.sb_blocksize); + args.rbmbp = bp; + ondisk = xfs_rbmblock_wordptr(&args, 0); + memcpy(ondisk, bmp, mp->m_sb.sb_blocksize); libxfs_trans_log_buf(tp, bp, 0, mp->m_sb.sb_blocksize - 1); - bmp = (xfs_rtword_t *)((intptr_t) bmp + mp->m_sb.sb_blocksize); + bmp += mp->m_blockwsize; bno++; }