]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
fuse: update inode size after extending passthrough write
authorAmir Goldstein <amir73il@gmail.com>
Mon, 14 Oct 2024 19:27:59 +0000 (21:27 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 1 Nov 2024 01:02:38 +0000 (02:02 +0100)
[ Upstream commit 20121d3f58f06e977ca43eb6efe1fb23b1d2f6d9 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/fuse/passthrough.c

index f0f87d1c9a9454ac684ce69ef60ad81993afc7b8..d1b570d39501cce719928d8a3ed36214070a1c1b 100644 (file)
@@ -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)