Hi all,

Please ignore this patch, I just sent this before, sorry.

Thanks,

On 2018/4/18 17:45, Chao Yu wrote:
> Thread                                        GC thread
> - f2fs_ioc_start_atomic_write
>  - get_dirty_pages
>  - filemap_write_and_wait_range
>                                       - f2fs_gc
>                                        - do_garbage_collect
>                                         - gc_data_segment
>                                          - move_data_page
>                                           - f2fs_is_atomic_file
>                                           - set_page_dirty
>  - set_inode_flag(, FI_ATOMIC_FILE)
> 
> Dirty data page can still be generated by GC in race condition as
> above call stack.
> 
> This patch adds fi->dio_rwsem[WRITE] in f2fs_ioc_start_atomic_write
> to avoid such race.
> 
> Signed-off-by: Chao Yu <yuch...@huawei.com>
> ---
>  fs/f2fs/file.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
> index 78b3a58cfe21..408471bf4799 100644
> --- a/fs/f2fs/file.c
> +++ b/fs/f2fs/file.c
> @@ -1677,6 +1677,8 @@ static int f2fs_ioc_start_atomic_write(struct file 
> *filp)
>  
>       inode_lock(inode);
>  
> +     down_write(&F2FS_I(inode)->dio_rwsem[WRITE]);
> +
>       if (f2fs_is_atomic_file(inode))
>               goto out;
>  
> @@ -1702,6 +1704,7 @@ static int f2fs_ioc_start_atomic_write(struct file 
> *filp)
>       stat_inc_atomic_write(inode);
>       stat_update_max_atomic_write(inode);
>  out:
> +     up_write(&F2FS_I(inode)->dio_rwsem[WRITE]);
>       inode_unlock(inode);
>       mnt_drop_write_file(filp);
>       return ret;
> 

Reply via email to