Re: [PATCH 05/14] xfs: stricter btree height checking when scanning for btree roots

Chandan Babu R
2021-09-20T10:10:13Z

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;

--
chandan