summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChao Yu <yuchao0@huawei.com>2018-04-17 17:51:28 +0800
committerJaegeuk Kim <jaegeuk@kernel.org>2018-05-31 11:31:46 -0700
commit27319ba4044c0c67d62ae39e53c0118c89f0a029 (patch)
treed87c4e0a30ee43eb9219bc18403f359d07d737fd
parentea4d479bb3603726128a06fe8f127a191f1c8a68 (diff)
downloadlinux-27319ba4044c0c67d62ae39e53c0118c89f0a029.tar.gz
linux-27319ba4044c0c67d62ae39e53c0118c89f0a029.tar.bz2
linux-27319ba4044c0c67d62ae39e53c0118c89f0a029.zip
f2fs: fix race in between GC and atomic open
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@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r--fs/f2fs/file.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index f639b5fcd66f..18be18907529 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;
@@ -1706,6 +1708,7 @@ inc_stat:
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;