return GET_SEC_FROM_SEG(sbi, reserved_segments(sbi));
 }
 
-static inline bool has_curseg_enough_space(struct f2fs_sb_info *sbi)
+static inline bool has_curseg_enough_space(struct f2fs_sb_info *sbi,
+                       unsigned int node_blocks, unsigned int dent_blocks)
 {
-       unsigned int node_blocks = get_pages(sbi, F2FS_DIRTY_NODES) +
-                                       get_pages(sbi, F2FS_DIRTY_DENTS);
-       unsigned int dent_blocks = get_pages(sbi, F2FS_DIRTY_DENTS);
+
        unsigned int segno, left_blocks;
        int i;
 
 static inline bool has_not_enough_free_secs(struct f2fs_sb_info *sbi,
                                        int freed, int needed)
 {
-       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);
+       unsigned int total_node_blocks = get_pages(sbi, F2FS_DIRTY_NODES) +
+                                       get_pages(sbi, F2FS_DIRTY_DENTS) +
+                                       get_pages(sbi, F2FS_DIRTY_IMETA);
+       unsigned int total_dent_blocks = get_pages(sbi, F2FS_DIRTY_DENTS);
+       unsigned int node_secs = total_node_blocks / BLKS_PER_SEC(sbi);
+       unsigned int dent_secs = total_dent_blocks / BLKS_PER_SEC(sbi);
+       unsigned int node_blocks = total_node_blocks % BLKS_PER_SEC(sbi);
+       unsigned int dent_blocks = total_dent_blocks % BLKS_PER_SEC(sbi);
+       unsigned int free, need_lower, need_upper;
 
        if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
                return false;
 
-       if (free_sections(sbi) + freed == reserved_sections(sbi) + needed &&
-                       has_curseg_enough_space(sbi))
+       free = free_sections(sbi) + freed;
+       need_lower = node_secs + dent_secs + reserved_sections(sbi) + needed;
+       need_upper = need_lower + (node_blocks ? 1 : 0) + (dent_blocks ? 1 : 0);
+
+       if (free > need_upper)
                return false;
-       return (free_sections(sbi) + freed) <=
-               (node_secs + 2 * dent_secs + imeta_secs +
-               reserved_sections(sbi) + needed);
+       else if (free <= need_lower)
+               return true;
+       return !has_curseg_enough_space(sbi, node_blocks, dent_blocks);
 }
 
 static inline bool f2fs_is_checkpoint_ready(struct f2fs_sb_info *sbi)