• David Sterba's avatar
    btrfs: switch btrfs_root::delayed_nodes_tree to xarray from radix-tree · 6140ba8a
    David Sterba authored
    The radix-tree has been superseded by the xarray
    (https://lwn.net/Articles/745073), this patch converts the
    btrfs_root::delayed_nodes, the APIs are used in a simple way.
    
    First idea is to do xa_insert() but this would require GFP_ATOMIC
    allocation which we want to avoid if possible. The preload mechanism of
    radix-tree can be emulated within the xarray API.
    
    - xa_reserve() with GFP_NOFS outside of the lock, the reserved entry
      is inserted atomically at most once
    
    - xa_store() under a lock, in case something races in we can detect that
      and xa_load() returns a valid pointer
    
    All uses of xa_load() must check for a valid pointer in case they manage
    to get between the xa_reserve() and xa_store(), this is handled in
    btrfs_get_delayed_node().
    
    Otherwise the functionality is equivalent, xarray implements the
    radix-tree and there should be no performance difference.
    
    The patch continues the efforts started in 253bf575 ("btrfs: turn
    delayed_nodes_tree into an XArray") and fixes the problems with locking
    and GFP flags 088aea3b ("Revert "btrfs: turn delayed_nodes_tree
    into an XArray"").
    Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    6140ba8a
inode.c 314 KB