Message ID | 159858220970.3058056.11436591208519179894.stgit@magnolia (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | xfs: add inode btree blocks counters to the AGI header | expand |
On Thu, Aug 27, 2020 at 07:36:49PM -0700, Darrick J. Wong wrote: > From: Darrick J. Wong <darrick.wong@oracle.com> > > 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@oracle.com> > --- Looks reasonable: Reviewed-by: Brian Foster <bfoster@redhat.com> > 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 */ > } >
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 */ }