Commit 4c175af2 authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: check that bc_nlevels never overflows



Warn if we ever bump nlevels higher than the allowed maximum cursor
height.

Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChandan Babu R <chandan.babu@oracle.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent 1ba6fd34
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -2933,6 +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);
	cur->bc_ptrs[level + 1] = 1;

	kp = xfs_btree_key_addr(cur, 1, block);
@@ -3096,6 +3097,7 @@ xfs_btree_new_root(
	xfs_btree_setbuf(cur, cur->bc_nlevels, nbp);
	cur->bc_ptrs[cur->bc_nlevels] = nptr;
	cur->bc_nlevels++;
	ASSERT(cur->bc_nlevels <= XFS_BTREE_MAXLEVELS);
	*stat = 1;
	return 0;
error0:
+2 −0
Original line number Diff line number Diff line
@@ -703,6 +703,7 @@ xfs_btree_bload_compute_geometry(
			 * block-based btree level.
			 */
			cur->bc_nlevels++;
			ASSERT(cur->bc_nlevels <= XFS_BTREE_MAXLEVELS);
			xfs_btree_bload_level_geometry(cur, bbl, level,
					nr_this_level, &avg_per_block,
					&level_blocks, &dontcare64);
@@ -718,6 +719,7 @@ xfs_btree_bload_compute_geometry(

			/* Otherwise, we need another level of btree. */
			cur->bc_nlevels++;
			ASSERT(cur->bc_nlevels <= XFS_BTREE_MAXLEVELS);
		}

		nr_blocks += level_blocks;