forked from Minki/linux
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:
parent
56370ea6e5
commit
c0643f6fdd
@ -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)
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user