• Filipe Manana's avatar
    btrfs: remove ordered extent check and wait during fallocate · ffa8fc60
    Filipe Manana authored
    For fallocate() we have this loop that checks if we have ordered extents
    after locking the file range, and if so unlock the range, wait for ordered
    extents, and retry until we don't find more ordered extents.
    
    This logic was needed in the past because:
    
    1) Direct IO writes within the i_size boundary did not take the inode's
       VFS lock. This was because that lock used to be a mutex, then some
       years ago it was switched to a rw semaphore (commit 9902af79
       ("parallel lookups: actual switch to rwsem")), and then btrfs was
       changed to take the VFS inode's lock in shared mode for writes that
       don't cross the i_size boundary (commit e9adabb9 ("btrfs: use
       shared lock for direct writes within EOF"));
    
    2) We could race with memory mapped writes, because memory mapped writes
       don't acquire the inode's VFS lock. We don't have that race anymore,
       as we have a rw semaphore to synchronize memory mapped writes with
       fallocate (and reflinking too). That change happened with commit
       8d9b4a16 ("btrfs: exclude mmap from happening during all
       fallocate operations").
    
    So stop looking for ordered extents after locking the file range when
    doing a plain fallocate.
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    ffa8fc60
file.c 104 KB