• Qu Wenruo's avatar
    btrfs: defrag: don't try to defrag extents which are under writeback · 0d1ffa22
    Qu Wenruo authored
    Once we start writeback (have called btrfs_run_delalloc_range()), we
    allocate an extent, create an extent map point to that extent, with a
    generation of (u64)-1, created the ordered extent and then clear the
    DELALLOC bit from the range in the inode's io tree.
    
    Such extent map can pass the first call of defrag_collect_targets(), as
    its generation is (u64)-1, meets any possible minimal generation check.
    And the range will not have DELALLOC bit, also passing the DELALLOC bit
    check.
    
    It will only be re-checked in the second call of
    defrag_collect_targets(), which will wait for writeback.
    
    But at that stage we have already spent our time waiting for some IO we
    may or may not want to defrag.
    
    Let's reject such extents early so we won't waste our time.
    
    CC: stable@vger.kernel.org # 5.16
    Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    0d1ffa22
ioctl.c 127 KB