]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ocfs2: fix pagecache truncation prior to reflink
authorDarrick J. Wong <darrick.wong@oracle.com>
Mon, 29 Oct 2018 23:43:16 +0000 (10:43 +1100)
committerDave Chinner <david@fromorbit.com>
Mon, 29 Oct 2018 23:43:16 +0000 (10:43 +1100)
Prior to remapping blocks, it is necessary to remove pages from the
destination file's page cache.  Unfortunately, the truncation is not
aggressive enough -- if page size > block size, we'll end up zeroing
subpage blocks instead of removing them.  So, round the start offset
down and the end offset up to page boundaries.  We already wrote all
the dirty data so the larger range should be fine.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/ocfs2/refcounttree.c

index 2a5c96bc9677492e73550c06f006de0072e23c7b..7c709229e1084c0117dd62582b773658b84775e0 100644 (file)
@@ -4862,8 +4862,9 @@ int ocfs2_reflink_remap_range(struct file *file_in,
                                  SINGLE_DEPTH_NESTING);
 
        /* Zap any page cache for the destination file's range. */
-       truncate_inode_pages_range(&inode_out->i_data, pos_out,
-                                  PAGE_ALIGN(pos_out + len) - 1);
+       truncate_inode_pages_range(&inode_out->i_data,
+                                  round_down(pos_out, PAGE_SIZE),
+                                  round_up(pos_out + len, PAGE_SIZE) - 1);
 
        ret = ocfs2_reflink_remap_blocks(inode_in, in_bh, pos_in, inode_out,
                                         out_bh, pos_out, len);