On 2019/1/24 20:57, zhengliang wrote:
> 
> The following race could lead to data block override node segment by mistake.
> 
> Task A            |    Task B         |  Task C            |    Task D
> =======           |   ========        |==========          |  =========
> open file         |                   |                    |
> white file        |                   |                    |
> submit bio        |                   |                    |
> wait io complete  |                   |                    |
>                 |   remove file     |                    |
> ........          |   iput_final      |                    |
>                 |                   |   sync             |
>                 |                   |  do checkpoint     |
>                 |                   |  data segment free |
>                 |                   |                    | create file1
>                 |                   |                    | allocate node 
> segment(if it is the same segment freed by Task C)
> f2fs_write_end_io |                 |                    |                    
>                                         
> 
> So we need to guarantee io complete before truncate inode
> in f2fs_drop_inode.
> 
> v1->v2: It don't need to pass @ino in f2fs_submit_merged_write_cond .

Hi Liang,

Could you slightly change race condition description above as Sheng Yong's one?

Thanks,

> 
> Signed-off-by: Zheng Liang <zhenglia...@huawei.com>
> --------
> diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
> index c46a1d43..60f0599 100644
> --- a/fs/f2fs/super.c
> +++ b/fs/f2fs/super.c
> @@ -915,6 +915,10 @@ static int f2fs_drop_inode(struct inode *inode)
>                         sb_start_intwrite(inode->i_sb);
>                         f2fs_i_size_write(inode, 0);
> 
> +                       f2fs_submit_merged_write_cond(F2FS_I_SB(inode),
> +                                       inode, NULL, 0, DATA);
> +                       truncate_inode_pages_final(inode->i_mapping);
> +
>                         if (F2FS_HAS_BLOCKS(inode))
>                                 f2fs_truncate(inode);
> 
> 
> .
> 



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to