> On 2022/10/25 15:01, zhangqilong wrote: > >> 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-zhang > > qilo...@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. > > Please check the condition how can we run into below else branch. I guess > you need to persist data blocks of src into a checkpoint w/ SYNC(2), then > __clone_blkaddrs() will copy data from page cache directly instead of > exchanging metadatas. >
Thanks for your suggestion, I try it later for this point. If I have any progress, I will notify you immediately. Do you have any suggestion for this patch? :) f2fs: Fix data consistency in f2fs_move_file_range() Thanks, > Thanks, > > > > > > 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