Blob Blame History Raw
xfs_repair: Use proper min/max values in compute_level_geometry

When compute_level_geometry was added it exclusively uses
m_alloc_mnr/m_alloc_mxr but the rmap btree should be using
m_rmap_mnr/m_rmap_mxr.  Pass those in directly to fix the
problem.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---

diff --git a/repair/phase5.c b/repair/phase5.c
index 0b8a55ff..dff342c8 100644
--- a/repair/phase5.c
+++ b/repair/phase5.c
@@ -355,12 +355,12 @@ compute_level_geometry(
 	struct bt_stat_level	*lptr,
 	uint64_t		nr_this_level,
 	int			slack,
-	bool			leaf)
+	uint			maxrecs,
+	uint			minrecs)
 {
-	unsigned int		maxrecs = mp->m_alloc_mxr[!leaf];
 	unsigned int		desired_npb;
 
-	desired_npb = max(mp->m_alloc_mnr[!leaf], maxrecs - slack);
+	desired_npb = max(minrecs, maxrecs - slack);
 	lptr->num_recs_tot = nr_this_level;
 	lptr->num_blocks = max(1ULL, nr_this_level / desired_npb);
 
@@ -410,7 +410,8 @@ calculate_freespace_cursor(xfs_mount_t *mp, xfs_agnumber_t agno,
 	 * of the tree and set up the cursor for the leaf level
 	 * (note that the same code is duplicated further down)
 	 */
-	compute_level_geometry(mp, lptr, num_extents, 2, true);
+	compute_level_geometry(mp, lptr, num_extents, 2,
+			mp->m_alloc_mxr[0], mp->m_alloc_mnr[0]);
 	level = 1;
 
 #ifdef XR_BLD_FREE_TRACE
@@ -429,7 +430,8 @@ calculate_freespace_cursor(xfs_mount_t *mp, xfs_agnumber_t agno,
 		lptr = &btree_curs->level[level];
 
 		compute_level_geometry(mp, lptr,
-				p_lptr->num_blocks, 0, false);
+				p_lptr->num_blocks, 0,
+				mp->m_alloc_mxr[1], mp->m_alloc_mnr[1]);
 #ifdef XR_BLD_FREE_TRACE
 		fprintf(stderr, "%s %d %d %d %d %d\n", __func__,
 				level,
@@ -509,7 +511,8 @@ calculate_freespace_cursor(xfs_mount_t *mp, xfs_agnumber_t agno,
 	 * of the number of extents changing
 	 */
 	old_blocks = btree_curs->level[0].num_blocks;
-	compute_level_geometry(mp, &btree_curs->level[0], num_extents, 2, true);
+	compute_level_geometry(mp, &btree_curs->level[0], num_extents, 2,
+				mp->m_alloc_mxr[0], mp->m_alloc_mnr[0]);
 	extra_blocks = 0;
 
 	if (old_blocks != btree_curs->level[0].num_blocks)  {
@@ -578,7 +581,8 @@ calculate_freespace_cursor(xfs_mount_t *mp, xfs_agnumber_t agno,
 			lptr = &btree_curs->level[level++];
 
 			compute_level_geometry(mp, lptr,
-					p_lptr->num_blocks, 0, false);
+					p_lptr->num_blocks, 0,
+					mp->m_alloc_mxr[1], mp->m_alloc_mnr[1]);
 		}
 		ASSERT(level < XFS_BTREE_MAXLEVELS);
 		ASSERT(lptr->num_blocks == 1);
@@ -1399,7 +1403,8 @@ init_rmapbt_cursor(
 	 * metadata AG entries without too many splits.
 	 */
 	compute_level_geometry(mp, lptr, num_recs,
-			num_recs > mp->m_rmap_mxr[0] ? 10 : 0, true);
+			num_recs > mp->m_rmap_mxr[0] ? 10 : 0,
+			mp->m_rmap_mxr[0], mp->m_rmap_mnr[0]);
 	blocks_allocated = lptr->num_blocks;
 	level = 1;
 
@@ -1408,7 +1413,8 @@ init_rmapbt_cursor(
 		lptr = &btree_curs->level[level++];
 
 		compute_level_geometry(mp, lptr,
-				p_lptr->num_blocks, 0, false);
+				p_lptr->num_blocks, 0,
+				mp->m_rmap_mxr[1], mp->m_rmap_mnr[1]);
 		blocks_allocated += lptr->num_blocks;
 	}
 	ASSERT(level < XFS_BTREE_MAXLEVELS);