diff options
author | Dave Chinner <dchinner@redhat.com> | 2023-02-12 23:14:53 +0100 |
---|---|---|
committer | Dave Chinner <dchinner@redhat.com> | 2023-02-12 23:14:53 +0100 |
commit | 74c36a8689d3d8ca9d9e96759c9bbf337e049097 (patch) | |
tree | b6ac747bad431ddfac5bec8eeccc3225cd04a62e /fs/xfs/libxfs/xfs_alloc.c | |
parent | xfs: combine __xfs_alloc_vextent_this_ag and xfs_alloc_ag_vextent (diff) | |
download | linux-74c36a8689d3d8ca9d9e96759c9bbf337e049097.tar.xz linux-74c36a8689d3d8ca9d9e96759c9bbf337e049097.zip |
xfs: use xfs_alloc_vextent_this_ag() where appropriate
Change obvious callers of single AG allocation to use
xfs_alloc_vextent_this_ag(). Drive the per-ag grabbing out to the
callers, too, so that callers with active references don't need
to do new lookups just for an allocation in a context that already
has a perag reference.
The only remaining caller that does single AG allocation through
xfs_alloc_vextent() is xfs_bmap_btalloc() with
XFS_ALLOCTYPE_NEAR_BNO. That is going to need more untangling before
it can be converted cleanly.
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Diffstat (limited to 'fs/xfs/libxfs/xfs_alloc.c')
-rw-r--r-- | fs/xfs/libxfs/xfs_alloc.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index edcbf8fd10ea..7e4452c11421 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -2723,7 +2723,6 @@ xfs_alloc_fix_freelist( targs.agbp = agbp; targs.agno = args->agno; targs.alignment = targs.minlen = targs.prod = 1; - targs.type = XFS_ALLOCTYPE_THIS_AG; targs.pag = pag; error = xfs_alloc_read_agfl(pag, tp, &agflbp); if (error) @@ -3271,14 +3270,17 @@ xfs_alloc_vextent_set_fsbno( /* * Allocate within a single AG only. */ -static int +int xfs_alloc_vextent_this_ag( - struct xfs_alloc_arg *args, - xfs_agnumber_t minimum_agno) + struct xfs_alloc_arg *args) { struct xfs_mount *mp = args->mp; + xfs_agnumber_t minimum_agno = 0; int error; + if (args->tp->t_highest_agno != NULLAGNUMBER) + minimum_agno = args->tp->t_highest_agno; + error = xfs_alloc_vextent_check_args(args); if (error) { if (error == -ENOSPC) @@ -3293,11 +3295,8 @@ xfs_alloc_vextent_this_ag( return 0; } - args->pag = xfs_perag_get(mp, args->agno); error = xfs_alloc_ag_vextent(args); - xfs_alloc_vextent_set_fsbno(args, minimum_agno); - xfs_perag_put(args->pag); return error; } @@ -3480,6 +3479,7 @@ xfs_alloc_vextent( struct xfs_alloc_arg *args) { xfs_agnumber_t minimum_agno = 0; + int error; if (args->tp->t_highest_agno != NULLAGNUMBER) minimum_agno = args->tp->t_highest_agno; @@ -3488,17 +3488,21 @@ xfs_alloc_vextent( case XFS_ALLOCTYPE_THIS_AG: case XFS_ALLOCTYPE_NEAR_BNO: case XFS_ALLOCTYPE_THIS_BNO: - return xfs_alloc_vextent_this_ag(args, minimum_agno); + args->pag = xfs_perag_get(args->mp, + XFS_FSB_TO_AGNO(args->mp, args->fsbno)); + error = xfs_alloc_vextent_this_ag(args); + xfs_perag_put(args->pag); + break; case XFS_ALLOCTYPE_START_BNO: return xfs_alloc_vextent_start_ag(args, minimum_agno); case XFS_ALLOCTYPE_FIRST_AG: return xfs_alloc_vextent_first_ag(args, minimum_agno); default: + error = -EFSCORRUPTED; ASSERT(0); - /* NOTREACHED */ + break; } - /* Should never get here */ - return -EFSCORRUPTED; + return error; } /* Ensure that the freelist is at full capacity. */ |