From: Darrick J. Wong Date: Wed, 13 Jul 2022 22:20:56 +0000 (-0500) Subject: xfs_repair: check free rt extent count X-Git-Tag: v5.19.0-rc1~13 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f2e388616d7491254e410571d7e54e5e94bf07f0;p=thirdparty%2Fxfsprogs-dev.git xfs_repair: check free rt extent count Check the superblock's free rt extent count against what we observed. This increases the runtime and memory usage, but we can now report undercounting frextents as a result of a logging bug in the kernel. Note that repair has always fixed the undercount, but it no longer does that silently. Signed-off-by: Darrick J. Wong Reviewed-by: Chandan Babu R Reviewed-by: Christoph Hellwig Signed-off-by: Eric Sandeen --- diff --git a/repair/phase5.c b/repair/phase5.c index 74b1dcb93..273f51a8c 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -602,6 +602,14 @@ inject_lost_extent( return -libxfs_trans_commit(tp); } +void +check_rtmetadata( + struct xfs_mount *mp) +{ + rtinit(mp); + generate_rtinfo(mp, btmcompute, sumcompute); +} + void phase5(xfs_mount_t *mp) { @@ -671,8 +679,7 @@ phase5(xfs_mount_t *mp) if (mp->m_sb.sb_rblocks) { do_log( _(" - generate realtime summary info and bitmap...\n")); - rtinit(mp); - generate_rtinfo(mp, btmcompute, sumcompute); + check_rtmetadata(mp); } do_log(_(" - reset superblock...\n")); diff --git a/repair/protos.h b/repair/protos.h index 83734e850..03ebae141 100644 --- a/repair/protos.h +++ b/repair/protos.h @@ -36,6 +36,7 @@ void phase1(struct xfs_mount *); void phase2(struct xfs_mount *, int); void phase3(struct xfs_mount *, int); void phase4(struct xfs_mount *); +void check_rtmetadata(struct xfs_mount *mp); void phase5(struct xfs_mount *); void phase6(struct xfs_mount *); void phase7(struct xfs_mount *, int); diff --git a/repair/rt.c b/repair/rt.c index d663a01d5..3a065f4b9 100644 --- a/repair/rt.c +++ b/repair/rt.c @@ -111,6 +111,11 @@ generate_rtinfo(xfs_mount_t *mp, sumcompute[offs]++; } + if (mp->m_sb.sb_frextents != sb_frextents) { + do_warn(_("sb_frextents %" PRIu64 ", counted %" PRIu64 "\n"), + mp->m_sb.sb_frextents, sb_frextents); + } + return(0); } diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index de8617bae..d08b0cecb 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -1174,9 +1174,12 @@ main(int argc, char **argv) phase4(mp); phase_end(4); - if (no_modify) + if (no_modify) { printf(_("No modify flag set, skipping phase 5\n")); - else { + + if (mp->m_sb.sb_rblocks > 0) + check_rtmetadata(mp); + } else { phase5(mp); } phase_end(5);