summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmir Goldstein <amir73il@gmail.com>2024-10-14 21:27:59 +0200
committerMiklos Szeredi <mszeredi@redhat.com>2024-10-16 13:18:21 +0200
commit20121d3f58f06e977ca43eb6efe1fb23b1d2f6d9 (patch)
tree720ccad8feaf3beb30249a4b1225b6937b15de9c
parentf03b296e8b516dbd63f57fc9056c1b0da1b9a0ff (diff)
downloadlinux-stable-20121d3f58f06e977ca43eb6efe1fb23b1d2f6d9.tar.gz
linux-stable-20121d3f58f06e977ca43eb6efe1fb23b1d2f6d9.tar.bz2
linux-stable-20121d3f58f06e977ca43eb6efe1fb23b1d2f6d9.zip
fuse: update inode size after extending passthrough write
yangyun reported that libfuse test test_copy_file_range() copies zero bytes from a newly written file when fuse passthrough is enabled. The reason is that extending passthrough write is not updating the fuse inode size and when vfs_copy_file_range() observes a zero size inode, it returns without calling the filesystem copy_file_range() method. Fix this by adjusting the fuse inode size after an extending passthrough write. This does not provide cache coherency of fuse inode attributes and backing inode attributes, but it should prevent situations where fuse inode size is too small, causing read/copy to be wrongly shortened. Reported-by: yangyun <yangyun50@huawei.com> Closes: https://github.com/libfuse/libfuse/issues/1048 Fixes: 57e1176e6086 ("fuse: implement read/write passthrough") Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
-rw-r--r--fs/fuse/passthrough.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/fuse/passthrough.c b/fs/fuse/passthrough.c
index e4e92abe1601..7b097e332a90 100644
--- a/fs/fuse/passthrough.c
+++ b/fs/fuse/passthrough.c
@@ -22,7 +22,7 @@ static void fuse_passthrough_end_write(struct file *file, loff_t pos, ssize_t re
{
struct inode *inode = file_inode(file);
- fuse_invalidate_attr_mask(inode, FUSE_STATX_MODSIZE);
+ fuse_write_update_attr(inode, pos, ret);
}
ssize_t fuse_passthrough_read_iter(struct kiocb *iocb, struct iov_iter *iter)