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.
*/
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
xfs_alloc_vextent_this_ag(
struct xfs_alloc_arg *args,
@ -3267,21 +3289,9 @@ xfs_alloc_vextent_this_ag(
}
args->pag = xfs_perag_get(mp, args->agno);
error = xfs_alloc_fix_freelist(args, 0);
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);
error = __xfs_alloc_vextent_this_ag(args);
xfs_alloc_vextent_set_fsbno(args, minimum_agno);
out_error:
xfs_perag_put(args->pag);
return error;
}
@ -3319,24 +3329,16 @@ xfs_alloc_vextent_iterate_ags(
args->agno = start_agno;
for (;;) {
args->pag = xfs_perag_get(mp, args->agno);
error = xfs_alloc_fix_freelist(args, flags);
error = __xfs_alloc_vextent_this_ag(args);
if (error) {
trace_xfs_alloc_vextent_nofix(args);
args->agbno = NULLAGBLOCK;
break;
}
/*
* If we get a buffer back then the allocation will fly.
*/
if (args->agbp) {
error = xfs_alloc_ag_vextent(args);
if (args->agbp)
break;
}
trace_xfs_alloc_vextent_loopfailed(args);
/*
* Didn't work, figure out the next iteration.
*/
if (args->agno == start_agno &&
args->otype == XFS_ALLOCTYPE_START_BNO)
args->type = XFS_ALLOCTYPE_THIS_AG;