aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFan Li <fanofcode.li@samsung.com>2016-09-13 11:35:42 +0800
committerMister Oyster <oysterized@gmail.com>2017-04-13 12:34:06 +0200
commitfd248c1dae681b080256d47d33d6972eef6d136f (patch)
treedd359e58d9ccf2802933ebbfbe71386ff4ce05b6
parent3eab33320d8b83fdc9e315798380a37cc5dabbfd (diff)
f2fs: exclude special cases for f2fs_move_file_range
When src and dst is the same file, and the latter part of source region overlaps with the former part of destination region, current implement will overwrite data which hasn't been moved yet and truncate data in overlapped region. This patch return -EINVAL when such cases occur and return 0 when source region and destination region is actually the same part of the same file. Signed-off-by: Fan li <fanofcode.li@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r--fs/f2fs/file.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 63ab819fe..5a184f322 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -2121,6 +2121,13 @@ static int f2fs_move_file_range(struct file *file_in, loff_t pos_in,
if (f2fs_encrypted_inode(src) || f2fs_encrypted_inode(dst))
return -EOPNOTSUPP;
+ if (src == dst) {
+ if (pos_in == pos_out)
+ return 0;
+ if (pos_out > pos_in && pos_out < pos_in + len)
+ return -EINVAL;
+ }
+
inode_lock(src);
if (src != dst)
inode_lock(dst);