]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
f2fs: fix to clear FI_VOLATILE_FILE correctly
authorChao Yu <yuchao0@huawei.com>
Mon, 4 Jun 2018 15:20:51 +0000 (23:20 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Mon, 4 Jun 2018 21:33:27 +0000 (14:33 -0700)
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>
fs/f2fs/file.c

index 16fd50abbf40648a39e860a28f5190284c98c3f3..13f2f6845e87f8c0d24ed4cfd9c916be2b4d536a 100644 (file)
@@ -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;
 }