• Filipe Manana's avatar
    btrfs: allow passing a cached state record to count_range_bits() · 8c6e53a7
    Filipe Manana authored
    An inode's io_tree can be quite large and there are cases where due to
    delalloc it can have thousands of extent state records, which makes the
    red black tree have a depth of 10 or more, making the operation of
    count_range_bits() slow if we repeatedly call it for a range that starts
    where, or after, the previous one we called it for. Such use cases are
    when searching for delalloc in a file range that corresponds to a hole or
    a prealloc extent, which is done during lseek SEEK_HOLE/DATA and fiemap.
    
    So introduce a cached state parameter to count_range_bits() which we use
    to store the last extent state record we visited, and then allow the
    caller to pass it again on its next call to count_range_bits(). The next
    patches in the series will make fiemap and lseek use the new parameter.
    
    This change is part of a patchset that has the goal to make performance
    better for applications that use lseek's SEEK_HOLE and SEEK_DATA modes to
    iterate over the extents of a file. Two examples are the cp program from
    coreutils 9.0+ and the tar program (when using its --sparse / -S option).
    A sample test and results are listed in the changelog of the last patch
    in the series:
    
      1/9 btrfs: remove leftover setting of EXTENT_UPTODATE state in an inode's io_tree
      2/9 btrfs: add an early exit when searching for delalloc range for lseek/fiemap
      3/9 btrfs: skip unnecessary delalloc searches during lseek/fiemap
      4/9 btrfs: search for delalloc more efficiently during lseek/fiemap
      5/9 btrfs: remove no longer used btrfs_next_extent_map()
      6/9 btrfs: allow passing a cached state record to count_range_bits()
      7/9 btrfs: update stale comment for count_range_bits()
      8/9 btrfs: use cached state when looking for delalloc ranges with fiemap
      9/9 btrfs: use cached state when looking for delalloc ranges with lseek
    Reported-by: default avatarWang Yugui <wangyugui@e16-tech.com>
    Link: https://lore.kernel.org/linux-btrfs/20221106073028.71F9.409509F4@e16-tech.com/
    Link: https://lore.kernel.org/linux-btrfs/CAL3q7H5NSVicm7nYBJ7x8fFkDpno8z3PYt5aPU43Bajc1H0h1Q@mail.gmail.com/Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    8c6e53a7
inode.c 325 KB