Message ID | 163192857728.416199.11679791890386351921.stgit@magnolia (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | xfs: support dynamic btree cursor height | expand |
On 18 Sep 2021 at 06:59, Darrick J. Wong wrote: > From: Darrick J. Wong <djwong@kernel.org> > > When we're scanning for btree roots to rebuild the AG headers, make sure > that the proposed tree does not exceed the maximum height for that btree > type (and not just XFS_BTREE_MAXLEVELS). > Looks good. Reviewed-by: Chandan Babu R <chandan.babu@oracle.com> > Signed-off-by: Darrick J. Wong <djwong@kernel.org> > --- > fs/xfs/scrub/agheader_repair.c | 8 +++++++- > fs/xfs/scrub/repair.h | 3 +++ > 2 files changed, 10 insertions(+), 1 deletion(-) > > > diff --git a/fs/xfs/scrub/agheader_repair.c b/fs/xfs/scrub/agheader_repair.c > index 0f8deee66f15..05c27149b65d 100644 > --- a/fs/xfs/scrub/agheader_repair.c > +++ b/fs/xfs/scrub/agheader_repair.c > @@ -122,7 +122,7 @@ xrep_check_btree_root( > xfs_agnumber_t agno = sc->sm->sm_agno; > > return xfs_verify_agbno(mp, agno, fab->root) && > - fab->height <= XFS_BTREE_MAXLEVELS; > + fab->height <= fab->maxlevels; > } > > /* > @@ -339,18 +339,22 @@ xrep_agf( > [XREP_AGF_BNOBT] = { > .rmap_owner = XFS_RMAP_OWN_AG, > .buf_ops = &xfs_bnobt_buf_ops, > + .maxlevels = sc->mp->m_ag_maxlevels, > }, > [XREP_AGF_CNTBT] = { > .rmap_owner = XFS_RMAP_OWN_AG, > .buf_ops = &xfs_cntbt_buf_ops, > + .maxlevels = sc->mp->m_ag_maxlevels, > }, > [XREP_AGF_RMAPBT] = { > .rmap_owner = XFS_RMAP_OWN_AG, > .buf_ops = &xfs_rmapbt_buf_ops, > + .maxlevels = sc->mp->m_rmap_maxlevels, > }, > [XREP_AGF_REFCOUNTBT] = { > .rmap_owner = XFS_RMAP_OWN_REFC, > .buf_ops = &xfs_refcountbt_buf_ops, > + .maxlevels = sc->mp->m_refc_maxlevels, > }, > [XREP_AGF_END] = { > .buf_ops = NULL, > @@ -881,10 +885,12 @@ xrep_agi( > [XREP_AGI_INOBT] = { > .rmap_owner = XFS_RMAP_OWN_INOBT, > .buf_ops = &xfs_inobt_buf_ops, > + .maxlevels = M_IGEO(sc->mp)->inobt_maxlevels, > }, > [XREP_AGI_FINOBT] = { > .rmap_owner = XFS_RMAP_OWN_INOBT, > .buf_ops = &xfs_finobt_buf_ops, > + .maxlevels = M_IGEO(sc->mp)->inobt_maxlevels, > }, > [XREP_AGI_END] = { > .buf_ops = NULL > diff --git a/fs/xfs/scrub/repair.h b/fs/xfs/scrub/repair.h > index 3bb152d52a07..840f74ec431c 100644 > --- a/fs/xfs/scrub/repair.h > +++ b/fs/xfs/scrub/repair.h > @@ -44,6 +44,9 @@ struct xrep_find_ag_btree { > /* in: buffer ops */ > const struct xfs_buf_ops *buf_ops; > > + /* in: maximum btree height */ > + unsigned int maxlevels; > + > /* out: the highest btree block found and the tree height */ > xfs_agblock_t root; > unsigned int height;
diff --git a/fs/xfs/scrub/agheader_repair.c b/fs/xfs/scrub/agheader_repair.c index 0f8deee66f15..05c27149b65d 100644 --- a/fs/xfs/scrub/agheader_repair.c +++ b/fs/xfs/scrub/agheader_repair.c @@ -122,7 +122,7 @@ xrep_check_btree_root( xfs_agnumber_t agno = sc->sm->sm_agno; return xfs_verify_agbno(mp, agno, fab->root) && - fab->height <= XFS_BTREE_MAXLEVELS; + fab->height <= fab->maxlevels; } /* @@ -339,18 +339,22 @@ xrep_agf( [XREP_AGF_BNOBT] = { .rmap_owner = XFS_RMAP_OWN_AG, .buf_ops = &xfs_bnobt_buf_ops, + .maxlevels = sc->mp->m_ag_maxlevels, }, [XREP_AGF_CNTBT] = { .rmap_owner = XFS_RMAP_OWN_AG, .buf_ops = &xfs_cntbt_buf_ops, + .maxlevels = sc->mp->m_ag_maxlevels, }, [XREP_AGF_RMAPBT] = { .rmap_owner = XFS_RMAP_OWN_AG, .buf_ops = &xfs_rmapbt_buf_ops, + .maxlevels = sc->mp->m_rmap_maxlevels, }, [XREP_AGF_REFCOUNTBT] = { .rmap_owner = XFS_RMAP_OWN_REFC, .buf_ops = &xfs_refcountbt_buf_ops, + .maxlevels = sc->mp->m_refc_maxlevels, }, [XREP_AGF_END] = { .buf_ops = NULL, @@ -881,10 +885,12 @@ xrep_agi( [XREP_AGI_INOBT] = { .rmap_owner = XFS_RMAP_OWN_INOBT, .buf_ops = &xfs_inobt_buf_ops, + .maxlevels = M_IGEO(sc->mp)->inobt_maxlevels, }, [XREP_AGI_FINOBT] = { .rmap_owner = XFS_RMAP_OWN_INOBT, .buf_ops = &xfs_finobt_buf_ops, + .maxlevels = M_IGEO(sc->mp)->inobt_maxlevels, }, [XREP_AGI_END] = { .buf_ops = NULL diff --git a/fs/xfs/scrub/repair.h b/fs/xfs/scrub/repair.h index 3bb152d52a07..840f74ec431c 100644 --- a/fs/xfs/scrub/repair.h +++ b/fs/xfs/scrub/repair.h @@ -44,6 +44,9 @@ struct xrep_find_ag_btree { /* in: buffer ops */ const struct xfs_buf_ops *buf_ops; + /* in: maximum btree height */ + unsigned int maxlevels; + /* out: the highest btree block found and the tree height */ xfs_agblock_t root; unsigned int height;