• Darrick J. Wong's avatar
    Merge tag 'xfs-perag-conv-tag' of... · c3eabd36
    Darrick J. Wong authored
    Merge tag 'xfs-perag-conv-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs into xfs-5.14-merge2
    
    xfs: initial agnumber -> perag conversions for shrink
    
    If we want to use active references to the perag to be able to gate
    shrink removing AGs and hence perags safely, we've got a fair bit of
    work to do actually use perags in all the places we need to.
    
    There's a lot of code that iterates ag numbers and then
    looks up perags from that, often multiple times for the same perag
    in the one operation. If we want to use reference counted perags for
    access control, then we need to convert all these uses to perag
    iterators, not agno iterators.
    
    [Patches 1-4]
    
    The first step of this is consolidating all the perag management -
    init, free, get, put, etc into a common location. THis is spread all
    over the place right now, so move it all into libxfs/xfs_ag.[ch].
    This does expose kernel only bits of the perag to libxfs and hence
    userspace, so the structures and code is rearranged to minimise the
    number of ifdefs that need to be added to the userspace codebase.
    The perag iterator in xfs_icache.c is promoted to a first class API
    and expanded to the needs of the code as required.
    
    [Patches 5-10]
    
    These are the first basic perag iterator conversions and changes to
    pass the perag down the stack from those iterators where
    appropriate. A lot of this is obvious, simple changes, though in
    some places we stop passing the perag down the stack because the
    code enters into an as yet unconverted subsystem that still uses raw
    AGs.
    
    [Patches 11-16]
    
    These replace the agno passed in the btree cursor for per-ag btree
    operations with a perag that is passed to the cursor init function.
    The cursor takes it's own reference to the perag, and the reference
    is dropped when the cursor is deleted. Hence we get reference
    coverage for the entire time the cursor is active, even if the code
    that initialised the cursor drops it's reference before the cursor
    or any of it's children (duplicates) have been deleted.
    
    The first patch adds the perag infrastructure for the cursor, the
    next four patches convert a btree cursor at a time, and the last
    removes the agno from the cursor once it is unused.
    
    [Patches 17-21]
    
    These patches are a demonstration of the simplifications and
    cleanups that come from plumbing the perag through interfaces that
    select and then operate on a specific AG. In this case the inode
    allocation algorithm does up to three walks across all AGs before it
    either allocates an inode or fails. Two of these walks are purely
    just to select the AG, and even then it doesn't guarantee inode
    allocation success so there's a third walk if the selected AG
    allocation fails.
    
    These patches collapse the selection and allocation into a single
    loop, simplifies the error handling because xfs_dir_ialloc() always
    returns ENOSPC if no AG was selected for inode allocation or we fail
    to allocate an inode in any AG, gets rid of xfs_dir_ialloc()
    wrapper, converts inode allocation to run entirely from a single
    perag instance, and then factors xfs_dialloc() into a much, much
    simpler loop which is easy to understand.
    
    Hence we end up with the same inode allocation logic, but it only
    needs two complete iterations at worst, makes AG selection and
    allocation atomic w.r.t. shrink and chops out out over 100 lines of
    code from this hot code path.
    
    [Patch 22]
    
    Converts the unlink path to pass perags through it.
    
    There's more conversion work to be done, but this patchset gets
    through a large chunk of it in one hit. Most of the iterators are
    converted, so once this is solidified we can move on to converting
    these to active references for being able to free perags while the
    fs is still active.
    
    * tag 'xfs-perag-conv-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs: (23 commits)
      xfs: remove xfs_perag_t
      xfs: use perag through unlink processing
      xfs: clean up and simplify xfs_dialloc()
      xfs: inode allocation can use a single perag instance
      xfs: get rid of xfs_dir_ialloc()
      xfs: collapse AG selection for inode allocation
      xfs: simplify xfs_dialloc_select_ag() return values
      xfs: remove agno from btree cursor
      xfs: use perag for ialloc btree cursors
      xfs: convert allocbt cursors to use perags
      xfs: convert refcount btree cursor to use perags
      xfs: convert rmap btree cursor to using a perag
      xfs: add a perag to the btree cursor
      xfs: pass perags around in fsmap data dev functions
      xfs: push perags through the ag reservation callouts
      xfs: pass perags through to the busy extent code
      xfs: convert secondary superblock walk to use perags
      xfs: convert xfs_iwalk to use perag references
      xfs: convert raw ag walks to use for_each_perag
      xfs: make for_each_perag... a first class citizen
      ...
    c3eabd36
xfs_buf.c 56.4 KB