• Nikolay Borisov's avatar
    btrfs: Don't discard unwritten extents · 4eaaec24
    Nikolay Borisov authored
    All callers of btrfs_free_reserved_extent (respectively
    __btrfs_free_reserved_extent with in set to 0) pass in extents which
    have only been reserved but not yet written to. Namely,
    
    * in cow_file_range that function is called only if create_io_em fails
      or btrfs_add_ordered_extent fail, both of which happen _before_ any IO
      is submitted to the newly reserved range
    
    * in submit_compressed_extents the code flow is similar -
      out_free_reserve can be called only before
      btrfs_submit_compressed_write which is where any writes to the range
      could occur
    
    * btrfs_new_extent_direct also calls btrfs_free_reserved_extent only
      if extent_map fails, before any IO is issued
    
    * __btrfs_prealloc_file_range also calls btrfs_free_reserved_extent
      in case insertion of the metadata fails
    
    * btrfs_alloc_tree_block again can only be called in case in-memory
      operations fail, before any IO is submitted
    
    * btrfs_finish_ordered_io - this is the only caller where discarding
      the extent could have a material effect, since it can be called for
      an extent which was partially written.
    
    With this change the submission of discards is optimised since discards
    are now not being created for extents which are known to not have been
    touched on disk.
    Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarNikolay Borisov <nborisov@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    4eaaec24
inode.c 300 KB