Blame SOURCES/xfsprogs-5.10.0-xfs_repair-Use-proper-min-max-values-in-compute_level_geometry.patch

d13294
xfs_repair: Use proper min/max values in compute_level_geometry
d13294
d13294
When compute_level_geometry was added it exclusively uses
d13294
m_alloc_mnr/m_alloc_mxr but the rmap btree should be using
d13294
m_rmap_mnr/m_rmap_mxr.  Pass those in directly to fix the
d13294
problem.
d13294
d13294
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
d13294
---
d13294
d13294
diff --git a/repair/phase5.c b/repair/phase5.c
d13294
index 0b8a55ff..dff342c8 100644
d13294
--- a/repair/phase5.c
d13294
+++ b/repair/phase5.c
d13294
@@ -355,12 +355,12 @@ compute_level_geometry(
d13294
 	struct bt_stat_level	*lptr,
d13294
 	uint64_t		nr_this_level,
d13294
 	int			slack,
d13294
-	bool			leaf)
d13294
+	uint			maxrecs,
d13294
+	uint			minrecs)
d13294
 {
d13294
-	unsigned int		maxrecs = mp->m_alloc_mxr[!leaf];
d13294
 	unsigned int		desired_npb;
d13294
 
d13294
-	desired_npb = max(mp->m_alloc_mnr[!leaf], maxrecs - slack);
d13294
+	desired_npb = max(minrecs, maxrecs - slack);
d13294
 	lptr->num_recs_tot = nr_this_level;
d13294
 	lptr->num_blocks = max(1ULL, nr_this_level / desired_npb);
d13294
 
d13294
@@ -410,7 +410,8 @@ calculate_freespace_cursor(xfs_mount_t *mp, xfs_agnumber_t agno,
d13294
 	 * of the tree and set up the cursor for the leaf level
d13294
 	 * (note that the same code is duplicated further down)
d13294
 	 */
d13294
-	compute_level_geometry(mp, lptr, num_extents, 2, true);
d13294
+	compute_level_geometry(mp, lptr, num_extents, 2,
d13294
+			mp->m_alloc_mxr[0], mp->m_alloc_mnr[0]);
d13294
 	level = 1;
d13294
 
d13294
 #ifdef XR_BLD_FREE_TRACE
d13294
@@ -429,7 +430,8 @@ calculate_freespace_cursor(xfs_mount_t *mp, xfs_agnumber_t agno,
d13294
 		lptr = &btree_curs->level[level];
d13294
 
d13294
 		compute_level_geometry(mp, lptr,
d13294
-				p_lptr->num_blocks, 0, false);
d13294
+				p_lptr->num_blocks, 0,
d13294
+				mp->m_alloc_mxr[1], mp->m_alloc_mnr[1]);
d13294
 #ifdef XR_BLD_FREE_TRACE
d13294
 		fprintf(stderr, "%s %d %d %d %d %d\n", __func__,
d13294
 				level,
d13294
@@ -509,7 +511,8 @@ calculate_freespace_cursor(xfs_mount_t *mp, xfs_agnumber_t agno,
d13294
 	 * of the number of extents changing
d13294
 	 */
d13294
 	old_blocks = btree_curs->level[0].num_blocks;
d13294
-	compute_level_geometry(mp, &btree_curs->level[0], num_extents, 2, true);
d13294
+	compute_level_geometry(mp, &btree_curs->level[0], num_extents, 2,
d13294
+				mp->m_alloc_mxr[0], mp->m_alloc_mnr[0]);
d13294
 	extra_blocks = 0;
d13294
 
d13294
 	if (old_blocks != btree_curs->level[0].num_blocks)  {
d13294
@@ -578,7 +581,8 @@ calculate_freespace_cursor(xfs_mount_t *mp, xfs_agnumber_t agno,
d13294
 			lptr = &btree_curs->level[level++];
d13294
 
d13294
 			compute_level_geometry(mp, lptr,
d13294
-					p_lptr->num_blocks, 0, false);
d13294
+					p_lptr->num_blocks, 0,
d13294
+					mp->m_alloc_mxr[1], mp->m_alloc_mnr[1]);
d13294
 		}
d13294
 		ASSERT(level < XFS_BTREE_MAXLEVELS);
d13294
 		ASSERT(lptr->num_blocks == 1);
d13294
@@ -1399,7 +1403,8 @@ init_rmapbt_cursor(
d13294
 	 * metadata AG entries without too many splits.
d13294
 	 */
d13294
 	compute_level_geometry(mp, lptr, num_recs,
d13294
-			num_recs > mp->m_rmap_mxr[0] ? 10 : 0, true);
d13294
+			num_recs > mp->m_rmap_mxr[0] ? 10 : 0,
d13294
+			mp->m_rmap_mxr[0], mp->m_rmap_mnr[0]);
d13294
 	blocks_allocated = lptr->num_blocks;
d13294
 	level = 1;
d13294
 
d13294
@@ -1408,7 +1413,8 @@ init_rmapbt_cursor(
d13294
 		lptr = &btree_curs->level[level++];
d13294
 
d13294
 		compute_level_geometry(mp, lptr,
d13294
-				p_lptr->num_blocks, 0, false);
d13294
+				p_lptr->num_blocks, 0,
d13294
+				mp->m_rmap_mxr[1], mp->m_rmap_mnr[1]);
d13294
 		blocks_allocated += lptr->num_blocks;
d13294
 	}
d13294
 	ASSERT(level < XFS_BTREE_MAXLEVELS);
d13294
d13294