btrfs: Check if dest_offset is block-size aligned before cloning file
We've done the check for src_offset and src_length, and We should also check dest_offset, otherwise we'll corrupt the destination file: (After cloning file1 to file2 with unaligned dest_offset) # cat /mnt/file2 cat: /mnt/file2: Input/output error Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
parent
0de90876c6
commit
2a6b8daeda
|
@ -1669,12 +1669,11 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,
|
|||
olen = len = src->i_size - off;
|
||||
/* if we extend to eof, continue to block boundary */
|
||||
if (off + len == src->i_size)
|
||||
len = ((src->i_size + bs-1) & ~(bs-1))
|
||||
- off;
|
||||
len = ALIGN(src->i_size, bs) - off;
|
||||
|
||||
/* verify the end result is block aligned */
|
||||
if ((off & (bs-1)) ||
|
||||
((off + len) & (bs-1)))
|
||||
if (!IS_ALIGNED(off, bs) || !IS_ALIGNED(off + len, bs) ||
|
||||
!IS_ALIGNED(destoff, bs))
|
||||
goto out_unlock;
|
||||
|
||||
/* do any pending delalloc/csum calc on src, one way or
|
||||
|
|
Loading…
Reference in New Issue