From: Dave Chinner <dchinner@xxxxxxxxxx> As they are now identical functions exact for the allocation function they call. Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> --- fs/xfs/libxfs/xfs_alloc.c | 84 ++++++++++++++++++--------------------- fs/xfs/xfs_trace.h | 1 + 2 files changed, 40 insertions(+), 45 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 3190c8204903..27c62f303488 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -3649,6 +3649,43 @@ xfs_alloc_vextent_first_ag( return xfs_alloc_vextent_finish(args, minimum_agno, error, true); } +static int +xfs_alloc_vextent_bno( + struct xfs_alloc_arg *args, + xfs_fsblock_t target, + bool exact) +{ + struct xfs_mount *mp = args->mp; + xfs_agnumber_t minimum_agno; + int error; + + ASSERT(args->pag != NULL); + ASSERT(args->pag->pag_agno == XFS_FSB_TO_AGNO(mp, target)); + + args->agno = args->pag->pag_agno; + args->agbno = XFS_FSB_TO_AGBNO(mp, target); + + trace_xfs_alloc_vextent_bno(args); + + error = xfs_alloc_vextent_check_args(args, args->agno, args->agbno, + &minimum_agno); + if (error) { + if (error == -ENOSPC) + return 0; + return error; + } + + error = xfs_alloc_vextent_prepare_ag(args, 0); + if (!error && args->agbp) { + if (exact) + error = xfs_alloc_ag_vextent_exact(args); + else + error = xfs_alloc_ag_vextent_near(args, 0); + } + + return xfs_alloc_vextent_finish(args, minimum_agno, error, false); +} + /* * Allocate at the exact block target or fail. Caller is expected to hold a * perag reference in args->pag. @@ -3658,28 +3695,8 @@ xfs_alloc_vextent_exact_bno( struct xfs_alloc_arg *args, xfs_fsblock_t target) { - struct xfs_mount *mp = args->mp; - xfs_agnumber_t minimum_agno; - int error; - - args->agno = args->pag->pag_agno; - args->agbno = XFS_FSB_TO_AGBNO(mp, target); - trace_xfs_alloc_vextent_exact_bno(args); - - error = xfs_alloc_vextent_check_args(args, args->agno, args->agbno, - &minimum_agno); - if (error) { - if (error == -ENOSPC) - return 0; - return error; - } - - error = xfs_alloc_vextent_prepare_ag(args, 0); - if (!error && args->agbp) - error = xfs_alloc_ag_vextent_exact(args); - - return xfs_alloc_vextent_finish(args, minimum_agno, error, false); + return xfs_alloc_vextent_bno(args, target, true); } /* @@ -3693,31 +3710,8 @@ xfs_alloc_vextent_near_bno( struct xfs_alloc_arg *args, xfs_fsblock_t target) { - struct xfs_mount *mp = args->mp; - xfs_agnumber_t minimum_agno; - uint32_t alloc_flags = 0; - int error; - - ASSERT(args->pag->pag_agno == XFS_FSB_TO_AGNO(mp, target)); - - args->agno = args->pag->pag_agno; - args->agbno = XFS_FSB_TO_AGBNO(mp, target); - trace_xfs_alloc_vextent_near_bno(args); - - error = xfs_alloc_vextent_check_args(args, args->agno, args->agbno, - &minimum_agno); - if (error) { - if (error == -ENOSPC) - return 0; - return error; - } - - error = xfs_alloc_vextent_prepare_ag(args, alloc_flags); - if (!error && args->agbp) - error = xfs_alloc_ag_vextent_near(args, alloc_flags); - - return xfs_alloc_vextent_finish(args, minimum_agno, error, false); + return xfs_alloc_vextent_bno(args, target, false); } /* Ensure that the freelist is at full capacity. */ diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 3926cf7f2a6e..628da36b20b9 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -1884,6 +1884,7 @@ DEFINE_ALLOC_EVENT(xfs_alloc_vextent_start_ag); DEFINE_ALLOC_EVENT(xfs_alloc_vextent_first_ag); DEFINE_ALLOC_EVENT(xfs_alloc_vextent_exact_bno); DEFINE_ALLOC_EVENT(xfs_alloc_vextent_near_bno); +DEFINE_ALLOC_EVENT(xfs_alloc_vextent_bno); DEFINE_ALLOC_EVENT(xfs_alloc_vextent_finish); TRACE_EVENT(xfs_alloc_cur_check, -- 2.40.1