xfs: encode the max btree height in the cursor

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>
This commit is contained in:
Darrick J. Wong 2021-09-16 12:26:56 -07:00
parent 56370ea6e5
commit c0643f6fdd
4 changed files with 10 additions and 8 deletions

View File

@ -239,7 +239,7 @@ xfs_bmap_get_bp(
if (!cur) if (!cur)
return NULL; return NULL;
for (i = 0; i < XFS_BTREE_MAXLEVELS; i++) { for (i = 0; i < cur->bc_maxlevels; i++) {
if (!cur->bc_levels[i].bp) if (!cur->bc_levels[i].bp)
break; break;
if (xfs_buf_daddr(cur->bc_levels[i].bp) == bno) if (xfs_buf_daddr(cur->bc_levels[i].bp) == bno)

View File

@ -2933,7 +2933,7 @@ xfs_btree_new_iroot(
be16_add_cpu(&block->bb_level, 1); be16_add_cpu(&block->bb_level, 1);
xfs_btree_set_numrecs(block, 1); xfs_btree_set_numrecs(block, 1);
cur->bc_nlevels++; cur->bc_nlevels++;
ASSERT(cur->bc_nlevels <= XFS_BTREE_MAXLEVELS); ASSERT(cur->bc_nlevels <= cur->bc_maxlevels);
cur->bc_levels[level + 1].ptr = 1; cur->bc_levels[level + 1].ptr = 1;
kp = xfs_btree_key_addr(cur, 1, block); kp = xfs_btree_key_addr(cur, 1, block);
@ -3097,7 +3097,7 @@ xfs_btree_new_root(
xfs_btree_setbuf(cur, cur->bc_nlevels, nbp); xfs_btree_setbuf(cur, cur->bc_nlevels, nbp);
cur->bc_levels[cur->bc_nlevels].ptr = nptr; cur->bc_levels[cur->bc_nlevels].ptr = nptr;
cur->bc_nlevels++; cur->bc_nlevels++;
ASSERT(cur->bc_nlevels <= XFS_BTREE_MAXLEVELS); ASSERT(cur->bc_nlevels <= cur->bc_maxlevels);
*stat = 1; *stat = 1;
return 0; return 0;
error0: error0:

View File

@ -238,6 +238,7 @@ struct xfs_btree_cur
xfs_btnum_t bc_btnum; /* identifies which btree type */ xfs_btnum_t bc_btnum; /* identifies which btree type */
union xfs_btree_irec bc_rec; /* current insert/search record value */ union xfs_btree_irec bc_rec; /* current insert/search record value */
uint8_t bc_nlevels; /* number of levels in the tree */ 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 */ int bc_statoff; /* offset of btree stats array */
/* /*
@ -590,6 +591,7 @@ xfs_btree_alloc_cursor(
cur->bc_tp = tp; cur->bc_tp = tp;
cur->bc_mp = mp; cur->bc_mp = mp;
cur->bc_btnum = btnum; cur->bc_btnum = btnum;
cur->bc_maxlevels = XFS_BTREE_MAXLEVELS;
return cur; return cur;
} }

View File

@ -657,12 +657,12 @@ xfs_btree_bload_compute_geometry(
* checking levels 0 and 1 here, so set bc_nlevels such that the btree * checking levels 0 and 1 here, so set bc_nlevels such that the btree
* code doesn't interpret either as the root level. * 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->leaf_slack, 0);
xfs_btree_bload_ensure_slack(cur, &bbl->node_slack, 1); xfs_btree_bload_ensure_slack(cur, &bbl->node_slack, 1);
bbl->nr_records = nr_this_level = nr_records; 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 level_blocks;
uint64_t dontcare64; uint64_t dontcare64;
unsigned int level = cur->bc_nlevels - 1; unsigned int level = cur->bc_nlevels - 1;
@ -703,7 +703,7 @@ xfs_btree_bload_compute_geometry(
* block-based btree level. * block-based btree level.
*/ */
cur->bc_nlevels++; 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, xfs_btree_bload_level_geometry(cur, bbl, level,
nr_this_level, &avg_per_block, nr_this_level, &avg_per_block,
&level_blocks, &dontcare64); &level_blocks, &dontcare64);
@ -719,14 +719,14 @@ xfs_btree_bload_compute_geometry(
/* Otherwise, we need another level of btree. */ /* Otherwise, we need another level of btree. */
cur->bc_nlevels++; cur->bc_nlevels++;
ASSERT(cur->bc_nlevels <= XFS_BTREE_MAXLEVELS); ASSERT(cur->bc_nlevels <= cur->bc_maxlevels);
} }
nr_blocks += level_blocks; nr_blocks += level_blocks;
nr_this_level = level_blocks; nr_this_level = level_blocks;
} }
if (cur->bc_nlevels > XFS_BTREE_MAXLEVELS) if (cur->bc_nlevels > cur->bc_maxlevels)
return -EOVERFLOW; return -EOVERFLOW;
bbl->btree_height = cur->bc_nlevels; bbl->btree_height = cur->bc_nlevels;