• Josef Bacik's avatar
    btrfs: push extent lock down in run_delalloc_nocow · aa56b0aa
    Josef Bacik authored
    run_delalloc_nocow is a little special because we use the file extents
    to see if we can nocow a range.  We don't actually need the protection
    of the extent lock to look at the file extents at this point however.
    We are currently holding the page lock for this range, so we are
    protected from anybody who would simultaneously be modifying the file
    extent items for this range.
    
    * mmap() - we're holding the page lock.
    * buffered writes - we're holding the page lock.
    * direct writes - we're holding the page lock and direct IO has to flush
      page cache before it's able to continue.
    * fallocate() - all callers flush the range and wait on ordered extents
      while holding the inode lock and the mmap lock, so we are again saved
      by the page lock.
    
    We want to use the extent lock to protect
    
    1) The mapping tree for the given range.
    2) The ordered extents for the given range.
    3) The io_tree for the given range.
    
    Push the extent lock down to cover these operations.  In the
    fallback_to_cow() case we simply lock before doing anything and rely on
    the cow_file_range() helper to handle it's range properly.
    Reviewed-by: default avatarGoldwyn Rodrigues <rgoldwyn@suse.com>
    Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    aa56b0aa
inode.c 313 KB