f2fs: count dirty inodes to flush node pages during checkpoint
authorJaegeuk Kim <jaegeuk@kernel.org>
Fri, 14 Oct 2016 20:28:05 +0000 (13:28 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Wed, 23 Nov 2016 20:11:04 +0000 (12:11 -0800)
If there are a lot of dirty inodes, we need to flush all of them when doing
checkpoint. So, we need to count this for enough free space.

Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/segment.h

index fecb856ad874a87c75e15a1ce9bd169c5dbc6b5a..76274398842692f4238671de311c8d919e1f3ab0 100644 (file)
@@ -471,11 +471,12 @@ static inline bool need_SSR(struct f2fs_sb_info *sbi)
 {
        int node_secs = get_blocktype_secs(sbi, F2FS_DIRTY_NODES);
        int dent_secs = get_blocktype_secs(sbi, F2FS_DIRTY_DENTS);
+       int imeta_secs = get_blocktype_secs(sbi, F2FS_DIRTY_IMETA);
 
        if (test_opt(sbi, LFS))
                return false;
 
-       return free_sections(sbi) <= (node_secs + 2 * dent_secs +
+       return free_sections(sbi) <= (node_secs + 2 * dent_secs + imeta_secs +
                                                reserved_sections(sbi) + 1);
 }
 
@@ -484,14 +485,14 @@ static inline bool has_not_enough_free_secs(struct f2fs_sb_info *sbi,
 {
        int node_secs = get_blocktype_secs(sbi, F2FS_DIRTY_NODES);
        int dent_secs = get_blocktype_secs(sbi, F2FS_DIRTY_DENTS);
-
-       node_secs += get_blocktype_secs(sbi, F2FS_DIRTY_IMETA);
+       int imeta_secs = get_blocktype_secs(sbi, F2FS_DIRTY_IMETA);
 
        if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
                return false;
 
        return (free_sections(sbi) + freed) <=
-               (node_secs + 2 * dent_secs + reserved_sections(sbi) + needed);
+               (node_secs + 2 * dent_secs + imeta_secs +
+               reserved_sections(sbi) + needed);
 }
 
 static inline bool excess_prefree_segs(struct f2fs_sb_info *sbi)