diff options
author | Chao Yu <yuchao0@huawei.com> | 2018-06-04 23:20:51 +0800 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2018-06-04 14:33:27 -0700 |
commit | dfa742803fbbd8b82790c152600e09c5ad99caca (patch) | |
tree | 59a2825a37a0c70f9112515d5480d7ffe26ad907 /fs/f2fs | |
parent | c29fd0c0e26dacb7a33ad166587059818a94b4e0 (diff) | |
download | linux-stable-dfa742803fbbd8b82790c152600e09c5ad99caca.tar.gz linux-stable-dfa742803fbbd8b82790c152600e09c5ad99caca.tar.bz2 linux-stable-dfa742803fbbd8b82790c152600e09c5ad99caca.zip |
f2fs: fix to clear FI_VOLATILE_FILE correctly
Thread A Thread B
- f2fs_release_file
- clear_inode_flag(FI_VOLATILE_FILE)
- wb_writeback
- writeback_sb_inodes
- __writeback_single_inode
- do_writepages
- f2fs_write_data_pages
- __write_data_page
all volatile file's pages
are writebacked to storage
- set_inode_flag(FI_DROP_CACHE)
- filemap_fdatawrite
There is a hole that mm can flush all dirty pages of volatile file as
inode is not tagged with both FI_VOLATILE_FILE and FI_DROP_CACHE flags,
we should never writeback the page #0 and also it's unneeded to writeback
other pages.
This patch adjusts to relocate clear_inode_flag(FI_VOLATILE_FILE), so that
FI_VOLATILE_FILE flag can be remained before all dirty pages were dropped
to avoid issue.
Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs')
-rw-r--r-- | fs/f2fs/file.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 16fd50abbf40..13f2f6845e87 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -1564,11 +1564,11 @@ static int f2fs_release_file(struct inode *inode, struct file *filp) if (f2fs_is_atomic_file(inode)) f2fs_drop_inmem_pages(inode); if (f2fs_is_volatile_file(inode)) { - clear_inode_flag(inode, FI_VOLATILE_FILE); - stat_dec_volatile_write(inode); set_inode_flag(inode, FI_DROP_CACHE); filemap_fdatawrite(inode->i_mapping); clear_inode_flag(inode, FI_DROP_CACHE); + clear_inode_flag(inode, FI_VOLATILE_FILE); + stat_dec_volatile_write(inode); } return 0; } |