Btrfs: btrfs_ioctl_clone: Truncate complete page after performing clone operation
In subpagesize-blocksize scenario, the "destination offset" argument passed to the btrfs_ioctl_clone() can be aligned to sectorsize but may not be necessarily aligned to the machine's page size. In such cases, truncate_inode_pages_range() ends up zeroing out the partial page and future read operations will return incorrect data. Hence this commit explicitly rounds down the "destination offset" to the machine's page size. Signed-off-by: Chandan Rajendra <chandan@linux.vnet.ibm.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
27772b68f6
commit
65bfa65807
|
@ -3926,8 +3926,9 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,
|
||||||
* Truncate page cache pages so that future reads will see the cloned
|
* Truncate page cache pages so that future reads will see the cloned
|
||||||
* data immediately and not the previous data.
|
* data immediately and not the previous data.
|
||||||
*/
|
*/
|
||||||
truncate_inode_pages_range(&inode->i_data, destoff,
|
truncate_inode_pages_range(&inode->i_data,
|
||||||
PAGE_CACHE_ALIGN(destoff + len) - 1);
|
round_down(destoff, PAGE_CACHE_SIZE),
|
||||||
|
round_up(destoff + len, PAGE_CACHE_SIZE) - 1);
|
||||||
out_unlock:
|
out_unlock:
|
||||||
if (!same_inode)
|
if (!same_inode)
|
||||||
btrfs_double_inode_unlock(src, inode);
|
btrfs_double_inode_unlock(src, inode);
|
||||||
|
|
Loading…
Reference in New Issue