• Qu Wenruo's avatar
    btrfs: rework the order of btrfs_ordered_extent::flags · 3c198fe0
    Qu Wenruo authored
    [BUG]
    There is a long existing bug in the last parameter of
    btrfs_add_ordered_extent(), in commit 771ed689 ("Btrfs: Optimize
    compressed writeback and reads") back to 2008.
    
    In that ancient commit btrfs_add_ordered_extent() expects the @type
    parameter to be one of the following:
    
    - BTRFS_ORDERED_REGULAR
    - BTRFS_ORDERED_NOCOW
    - BTRFS_ORDERED_PREALLOC
    - BTRFS_ORDERED_COMPRESSED
    
    But we pass 0 in cow_file_range(), which means BTRFS_ORDERED_IO_DONE.
    
    Ironically extra check in __btrfs_add_ordered_extent() won't set the bit
    if we see (type == IO_DONE || type == IO_COMPLETE), and avoid any
    obvious bug.
    
    But this still leads to regular COW ordered extent having no bit to
    indicate its type in various trace events, rendering REGULAR bit
    useless.
    
    [FIX]
    Change the following aspects to avoid such problem:
    
    - Reorder btrfs_ordered_extent::flags
      Now the type bits go first (REGULAR/NOCOW/PREALLCO/COMPRESSED), then
      DIRECT bit, finally extra status bits like IO_DONE/COMPLETE/IOERR.
    
    - Add extra ASSERT() for btrfs_add_ordered_extent_*()
    
    - Remove @type parameter for btrfs_add_ordered_extent_compress()
      As the only valid @type here is BTRFS_ORDERED_COMPRESSED.
    
    - Remove the unnecessary special check for IO_DONE/COMPLETE in
      __btrfs_add_ordered_extent()
      This is just to make the code work, with extra ASSERT(), there are
      limited values can be passed in.
    Reviewed-by: default avatarNikolay Borisov <nborisov@suse.com>
    Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    3c198fe0
btrfs.h 56.8 KB