> On 2022/10/25 14:27, zhangqilong wrote: > >> On 2022/10/20 15:27, zhangqilong via Linux-f2fs-devel wrote: > >>>> On 2022/10/18 10:45, Zhang Qilong wrote: > >>>>> In the following case: > >>>>> process 1 process 2 > >>>>> ->open A > >>>>> ->mmap > >>>>> ->read # the first time > >>>>> ->ioctl w/h F2FS_IOC_MOVE_RANGE > >>>>> # (range A->B) > >>>>> ->read # the second time > >>>> > >>>> How about checking B as well? Previous mapped data can still be > >>>> accessed after F2FS_IOC_MOVE_RANGE? > >>>> > >>> > >>> Hi > >>> > >>> I have checked B as well. Previous mapped data can't be accessed > >>> after F2FS_IOC_MOVE_RANGE. > >> > >> I doubt that we didn't call flush_dcache_page() in below branch, so > >> user may see stall data after F2FS_IOC_MOVE_RANGE? Am I missing > something? > >> > > > > Hi, > > > > You are right, it needs flush_dcache_page, but it is unnecessary here, > > the __clone_blkaddrs() is called by FALLOC_FL_COLLAPSE_RANGE/ > FALLOC_FL_INSERT_RANGE /F2FS_IOC_MOVE_RANGE. > > ->__exchange_data_block() > > ->__clone_blkaddrs() > > > > f2fs_do_collapse() and f2fs_insert_range() have truncate_pagecache > > after __exchange_data_block() It seem we have analyzed before. So we > only need to add a truncate operation for F2FS_IOC_MOVE_RANGE. > > I mean it needs to call truncate_pagecache_range(dst, ...) in > f2fs_move_file_range() as well, right?
Yes, I think it should call truncate_pagecache_range(dst, ...) or flush_dcache_page() here. I submitted a patch before, it seems to be forgetten. https://lore.kernel.org/linux-f2fs-devel/20220825024102.120651-1-zhangqilo...@huawei.com/ But, I test it w/o truncate_pagecache_range(dst, ...) or flush_dcache_page(), user can not see stall dst data, maybe It is a bit difficult to construct the scene for me. Thanks, > > Thanks, > > > > >> __clone_blkaddrs() > >> { > >> ... > >> } else { > >> struct page *psrc, *pdst; > >> > >> psrc = f2fs_get_lock_data_page(src_inode, > >> src + i, true); > >> if (IS_ERR(psrc)) > >> return PTR_ERR(psrc); > >> pdst = f2fs_get_new_data_page(dst_inode, NULL, > dst + i, > >> true); > >> if (IS_ERR(pdst)) { > >> f2fs_put_page(psrc, 1); > >> return PTR_ERR(pdst); > >> } > >> memcpy_page(pdst, 0, psrc, 0, PAGE_SIZE); > >> set_page_dirty(pdst); > >> f2fs_put_page(pdst, 1); > >> f2fs_put_page(psrc, 1); > >> > >> ret = f2fs_truncate_hole(src_inode, > >> src + i, src + i + 1); > >> if (ret) > >> return ret; > >> i++; > >> } > >> ... > >> } > >> > >> Thanks, > >> > >>> > >>> In addition, this patch could be applied to mainline if possible? > >>> > >>> Thanks > >>> > >>>> Thanks, > >>>> > >>>>> > >>>>> We will read old data at the second time. The root cause is that > >>>>> user still can see the previous source data after being moved. We > >>>>> fix it by adding truncating after __exchange_data_block. > >>>>> > >>>>> Fixes: 4dd6f977fc77 ("f2fs: support an ioctl to move a range of > >>>>> data > >>>>> blocks") > >>>>> Signed-off-by: Zhang Qilong <zhangqilo...@huawei.com> > >>>>> --- > >>>>> v2: > >>>>> - moving truncating to the range of f2fs_lock_op() > >>>>> > >>>>> v3: > >>>>> - modify the title and commit message > >>>>> --- > >>>>> fs/f2fs/file.c | 3 +++ > >>>>> 1 file changed, 3 insertions(+) > >>>>> > >>>>> diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index > >>>>> 82cda1258227..e9dfa41baf9e 100644 > >>>>> --- a/fs/f2fs/file.c > >>>>> +++ b/fs/f2fs/file.c > >>>>> @@ -2824,6 +2824,7 @@ static int f2fs_move_file_range(struct file > >>>>> *file_in, > >>>> loff_t pos_in, > >>>>> goto out_src; > >>>>> } > >>>>> > >>>>> + filemap_invalidate_lock(src->i_mapping); > >>>>> f2fs_lock_op(sbi); > >>>>> ret = __exchange_data_block(src, dst, pos_in >> > F2FS_BLKSIZE_BITS, > >>>>> pos_out >> F2FS_BLKSIZE_BITS, @@ > -2835,7 > >> +2836,9 @@ static > >>>>> int f2fs_move_file_range(struct file *file_in, > >>>> loff_t pos_in, > >>>>> else if (dst_osize != dst->i_size) > >>>>> f2fs_i_size_write(dst, dst_osize); > >>>>> } > >>>>> + truncate_pagecache_range(src, pos_in, pos_in + len - 1); > >>>>> f2fs_unlock_op(sbi); > >>>>> + filemap_invalidate_unlock(src->i_mapping); > >>>>> > >>>>> if (src != dst) > >>>>> f2fs_up_write(&F2FS_I(dst)->i_gc_rwsem[WRITE]); > >>> > >>> _______________________________________________ > >>> Linux-f2fs-devel mailing list > >>> Linux-f2fs-devel@lists.sourceforge.net > >>> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel