]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
f2fs: exclude special cases for f2fs_move_file_range
authorFan Li <fanofcode.li@samsung.com>
Tue, 13 Sep 2016 03:35:42 +0000 (11:35 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Wed, 14 Sep 2016 23:52:06 +0000 (16:52 -0700)
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>
fs/f2fs/file.c

index 40fe72e5147cbde16e8ffd622e30f8bfafd54f94..d400380a8630c619de8a44071a06e71d6ab0617a 100644 (file)
@@ -2092,6 +2092,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) {
                if (!inode_trylock(dst)) {