f2fs: fix equation of has_not_enough_free_secs()
authorJaegeuk Kim <jaegeuk.kim@samsung.com>
Fri, 21 Dec 2012 08:20:21 +0000 (17:20 +0900)
committerJaegeuk Kim <jaegeuk.kim@samsung.com>
Fri, 28 Dec 2012 02:24:10 +0000 (11:24 +0900)
Practically, has_not_enough_free_secs() should calculate with the numbers of
current node and directory data blocks together.
Actually the equation was implemented in need_to_flush().

So, this patch removes need_flush() and moves the equation into
has_not_enough_free_secs().

Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
fs/f2fs/segment.c
fs/f2fs/segment.h

index fe2cc0bdc1157680a731dc052847558c8306e6c9..66f5e82ec32449c925abac4f1722678032dc8fcf 100644 (file)
 #include "segment.h"
 #include "node.h"
 
-static int need_to_flush(struct f2fs_sb_info *sbi)
-{
-       unsigned int pages_per_sec = (1 << sbi->log_blocks_per_seg) *
-                       sbi->segs_per_sec;
-       int node_secs = ((get_pages(sbi, F2FS_DIRTY_NODES) + pages_per_sec - 1)
-               >> sbi->log_blocks_per_seg) / sbi->segs_per_sec;
-       int dent_secs = ((get_pages(sbi, F2FS_DIRTY_DENTS) + pages_per_sec - 1)
-               >> sbi->log_blocks_per_seg) / sbi->segs_per_sec;
-
-       if (sbi->por_doing)
-               return 0;
-
-       if (free_sections(sbi) <= (node_secs + 2 * dent_secs +
-                                               reserved_sections(sbi)))
-               return 1;
-       return 0;
-}
-
 /*
  * This function balances dirty node and dentry pages.
  * In addition, it controls garbage collection.
  */
 void f2fs_balance_fs(struct f2fs_sb_info *sbi)
 {
-       struct writeback_control wbc = {
-               .sync_mode = WB_SYNC_ALL,
-               .nr_to_write = LONG_MAX,
-               .for_reclaim = 0,
-       };
-
-       if (sbi->por_doing)
-               return;
-
        /*
-        * We should do checkpoint when there are so many dirty node pages
-        * with enough free segments. After then, we should do GC.
+        * We should do GC or end up with checkpoint, if there are so many dirty
+        * dir/node pages without enough free segments.
         */
-       if (need_to_flush(sbi)) {
-               sync_dirty_dir_inodes(sbi);
-               sync_node_pages(sbi, 0, &wbc);
-       }
-
        if (has_not_enough_free_secs(sbi)) {
                mutex_lock(&sbi->gc_mutex);
                f2fs_gc(sbi, 1);
index 0948405af6f5f88ef1e71a2904231677e37bfa69..66a288a52fd306f64d83cba764729d35c56f46f1 100644 (file)
@@ -459,7 +459,20 @@ static inline int get_ssr_segment(struct f2fs_sb_info *sbi, int type)
 
 static inline bool has_not_enough_free_secs(struct f2fs_sb_info *sbi)
 {
-       return free_sections(sbi) <= reserved_sections(sbi);
+       unsigned int pages_per_sec = (1 << sbi->log_blocks_per_seg) *
+                       sbi->segs_per_sec;
+       int node_secs = ((get_pages(sbi, F2FS_DIRTY_NODES) + pages_per_sec - 1)
+                       >> sbi->log_blocks_per_seg) / sbi->segs_per_sec;
+       int dent_secs = ((get_pages(sbi, F2FS_DIRTY_DENTS) + pages_per_sec - 1)
+                       >> sbi->log_blocks_per_seg) / sbi->segs_per_sec;
+
+       if (sbi->por_doing)
+               return false;
+
+       if (free_sections(sbi) <= (node_secs + 2 * dent_secs +
+                                               reserved_sections(sbi)))
+               return true;
+       return false;
 }
 
 static inline int utilization(struct f2fs_sb_info *sbi)