Restore the lowspace extent allocator algorithm
PATCH 2/2 Restore the lowspace extent allocator algorithm
When free space is running low the extent allocator may choose to allocate an extent from an AG without leaving sufficient space for a btree split when inserting the new extent (see where xfs_bmap_btalloc() sets minleft to 0). In this case the allocator will enable the lowspace algorithm which is supposed to allow further allocations (such as btree splits and newroots) to allocate from sequential AGs. This algorithm has been broken for a long time and this patch restores its behaviour.
Lachlan
fs/xfs/xfs_bmap_btree.c +0 -0
@@ -1504,7 +1504,9 @@ xfs_bmbt_split(
* we may need space for two tree splits. */ args.minleft = xfs_trans_get_block_res(args.tp);
- } else
+ } else if (cur->bc_private.b.flist->xbf_low)
+ args.type = XFS_ALLOCTYPE_START_BNO;
+ else
args.type = XFS_ALLOCTYPE_NEAR_BNO; args.mod = args.alignment = args.total = args.isfl = args.userdata = args.minalignslop = 0; @@ -2232,7 +2234,9 @@ xfs_bmbt_newroot( #endif args.fsbno = be64_to_cpu(*pp); args.type = XFS_ALLOCTYPE_START_BNO;
- } else
+ } else if (cur->bc_private.b.flist->xbf_low)
+ args.type = XFS_ALLOCTYPE_START_BNO;
+ else
args.type = XFS_ALLOCTYPE_NEAR_BNO;
if ((error = xfs_alloc_vextent(&args))) {
XFS_BMBT_TRACE_CURSOR(cur, ERROR);Quoted 8 lines · Lachlan McIlroy
When free space is running low the extent allocator may choose to allocate an extent from an AG without leaving sufficient space for a btree split when inserting the new extent (see where
xfs_bmap_btalloc()sets minleft to 0). In this case the allocator will enable the lowspace algorithm which is supposed to allow further allocations (such as btree splits and newroots) to allocate from sequential AGs. This algorithm has been broken for a long time and this patch restores its behaviour.
Looks ok to me. Perhaps add a comment to the definition of xbf_low that explains what it is used for so it doesn't get broken again in future?
Cheers,
Dave.
Signature · 2 lines
Dave Chinner [email protected]