summaryrefslogtreecommitdiff
path: root/fs/btrfs/file.c
diff options
context:
space:
mode:
authorDavid Sterba <dsterba@suse.com>2020-06-09 20:56:06 +0300
committerDavid Sterba <dsterba@suse.com>2020-06-14 02:19:02 +0300
commit55e20bd12a56e06c38b953177bb162cbbaa96004 (patch)
treeb19873031657b8f2c5870cfbc683c67c29547733 /fs/btrfs/file.c
parentf1084bc60a1ec592011a805a0f925f2f1205897d (diff)
downloadlinux-55e20bd12a56e06c38b953177bb162cbbaa96004.tar.xz
Revert "btrfs: switch to iomap_dio_rw() for dio"
This reverts commit a43a67a2d715540c1368b9501a22b0373b5874c0. This patch reverts the main part of switching direct io implementation to iomap infrastructure. There's a problem in invalidate page that couldn't be solved as regression in this development cycle. The problem occurs when buffered and direct io are mixed, and the ranges overlap. Although this is not recommended, filesystems implement measures or fallbacks to make it somehow work. In this case, fallback to buffered IO would be an option for btrfs (this already happens when direct io is done on compressed data), but the change would be needed in the iomap code, bringing new semantics to other filesystems. Another problem arises when again the buffered and direct ios are mixed, invalidation fails, then -EIO is set on the mapping and fsync will fail, though there's no real error. There have been discussions how to fix that, but revert seems to be the least intrusive option. Link: https://lore.kernel.org/linux-btrfs/20200528192103.xm45qoxqmkw7i5yl@fiona/ Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs/btrfs/file.c')
-rw-r--r--fs/btrfs/file.c21
1 files changed, 2 insertions, 19 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index dff89d04fd16..2c14312b05e8 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -1819,7 +1819,7 @@ static ssize_t __btrfs_direct_write(struct kiocb *iocb, struct iov_iter *from)
loff_t endbyte;
int err;
- written = btrfs_direct_IO(iocb, from);
+ written = generic_file_direct_write(iocb, from);
if (written < 0 || !iov_iter_count(from))
return written;
@@ -3476,26 +3476,9 @@ static int btrfs_file_open(struct inode *inode, struct file *filp)
return generic_file_open(inode, filp);
}
-static ssize_t btrfs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
-{
- ssize_t ret = 0;
-
- if (iocb->ki_flags & IOCB_DIRECT) {
- struct inode *inode = file_inode(iocb->ki_filp);
-
- inode_lock_shared(inode);
- ret = btrfs_direct_IO(iocb, to);
- inode_unlock_shared(inode);
- if (ret < 0)
- return ret;
- }
-
- return generic_file_buffered_read(iocb, to, ret);
-}
-
const struct file_operations btrfs_file_operations = {
.llseek = btrfs_file_llseek,
- .read_iter = btrfs_file_read_iter,
+ .read_iter = generic_file_read_iter,
.splice_read = generic_file_splice_read,
.write_iter = btrfs_file_write_iter,
.mmap = btrfs_file_mmap,