summaryrefslogtreecommitdiff
path: root/fs/btrfs/ioctl.c
diff options
context:
space:
mode:
authorRob Herring <robh@kernel.org>2018-12-13 20:20:36 +0300
committerRob Herring <robh@kernel.org>2018-12-13 20:20:36 +0300
commitacc2038738bd6f881e7a277ba14fa7c589fd3058 (patch)
treefd56524867a9b726b3e5d2cb040ff16b2f2a67a0 /fs/btrfs/ioctl.c
parentcd1cc0bef46fc8d8f9ebe82d2064d4f4bd5ecf16 (diff)
parent2c9b0b00af23cdc70d28d82e077dc1d280bcb84a (diff)
downloadlinux-acc2038738bd6f881e7a277ba14fa7c589fd3058.tar.xz
Merge branch 'yaml-bindings-for-v4.21' into dt/next
Diffstat (limited to 'fs/btrfs/ioctl.c')
-rw-r--r--fs/btrfs/ioctl.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 3ca6943827ef..802a628e9f7d 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -3488,6 +3488,8 @@ static int btrfs_extent_same_range(struct inode *src, u64 loff, u64 olen,
const u64 sz = BTRFS_I(src)->root->fs_info->sectorsize;
len = round_down(i_size_read(src), sz) - loff;
+ if (len == 0)
+ return 0;
olen = len;
}
}
@@ -4257,9 +4259,17 @@ static noinline int btrfs_clone_files(struct file *file, struct file *file_src,
goto out_unlock;
if (len == 0)
olen = len = src->i_size - off;
- /* if we extend to eof, continue to block boundary */
- if (off + len == src->i_size)
+ /*
+ * If we extend to eof, continue to block boundary if and only if the
+ * destination end offset matches the destination file's size, otherwise
+ * we would be corrupting data by placing the eof block into the middle
+ * of a file.
+ */
+ if (off + len == src->i_size) {
+ if (!IS_ALIGNED(len, bs) && destoff + len < inode->i_size)
+ goto out_unlock;
len = ALIGN(src->i_size, bs) - off;
+ }
if (len == 0) {
ret = 0;