On Thu, Aug 27, 2020 at 07:36:49PM -0700, Darrick J. Wong wrote: > From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > > Add the necessary bits to the online scrub code to check the inode btree > counters when enabled. > > Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > --- Looks reasonable: Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx> > fs/xfs/scrub/agheader.c | 30 ++++++++++++++++++++++++++++++ > 1 file changed, 30 insertions(+) > > > diff --git a/fs/xfs/scrub/agheader.c b/fs/xfs/scrub/agheader.c > index e9bcf1faa183..ae8e2e0ac64a 100644 > --- a/fs/xfs/scrub/agheader.c > +++ b/fs/xfs/scrub/agheader.c > @@ -781,6 +781,35 @@ xchk_agi_xref_icounts( > xchk_block_xref_set_corrupt(sc, sc->sa.agi_bp); > } > > +/* Check agi_[fi]blocks against tree size */ > +static inline void > +xchk_agi_xref_fiblocks( > + struct xfs_scrub *sc) > +{ > + struct xfs_agi *agi = sc->sa.agi_bp->b_addr; > + xfs_agblock_t blocks; > + int error = 0; > + > + if (!xfs_sb_version_hasinobtcounts(&sc->mp->m_sb)) > + return; > + > + if (sc->sa.ino_cur) { > + error = xfs_btree_count_blocks(sc->sa.ino_cur, &blocks); > + if (!xchk_should_check_xref(sc, &error, &sc->sa.ino_cur)) > + return; > + if (blocks != be32_to_cpu(agi->agi_iblocks)) > + xchk_block_xref_set_corrupt(sc, sc->sa.agi_bp); > + } > + > + if (sc->sa.fino_cur) { > + error = xfs_btree_count_blocks(sc->sa.fino_cur, &blocks); > + if (!xchk_should_check_xref(sc, &error, &sc->sa.fino_cur)) > + return; > + if (blocks != be32_to_cpu(agi->agi_fblocks)) > + xchk_block_xref_set_corrupt(sc, sc->sa.agi_bp); > + } > +} > + > /* Cross-reference with the other btrees. */ > STATIC void > xchk_agi_xref( > @@ -804,6 +833,7 @@ xchk_agi_xref( > xchk_agi_xref_icounts(sc); > xchk_xref_is_owned_by(sc, agbno, 1, &XFS_RMAP_OINFO_FS); > xchk_xref_is_not_shared(sc, agbno, 1); > + xchk_agi_xref_fiblocks(sc); > > /* scrub teardown will take care of sc->sa for us */ > } >