If move file range success, it should remove old data from src and dst page cache.
Signed-off-by: Yunlei He <heyun...@oppo.com> --- v2: -truncate pages with filemap invalidate lock -should drop extent cache fs/f2fs/file.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 5af7e57b6140..7b3b333f96f5 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -2869,7 +2869,13 @@ static int f2fs_move_file_range(struct file *file_in, loff_t pos_in, goto out_src; } + filemap_invalidate_lock_two(src->i_mapping, dst->i_mapping); + truncate_pagecache_range(src, pos_in, pos_in + len - 1); + truncate_pagecache_range(dst, pos_out, pos_out + len - 1); + f2fs_lock_op(sbi); + f2fs_drop_extent_tree(src); + f2fs_drop_extent_tree(dst); ret = __exchange_data_block(src, dst, pos_in >> F2FS_BLKSIZE_BITS, pos_out >> F2FS_BLKSIZE_BITS, len >> F2FS_BLKSIZE_BITS, false); @@ -2881,14 +2887,24 @@ static int f2fs_move_file_range(struct file *file_in, loff_t pos_in, f2fs_i_size_write(dst, dst_osize); } f2fs_unlock_op(sbi); + filemap_invalidate_unlock_two(src->i_mapping, dst->i_mapping); if (src != dst) f2fs_up_write(&F2FS_I(dst)->i_gc_rwsem[WRITE]); out_src: f2fs_up_write(&F2FS_I(src)->i_gc_rwsem[WRITE]); + if (ret) goto out_unlock; + /* write out all moved pages, if possible */ + filemap_invalidate_lock_two(src->i_mapping, dst->i_mapping); + filemap_write_and_wait_range(dst->i_mapping, + pos_out, pos_out + len); + truncate_pagecache_range(dst, pos_out, pos_out + len - 1); + truncate_pagecache_range(src, pos_in, pos_in + len - 1); + filemap_invalidate_unlock_two(src->i_mapping, dst->i_mapping); + src->i_mtime = src->i_ctime = current_time(src); f2fs_mark_inode_dirty_sync(src, false); if (src != dst) { -- 2.40.1 _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel