]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ocfs2: truncate page cache for clone destination file before remapping
authorDarrick J. Wong <darrick.wong@oracle.com>
Mon, 29 Oct 2018 23:42:56 +0000 (10:42 +1100)
committerDave Chinner <david@fromorbit.com>
Mon, 29 Oct 2018 23:42:56 +0000 (10:42 +1100)
When cloning blocks into another file, truncate the page cache before we
start remapping blocks so that concurrent reads wait for us to finish.

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 46bbd315c39f4876f0bb01cf94a7cf15e822a7c4..2a5c96bc9677492e73550c06f006de0072e23c7b 100644 (file)
@@ -4861,14 +4861,12 @@ int ocfs2_reflink_remap_range(struct file *file_in,
                down_write_nested(&OCFS2_I(inode_out)->ip_alloc_sem,
                                  SINGLE_DEPTH_NESTING);
 
-       ret = ocfs2_reflink_remap_blocks(inode_in, in_bh, pos_in, inode_out,
-                                        out_bh, pos_out, len);
-
        /* Zap any page cache for the destination file's range. */
-       if (!ret)
-               truncate_inode_pages_range(&inode_out->i_data, pos_out,
-                                          PAGE_ALIGN(pos_out + len) - 1);
+       truncate_inode_pages_range(&inode_out->i_data, pos_out,
+                                  PAGE_ALIGN(pos_out + len) - 1);
 
+       ret = ocfs2_reflink_remap_blocks(inode_in, in_bh, pos_in, inode_out,
+                                        out_bh, pos_out, len);
        up_write(&OCFS2_I(inode_in)->ip_alloc_sem);
        if (!same_inode)
                up_write(&OCFS2_I(inode_out)->ip_alloc_sem);