From 33eb3caeacb52a46f808984969c808528d10ee01 Mon Sep 17 00:00:00 2001 From: Amir Goldstein Date: Tue, 5 Dec 2023 06:26:57 +0200 Subject: [PATCH] fs: fix vfs_copy_file_range() for files on same sb copy_file-range() should fallback to splice with two files on same sb that does not implement ->copy_file_range() nor ->remap_file_range(). Fixes: 042e4d9d17ae ("fs: use splice_copy_file_range() inline helper") Reported-by: Bert Karwatzki Signed-off-by: Amir Goldstein --- fs/read_write.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/read_write.c b/fs/read_write.c index e0c2c1b5962b..01a14570015b 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -1514,6 +1514,7 @@ ssize_t vfs_copy_file_range(struct file *file_in, loff_t pos_in, { ssize_t ret; bool splice = flags & COPY_FILE_SPLICE; + bool samesb = file_inode(file_in)->i_sb == file_inode(file_out)->i_sb; if (flags & ~COPY_FILE_SPLICE) return -EINVAL; @@ -1545,8 +1546,7 @@ ssize_t vfs_copy_file_range(struct file *file_in, loff_t pos_in, ret = file_out->f_op->copy_file_range(file_in, pos_in, file_out, pos_out, len, flags); - } else if (!splice && file_in->f_op->remap_file_range && - file_inode(file_in)->i_sb == file_inode(file_out)->i_sb) { + } else if (!splice && file_in->f_op->remap_file_range && samesb) { ret = file_in->f_op->remap_file_range(file_in, pos_in, file_out, pos_out, min_t(loff_t, MAX_RW_COUNT, len), @@ -1554,6 +1554,9 @@ ssize_t vfs_copy_file_range(struct file *file_in, loff_t pos_in, /* fallback to splice */ if (ret <= 0) splice = true; + } else if (samesb) { + /* Fallback to splice for same sb copy for backward compat */ + splice = true; } file_end_write(file_out); -- 2.34.1