mirror of
https://github.com/brain-hackers/linux-brain.git
synced 2024-06-09 07:16:21 +09:00
fuse: fix copy_file_range cache issues
[ Upstream commit 2c4656dfd994538176db30ce09c02cc0dfc361ae ]
a) Dirty cache needs to be written back not just in the writeback_cache
case, since the dirty pages may come from memory maps.
b) The fuse_writeback_range() helper takes an inclusive interval, so the
end position needs to be pos+len-1 instead of pos+len.
Fixes: 88bc7d5097
("fuse: add support for copy_file_range()")
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
ad7f78b7ce
commit
c9ddb8dd12
|
@ -3280,13 +3280,11 @@ static ssize_t __fuse_copy_file_range(struct file *file_in, loff_t pos_in,
|
|||
if (file_inode(file_in)->i_sb != file_inode(file_out)->i_sb)
|
||||
return -EXDEV;
|
||||
|
||||
if (fc->writeback_cache) {
|
||||
inode_lock(inode_in);
|
||||
err = fuse_writeback_range(inode_in, pos_in, pos_in + len);
|
||||
inode_unlock(inode_in);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
inode_lock(inode_in);
|
||||
err = fuse_writeback_range(inode_in, pos_in, pos_in + len - 1);
|
||||
inode_unlock(inode_in);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
inode_lock(inode_out);
|
||||
|
||||
|
@ -3294,11 +3292,9 @@ static ssize_t __fuse_copy_file_range(struct file *file_in, loff_t pos_in,
|
|||
if (err)
|
||||
goto out;
|
||||
|
||||
if (fc->writeback_cache) {
|
||||
err = fuse_writeback_range(inode_out, pos_out, pos_out + len);
|
||||
if (err)
|
||||
goto out;
|
||||
}
|
||||
err = fuse_writeback_range(inode_out, pos_out, pos_out + len - 1);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
if (is_unstable)
|
||||
set_bit(FUSE_I_SIZE_UNSTABLE, &fi_out->state);
|
||||
|
|
Loading…
Reference in New Issue
Block a user