From: Darrick J. Wong <darrick.w...@oracle.com>

Plumb a remap_flags argument through the vfs_dedupe_file_range_one
functions so that dedupe can take advantage of it.

Signed-off-by: Darrick J. Wong <darrick.w...@oracle.com>
Reviewed-by: Amir Goldstein <amir7...@gmail.com>
---
 fs/overlayfs/file.c |    3 ++-
 fs/read_write.c     |    9 ++++++---
 include/linux/fs.h  |    2 +-
 3 files changed, 9 insertions(+), 5 deletions(-)


diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c
index e5cc17281d0b..8f7a162768f2 100644
--- a/fs/overlayfs/file.c
+++ b/fs/overlayfs/file.c
@@ -467,7 +467,8 @@ static loff_t ovl_copyfile(struct file *file_in, loff_t 
pos_in,
 
        case OVL_DEDUPE:
                ret = vfs_dedupe_file_range_one(real_in.file, pos_in,
-                                               real_out.file, pos_out, len);
+                                               real_out.file, pos_out, len,
+                                               flags);
                break;
        }
        revert_creds(old_cred);
diff --git a/fs/read_write.c b/fs/read_write.c
index 30076ed38091..81e0f969da59 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -1999,10 +1999,12 @@ EXPORT_SYMBOL(vfs_dedupe_file_range_compare);
 
 loff_t vfs_dedupe_file_range_one(struct file *src_file, loff_t src_pos,
                                 struct file *dst_file, loff_t dst_pos,
-                                loff_t len)
+                                loff_t len, unsigned int remap_flags)
 {
        loff_t ret;
 
+       WARN_ON_ONCE(remap_flags & ~(RFR_SAME_DATA));
+
        ret = mnt_want_write_file(dst_file);
        if (ret)
                return ret;
@@ -2033,7 +2035,7 @@ loff_t vfs_dedupe_file_range_one(struct file *src_file, 
loff_t src_pos,
        }
 
        ret = dst_file->f_op->remap_file_range(src_file, src_pos, dst_file,
-                       dst_pos, len, RFR_SAME_DATA);
+                       dst_pos, len, remap_flags | RFR_SAME_DATA);
 out_drop_write:
        mnt_drop_write_file(dst_file);
 
@@ -2101,7 +2103,8 @@ int vfs_dedupe_file_range(struct file *file, struct 
file_dedupe_range *same)
                }
 
                deduped = vfs_dedupe_file_range_one(file, off, dst_file,
-                                                   info->dest_offset, len);
+                                                   info->dest_offset, len,
+                                                   0);
                if (deduped == -EBADE)
                        info->status = FILE_DEDUPE_RANGE_DIFFERS;
                else if (deduped < 0)
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 4acda4809027..d77b8d90d65e 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1863,7 +1863,7 @@ extern int vfs_dedupe_file_range(struct file *file,
                                 struct file_dedupe_range *same);
 extern loff_t vfs_dedupe_file_range_one(struct file *src_file, loff_t src_pos,
                                        struct file *dst_file, loff_t dst_pos,
-                                       loff_t len);
+                                       loff_t len, unsigned int remap_flags);
 
 
 struct super_operations {

Reply via email to