summaryrefslogtreecommitdiff
path: root/fs/btrfs/file.c
diff options
context:
space:
mode:
authorFilipe Manana <fdmanana@suse.com>2022-03-15 15:22:36 +0000
committerDavid Sterba <dsterba@suse.com>2022-05-16 17:03:09 +0200
commit831e1ee60216534c54f2e240f9586d6cfe29b1c2 (patch)
treeb09d3c34a9c16abde410cf6b5da7eb2f638be6a1 /fs/btrfs/file.c
parent47e1d1c7bb35ccf1d327ddcfaf59b268c8770159 (diff)
downloadlwn-831e1ee60216534c54f2e240f9586d6cfe29b1c2.tar.gz
lwn-831e1ee60216534c54f2e240f9586d6cfe29b1c2.zip
btrfs: remove useless dio wait call when doing fallocate zero range
When starting a fallocate zero range operation, before getting the first extent map for the range, we make a call to inode_dio_wait(). This logic was needed in the past because 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 (by commit 9902af79c01a8e ("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 (done in commit e9adabb9712ef9 ("btrfs: use shared lock for direct writes within EOF")). The lockless direct IO writes could result in a race with the zero range operation, resulting in the later getting a stale extent map for the range. So remove this no longer needed call to inode_dio_wait(), as fallocate takes the inode's VFS lock in exclusive mode and direct IO writes within i_size take that same lock in shared mode. Signed-off-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs/btrfs/file.c')
-rw-r--r--fs/btrfs/file.c2
1 files changed, 0 insertions, 2 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index fa7bbcab1a6a..bd638cbb5bda 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -3237,8 +3237,6 @@ static int btrfs_zero_range(struct inode *inode,
u64 bytes_to_reserve = 0;
bool space_reserved = false;
- inode_dio_wait(inode);
-
em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, alloc_start,
alloc_end - alloc_start);
if (IS_ERR(em)) {