struct blk_plug plug;
        unsigned int segno = start_segno;
        unsigned int end_segno = start_segno + sbi->segs_per_sec;
-       int seg_freed = 0;
+       int sec_freed = 0;
        unsigned char type = IS_DATASEG(get_seg_entry(sbi, segno)->type) ?
                                                SUM_TYPE_DATA : SUM_TYPE_NODE;
 
 
        blk_finish_plug(&plug);
 
-       if (gc_type == FG_GC) {
-               while (start_segno < end_segno)
-                       if (get_valid_blocks(sbi, start_segno++, 1) == 0)
-                               seg_freed++;
-       }
+       if (gc_type == FG_GC &&
+               get_valid_blocks(sbi, start_segno, sbi->segs_per_sec) == 0)
+               sec_freed = 1;
 
        stat_inc_call_count(sbi->stat_info);
 
-       return seg_freed;
+       return sec_freed;
 }
 
 int f2fs_gc(struct f2fs_sb_info *sbi, bool sync)
 {
        unsigned int segno;
        int gc_type = sync ? FG_GC : BG_GC;
-       int sec_freed = 0, seg_freed;
+       int sec_freed = 0;
        int ret = -EINVAL;
        struct cp_control cpc;
        struct gc_inode_list gc_list = {
                goto stop;
        ret = 0;
 
-       seg_freed = do_garbage_collect(sbi, segno, &gc_list, gc_type);
-
-       if (gc_type == FG_GC && seg_freed == sbi->segs_per_sec)
+       if (do_garbage_collect(sbi, segno, &gc_list, gc_type) &&
+                       gc_type == FG_GC)
                sec_freed++;
 
        if (gc_type == FG_GC)