f2fs: avoid garbage collecting already moved node blocks
authorJaegeuk Kim <jaegeuk@kernel.org>
Fri, 14 Aug 2015 21:37:50 +0000 (14:37 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Thu, 20 Aug 2015 16:00:10 +0000 (09:00 -0700)
If node blocks were already moved, we don't need to move them again.

Reviewed-by: Chao Yu <chao2.yu@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/gc.c

index 81de28d8326f00f20744d97bdd013f2469fd2bf8..0a5d573e2574f24d07c5222d4d732fbbdfba91fe 100644 (file)
@@ -396,14 +396,18 @@ static void gc_node_segment(struct f2fs_sb_info *sbi,
 {
        bool initial = true;
        struct f2fs_summary *entry;
+       block_t start_addr;
        int off;
 
+       start_addr = START_BLOCK(sbi, segno);
+
 next_step:
        entry = sum;
 
        for (off = 0; off < sbi->blocks_per_seg; off++, entry++) {
                nid_t nid = le32_to_cpu(entry->nid);
                struct page *node_page;
+               struct node_info ni;
 
                /* stop BG_GC if there is not enough free sections. */
                if (gc_type == BG_GC && has_not_enough_free_secs(sbi, 0))
@@ -426,6 +430,12 @@ next_step:
                        continue;
                }
 
+               get_node_info(sbi, nid, &ni);
+               if (ni.blk_addr != start_addr + off) {
+                       f2fs_put_page(node_page, 1);
+                       continue;
+               }
+
                /* set page dirty and write it */
                if (gc_type == FG_GC) {
                        f2fs_wait_on_page_writeback(node_page, NODE);