1
0
Fork 0
mirror of synced 2025-03-06 20:59:54 +01:00

xfs: factor xfs_alloc_vextent_this_ag() for _iterate_ags()

The core of the per-ag iteration is effectively doing a "this ag"
allocation on one AG at a time. Use the same code to implement the
core "this ag" allocation in both xfs_alloc_vextent_this_ag()
and xfs_alloc_vextent_iterate_ags().

This means we only call xfs_alloc_ag_vextent() from one place so we
can easily collapse the call stack in future patches.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
This commit is contained in:
Dave Chinner 2023-02-13 09:14:53 +11:00
parent ecd788a924
commit 2edf06a50f

View file

@ -3244,6 +3244,28 @@ xfs_alloc_vextent_set_fsbno(
/* /*
* Allocate within a single AG only. * Allocate within a single AG only.
*/ */
static int
__xfs_alloc_vextent_this_ag(
struct xfs_alloc_arg *args)
{
struct xfs_mount *mp = args->mp;
int error;
error = xfs_alloc_fix_freelist(args, 0);
if (error) {
trace_xfs_alloc_vextent_nofix(args);
return error;
}
if (!args->agbp) {
/* cannot allocate in this AG at all */
trace_xfs_alloc_vextent_noagbp(args);
args->agbno = NULLAGBLOCK;
return 0;
}
args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno);
return xfs_alloc_ag_vextent(args);
}
static int static int
xfs_alloc_vextent_this_ag( xfs_alloc_vextent_this_ag(
struct xfs_alloc_arg *args, struct xfs_alloc_arg *args,
@ -3267,21 +3289,9 @@ xfs_alloc_vextent_this_ag(
} }
args->pag = xfs_perag_get(mp, args->agno); args->pag = xfs_perag_get(mp, args->agno);
error = xfs_alloc_fix_freelist(args, 0); error = __xfs_alloc_vextent_this_ag(args);
if (error) {
trace_xfs_alloc_vextent_nofix(args);
goto out_error;
}
if (!args->agbp) {
trace_xfs_alloc_vextent_noagbp(args);
args->fsbno = NULLFSBLOCK;
goto out_error;
}
args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno);
error = xfs_alloc_ag_vextent(args);
xfs_alloc_vextent_set_fsbno(args, minimum_agno); xfs_alloc_vextent_set_fsbno(args, minimum_agno);
out_error:
xfs_perag_put(args->pag); xfs_perag_put(args->pag);
return error; return error;
} }
@ -3319,24 +3329,16 @@ xfs_alloc_vextent_iterate_ags(
args->agno = start_agno; args->agno = start_agno;
for (;;) { for (;;) {
args->pag = xfs_perag_get(mp, args->agno); args->pag = xfs_perag_get(mp, args->agno);
error = xfs_alloc_fix_freelist(args, flags); error = __xfs_alloc_vextent_this_ag(args);
if (error) { if (error) {
trace_xfs_alloc_vextent_nofix(args); args->agbno = NULLAGBLOCK;
break; break;
} }
/* if (args->agbp)
* If we get a buffer back then the allocation will fly.
*/
if (args->agbp) {
error = xfs_alloc_ag_vextent(args);
break; break;
}
trace_xfs_alloc_vextent_loopfailed(args); trace_xfs_alloc_vextent_loopfailed(args);
/*
* Didn't work, figure out the next iteration.
*/
if (args->agno == start_agno && if (args->agno == start_agno &&
args->otype == XFS_ALLOCTYPE_START_BNO) args->otype == XFS_ALLOCTYPE_START_BNO)
args->type = XFS_ALLOCTYPE_THIS_AG; args->type = XFS_ALLOCTYPE_THIS_AG;