aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <darrick.wong@oracle.com>2018-10-29 19:42:03 -0400
committerDave Chinner <david@fromorbit.com>2018-10-29 19:42:03 -0400
commitdf3658361951e17364f1e1c3fa92862a990ad8bd (patch)
tree6a8654d7e37881b951eab42f3b28cf90b9a68766
parent452ce65951a2f0719e4e119ecca134c06cfe22ee (diff)
vfs: plumb remap flags through the vfs dedupe functions
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.wong@oracle.com> Reviewed-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
-rw-r--r--fs/overlayfs/file.c3
-rw-r--r--fs/read_write.c9
-rw-r--r--include/linux/fs.h2
3 files changed, 9 insertions, 5 deletions
diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c
index 0393815c8971..84dd957efa24 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,
467 467
468 case OVL_DEDUPE: 468 case OVL_DEDUPE:
469 ret = vfs_dedupe_file_range_one(real_in.file, pos_in, 469 ret = vfs_dedupe_file_range_one(real_in.file, pos_in,
470 real_out.file, pos_out, len); 470 real_out.file, pos_out, len,
471 flags);
471 break; 472 break;
472 } 473 }
473 revert_creds(old_cred); 474 revert_creds(old_cred);
diff --git a/fs/read_write.c b/fs/read_write.c
index 0d1ac1b9bc22..ea30666013b0 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -2010,10 +2010,12 @@ EXPORT_SYMBOL(vfs_dedupe_file_range_compare);
2010 2010
2011loff_t vfs_dedupe_file_range_one(struct file *src_file, loff_t src_pos, 2011loff_t vfs_dedupe_file_range_one(struct file *src_file, loff_t src_pos,
2012 struct file *dst_file, loff_t dst_pos, 2012 struct file *dst_file, loff_t dst_pos,
2013 loff_t len) 2013 loff_t len, unsigned int remap_flags)
2014{ 2014{
2015 loff_t ret; 2015 loff_t ret;
2016 2016
2017 WARN_ON_ONCE(remap_flags & ~(REMAP_FILE_DEDUP));
2018
2017 ret = mnt_want_write_file(dst_file); 2019 ret = mnt_want_write_file(dst_file);
2018 if (ret) 2020 if (ret)
2019 return ret; 2021 return ret;
@@ -2044,7 +2046,7 @@ loff_t vfs_dedupe_file_range_one(struct file *src_file, loff_t src_pos,
2044 } 2046 }
2045 2047
2046 ret = dst_file->f_op->remap_file_range(src_file, src_pos, dst_file, 2048 ret = dst_file->f_op->remap_file_range(src_file, src_pos, dst_file,
2047 dst_pos, len, REMAP_FILE_DEDUP); 2049 dst_pos, len, remap_flags | REMAP_FILE_DEDUP);
2048out_drop_write: 2050out_drop_write:
2049 mnt_drop_write_file(dst_file); 2051 mnt_drop_write_file(dst_file);
2050 2052
@@ -2112,7 +2114,8 @@ int vfs_dedupe_file_range(struct file *file, struct file_dedupe_range *same)
2112 } 2114 }
2113 2115
2114 deduped = vfs_dedupe_file_range_one(file, off, dst_file, 2116 deduped = vfs_dedupe_file_range_one(file, off, dst_file,
2115 info->dest_offset, len); 2117 info->dest_offset, len,
2118 0);
2116 if (deduped == -EBADE) 2119 if (deduped == -EBADE)
2117 info->status = FILE_DEDUPE_RANGE_DIFFERS; 2120 info->status = FILE_DEDUPE_RANGE_DIFFERS;
2118 else if (deduped < 0) 2121 else if (deduped < 0)
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 1c5e55d2a67d..544ab5083b48 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1859,7 +1859,7 @@ extern int vfs_dedupe_file_range(struct file *file,
1859 struct file_dedupe_range *same); 1859 struct file_dedupe_range *same);
1860extern loff_t vfs_dedupe_file_range_one(struct file *src_file, loff_t src_pos, 1860extern loff_t vfs_dedupe_file_range_one(struct file *src_file, loff_t src_pos,
1861 struct file *dst_file, loff_t dst_pos, 1861 struct file *dst_file, loff_t dst_pos,
1862 loff_t len); 1862 loff_t len, unsigned int remap_flags);
1863 1863
1864 1864
1865struct super_operations { 1865struct super_operations {