From: Darrick J. Wong <djwong@xxxxxxxxxx> Teach xfs_repair to check the ondisk realtime summary file against its own observations. Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> --- repair/phase5.c | 2 ++ repair/rt.c | 71 +++++-------------------------------------------------- repair/rt.h | 11 +-------- 3 files changed, 9 insertions(+), 75 deletions(-) diff --git a/repair/phase5.c b/repair/phase5.c index ae444efb..42b0f117 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -617,6 +617,7 @@ phase5(xfs_mount_t *mp) rtinit(mp); generate_rtinfo(mp, btmcompute, sumcompute); check_rtbitmap(mp); + check_rtsummary(mp); } return; @@ -686,6 +687,7 @@ phase5(xfs_mount_t *mp) rtinit(mp); generate_rtinfo(mp, btmcompute, sumcompute); check_rtbitmap(mp); + check_rtsummary(mp); } do_log(_(" - reset superblock...\n")); diff --git a/repair/rt.c b/repair/rt.c index b964d168..a4cca7aa 100644 --- a/repair/rt.c +++ b/repair/rt.c @@ -198,72 +198,13 @@ check_rtbitmap( mp->m_sb.sb_rbmblocks); } -#if 0 -/* - * returns 1 if bad, 0 if good - */ -int -check_summary(xfs_mount_t *mp) -{ - xfs_rfsblock_t bno; - xfs_suminfo_t *csp; - xfs_suminfo_t *fsp; - int log; - int error = 0; - - error = 0; - csp = sumcompute; - fsp = sumfile; - for (log = 0; log < mp->m_rsumlevels; log++) { - for (bno = 0; - bno < mp->m_sb.sb_rbmblocks; - bno++, csp++, fsp++) { - if (*csp != *fsp) { - do_warn( - _("rt summary mismatch, size %d block %llu, file: %d, computed: %d\n"), - log, bno, *fsp, *csp); - error = 1; - } - } - } - - return(error); -} - -/* - * copy the real-time summary file data into memory - */ void -process_rtsummary( - xfs_mount_t *mp, - struct xfs_dinode *dino, - blkmap_t *blkmap) +check_rtsummary( + struct xfs_mount *mp) { - xfs_fsblock_t bno; - struct xfs_buf *bp; - char *bytes; - int sumbno; + if (need_rsumino) + return; - for (sumbno = 0; sumbno < blkmap->count; sumbno++) { - bno = blkmap_get(blkmap, sumbno); - if (bno == NULLFSBLOCK) { - do_warn(_("block %d for rtsummary inode is missing\n"), - sumbno); - error++; - continue; - } - error = -libxfs_buf_read(mp->m_dev, XFS_FSB_TO_DADDR(mp, bno), - XFS_FSB_TO_BB(mp, 1), 0, NULL, &bp); - if (error) { - do_warn(_("can't read block %d for rtsummary inode\n"), - sumbno); - error++; - continue; - } - bytes = bp->b_un.b_addr; - memmove((char *)sumfile + sumbno * mp->m_sb.sb_blocksize, bytes, - mp->m_sb.sb_blocksize); - libxfs_buf_relse(bp); - } + check_rtfile_contents(mp, "rtsummary", mp->m_sb.sb_rsumino, sumcompute, + XFS_B_TO_FSB(mp, mp->m_rsumsize)); } -#endif diff --git a/repair/rt.h b/repair/rt.h index 2023153f..be24e91c 100644 --- a/repair/rt.h +++ b/repair/rt.h @@ -17,15 +17,6 @@ generate_rtinfo(xfs_mount_t *mp, xfs_suminfo_t *sumcompute); void check_rtbitmap(struct xfs_mount *mp); - -#if 0 - -int -check_summary(xfs_mount_t *mp); - -void -process_rtsummary(xfs_mount_t *mp, - struct blkmap *blkmap); -#endif +void check_rtsummary(struct xfs_mount *mp); #endif /* _XFS_REPAIR_RT_H_ */