• Dave Chinner's avatar
    xfs: combine __xfs_alloc_vextent_this_ag and xfs_alloc_ag_vextent · 4811c933
    Dave Chinner authored
    There's a bit of a recursive conundrum around
    xfs_alloc_ag_vextent(). We can't first call xfs_alloc_ag_vextent()
    without preparing the AGFL for the allocation, and preparing the
    AGFL calls xfs_alloc_ag_vextent() to prepare the AGFL for the
    allocation. This "double allocation" requirement is not really clear
    from the current xfs_alloc_fix_freelist() calls that are sprinkled
    through the allocation code.
    
    It's not helped that xfs_alloc_ag_vextent() can actually allocate
    from the AGFL itself, but there's special code to prevent AGFL prep
    allocations from allocating from the free list it's trying to prep.
    The naming is also not consistent: args->wasfromfl is true when we
    allocated _from_ the free list, but the indication that we are
    allocating _for_ the free list is via checking that (args->resv ==
    XFS_AG_RESV_AGFL).
    
    So, lets make this "allocation required for allocation" situation
    clear by moving it all inside xfs_alloc_ag_vextent(). The freelist
    allocation is a specific XFS_ALLOCTYPE_THIS_AG allocation, which
    translated directly to xfs_alloc_ag_vextent_size() allocation.
    
    This enables us to replace __xfs_alloc_vextent_this_ag() with a call
    to xfs_alloc_ag_vextent(), and we drive the freelist fixing further
    into the per-ag allocation algorithm.
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
    4811c933
xfs_alloc.c 98.4 KB