Message ID | 20230504185238.19488-1-frank.li@vivo.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [f2fs-dev] f2fs: fix to call invalidate_mapping_pages in f2fs_move_file_range | expand |
On 2023/5/5 2:52, Yangtao Li wrote: > In the following scenario, after executing the move_range ioctl syscall, > the block size of the source file is 0, but data can still be read. > > # stat test > File: test > Size: 6 Blocks: 8 IO Block: 4096 regular file > # ./new_f2fs_io move_range test test_move_range 0 0 0 > move range ret=0 > # stat test > File: test > Size: 6 Blocks: 0 IO Block: 4096 regular file > # cat test > nihao > > Let's fix to call invalidate_mapping_pages() after __exchange_data_block() > success. > > Fixes: 4dd6f977fc77 ("f2fs: support an ioctl to move a range of data blocks") > Signed-off-by: Yangtao Li <frank.li@vivo.com> > --- > fs/f2fs/file.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c > index 78aa8cff4b41..ae7752c5cd0a 100644 > --- a/fs/f2fs/file.c > +++ b/fs/f2fs/file.c > @@ -2870,6 +2870,9 @@ static int f2fs_move_file_range(struct file *file_in, loff_t pos_in, > f2fs_i_size_write(dst, dst_max_i_size); > else if (dst_osize != dst->i_size) > f2fs_i_size_write(dst, dst_osize); > + > + invalidate_mapping_pages(src->i_mapping, > + pos_out, pos_in + len); It needs to consider error cases? Should we call this to drop page cache of src_inode after __clone_blkaddrs() for each round exchange in __exchange_data_block()? and also drop page cache of dst_indoe in roll_back case? Thanks, > } > f2fs_unlock_op(sbi); >
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 78aa8cff4b41..ae7752c5cd0a 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -2870,6 +2870,9 @@ static int f2fs_move_file_range(struct file *file_in, loff_t pos_in, f2fs_i_size_write(dst, dst_max_i_size); else if (dst_osize != dst->i_size) f2fs_i_size_write(dst, dst_osize); + + invalidate_mapping_pages(src->i_mapping, + pos_out, pos_in + len); } f2fs_unlock_op(sbi);
In the following scenario, after executing the move_range ioctl syscall, the block size of the source file is 0, but data can still be read. # stat test File: test Size: 6 Blocks: 8 IO Block: 4096 regular file # ./new_f2fs_io move_range test test_move_range 0 0 0 move range ret=0 # stat test File: test Size: 6 Blocks: 0 IO Block: 4096 regular file # cat test nihao Let's fix to call invalidate_mapping_pages() after __exchange_data_block() success. Fixes: 4dd6f977fc77 ("f2fs: support an ioctl to move a range of data blocks") Signed-off-by: Yangtao Li <frank.li@vivo.com> --- fs/f2fs/file.c | 3 +++ 1 file changed, 3 insertions(+)