xfs: encode the max btree height in the cursor
authorDarrick J. Wong <djwong@kernel.org>
Thu, 16 Sep 2021 19:26:56 +0000 (12:26 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 19 Oct 2021 18:45:15 +0000 (11:45 -0700)
Encode the maximum btree height in the cursor, since we're soon going to
allow smaller cursors for AG btrees and larger cursors for file btrees.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
fs/xfs/libxfs/xfs_bmap.c
fs/xfs/libxfs/xfs_btree.c
fs/xfs/libxfs/xfs_btree.h
fs/xfs/libxfs/xfs_btree_staging.c

index 644b956..2ae5bf9 100644 (file)
@@ -239,7 +239,7 @@ xfs_bmap_get_bp(
        if (!cur)
                return NULL;
 
-       for (i = 0; i < XFS_BTREE_MAXLEVELS; i++) {
+       for (i = 0; i < cur->bc_maxlevels; i++) {
                if (!cur->bc_levels[i].bp)
                        break;
                if (xfs_buf_daddr(cur->bc_levels[i].bp) == bno)
index 25dfab8..6ced8f0 100644 (file)
@@ -2933,7 +2933,7 @@ xfs_btree_new_iroot(
        be16_add_cpu(&block->bb_level, 1);
        xfs_btree_set_numrecs(block, 1);
        cur->bc_nlevels++;
-       ASSERT(cur->bc_nlevels <= XFS_BTREE_MAXLEVELS);
+       ASSERT(cur->bc_nlevels <= cur->bc_maxlevels);
        cur->bc_levels[level + 1].ptr = 1;
 
        kp = xfs_btree_key_addr(cur, 1, block);
@@ -3097,7 +3097,7 @@ xfs_btree_new_root(
        xfs_btree_setbuf(cur, cur->bc_nlevels, nbp);
        cur->bc_levels[cur->bc_nlevels].ptr = nptr;
        cur->bc_nlevels++;
-       ASSERT(cur->bc_nlevels <= XFS_BTREE_MAXLEVELS);
+       ASSERT(cur->bc_nlevels <= cur->bc_maxlevels);
        *stat = 1;
        return 0;
 error0:
index 8e78ede..ed0b7d5 100644 (file)
@@ -238,6 +238,7 @@ struct xfs_btree_cur
        xfs_btnum_t             bc_btnum; /* identifies which btree type */
        union xfs_btree_irec    bc_rec; /* current insert/search record value */
        uint8_t                 bc_nlevels; /* number of levels in the tree */
+       uint8_t                 bc_maxlevels; /* maximum levels for this btree type */
        int                     bc_statoff; /* offset of btree stats array */
 
        /*
@@ -590,6 +591,7 @@ xfs_btree_alloc_cursor(
        cur->bc_tp = tp;
        cur->bc_mp = mp;
        cur->bc_btnum = btnum;
+       cur->bc_maxlevels = XFS_BTREE_MAXLEVELS;
 
        return cur;
 }
index cc56efc..dd75e20 100644 (file)
@@ -657,12 +657,12 @@ xfs_btree_bload_compute_geometry(
         * checking levels 0 and 1 here, so set bc_nlevels such that the btree
         * code doesn't interpret either as the root level.
         */
-       cur->bc_nlevels = XFS_BTREE_MAXLEVELS - 1;
+       cur->bc_nlevels = cur->bc_maxlevels - 1;
        xfs_btree_bload_ensure_slack(cur, &bbl->leaf_slack, 0);
        xfs_btree_bload_ensure_slack(cur, &bbl->node_slack, 1);
 
        bbl->nr_records = nr_this_level = nr_records;
-       for (cur->bc_nlevels = 1; cur->bc_nlevels <= XFS_BTREE_MAXLEVELS;) {
+       for (cur->bc_nlevels = 1; cur->bc_nlevels <= cur->bc_maxlevels;) {
                uint64_t        level_blocks;
                uint64_t        dontcare64;
                unsigned int    level = cur->bc_nlevels - 1;
@@ -703,7 +703,7 @@ xfs_btree_bload_compute_geometry(
                         * block-based btree level.
                         */
                        cur->bc_nlevels++;
-                       ASSERT(cur->bc_nlevels <= XFS_BTREE_MAXLEVELS);
+                       ASSERT(cur->bc_nlevels <= cur->bc_maxlevels);
                        xfs_btree_bload_level_geometry(cur, bbl, level,
                                        nr_this_level, &avg_per_block,
                                        &level_blocks, &dontcare64);
@@ -719,14 +719,14 @@ xfs_btree_bload_compute_geometry(
 
                        /* Otherwise, we need another level of btree. */
                        cur->bc_nlevels++;
-                       ASSERT(cur->bc_nlevels <= XFS_BTREE_MAXLEVELS);
+                       ASSERT(cur->bc_nlevels <= cur->bc_maxlevels);
                }
 
                nr_blocks += level_blocks;
                nr_this_level = level_blocks;
        }
 
-       if (cur->bc_nlevels > XFS_BTREE_MAXLEVELS)
+       if (cur->bc_nlevels > cur->bc_maxlevels)
                return -EOVERFLOW;
 
        bbl->btree_height = cur->bc_nlevels;