Re: [PATCH 1/5] f2fs: fix race in between GC and atomic open

From: Chao Yu
Date: Wed Apr 18 2018 - 05:53:31 EST


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 <yuchao0@xxxxxxxxxx>
> ---
> 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;
>