]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: validate ag btree levels using the precomputed values
authorDarrick J. Wong <djwong@kernel.org>
Wed, 30 Jun 2021 22:27:09 +0000 (18:27 -0400)
committerEric Sandeen <sandeen@sandeen.net>
Wed, 30 Jun 2021 22:27:09 +0000 (18:27 -0400)
Source kernel commit: 973975b72a36ee86c8c59057f06fcde03478ff4f

Use the AG btree height limits that we precomputed into the xfs_mount to
validate the AG headers instead of using XFS_BTREE_MAXLEVELS.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/xfs_alloc.c
libxfs/xfs_ialloc.c
libxfs/xfs_inode_fork.c

index 63e15bb9ea33e8d21f27efb16557b57bd97761b2..75fa7ea472ded17c4c13d7320cd3a691a2d5c6ae 100644 (file)
@@ -2902,13 +2902,13 @@ xfs_agf_verify(
 
        if (be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]) < 1 ||
            be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]) < 1 ||
-           be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]) > XFS_BTREE_MAXLEVELS ||
-           be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]) > XFS_BTREE_MAXLEVELS)
+           be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]) > mp->m_ag_maxlevels ||
+           be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]) > mp->m_ag_maxlevels)
                return __this_address;
 
        if (xfs_sb_version_hasrmapbt(&mp->m_sb) &&
            (be32_to_cpu(agf->agf_levels[XFS_BTNUM_RMAP]) < 1 ||
-            be32_to_cpu(agf->agf_levels[XFS_BTNUM_RMAP]) > XFS_BTREE_MAXLEVELS))
+            be32_to_cpu(agf->agf_levels[XFS_BTNUM_RMAP]) > mp->m_rmap_maxlevels))
                return __this_address;
 
        if (xfs_sb_version_hasrmapbt(&mp->m_sb) &&
@@ -2935,7 +2935,7 @@ xfs_agf_verify(
 
        if (xfs_sb_version_hasreflink(&mp->m_sb) &&
            (be32_to_cpu(agf->agf_refcount_level) < 1 ||
-            be32_to_cpu(agf->agf_refcount_level) > XFS_BTREE_MAXLEVELS))
+            be32_to_cpu(agf->agf_refcount_level) > mp->m_refc_maxlevels))
                return __this_address;
 
        return NULL;
index c8e2125db85d2c9c245f8a89e509ded1ac309ead..b1646a357a3bdd2d722c1cb142b1e454605795b8 100644 (file)
@@ -2530,12 +2530,12 @@ xfs_agi_verify(
                return __this_address;
 
        if (be32_to_cpu(agi->agi_level) < 1 ||
-           be32_to_cpu(agi->agi_level) > XFS_BTREE_MAXLEVELS)
+           be32_to_cpu(agi->agi_level) > M_IGEO(mp)->inobt_maxlevels)
                return __this_address;
 
        if (xfs_sb_version_hasfinobt(&mp->m_sb) &&
            (be32_to_cpu(agi->agi_free_level) < 1 ||
-            be32_to_cpu(agi->agi_free_level) > XFS_BTREE_MAXLEVELS))
+            be32_to_cpu(agi->agi_free_level) > M_IGEO(mp)->inobt_maxlevels))
                return __this_address;
 
        /*
index 1802586c11db290ed7bb667e6383eb9883bdbe4f..cdf099385a0cecd57a679cd022d45594651fe3f6 100644 (file)
@@ -193,7 +193,7 @@ xfs_iformat_btree(
                     XFS_BMDR_SPACE_CALC(nrecs) >
                                        XFS_DFORK_SIZE(dip, mp, whichfork) ||
                     ifp->if_nextents > ip->i_d.di_nblocks) ||
-                    level == 0 || level > XFS_BTREE_MAXLEVELS) {
+                    level == 0 || level > XFS_BM_MAXLEVELS(mp, whichfork)) {
                xfs_warn(mp, "corrupt inode %Lu (btree).",
                                        (unsigned long long) ip->i_ino);
                xfs_inode_verifier_error(ip, -EFSCORRUPTED,