|
@@ -815,7 +815,7 @@ static int do_garbage_collect(struct f2fs_sb_info *sbi,
|
|
|
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;
|
|
|
|
|
@@ -871,22 +871,20 @@ static int do_garbage_collect(struct f2fs_sb_info *sbi,
|
|
|
|
|
|
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 = {
|
|
@@ -925,9 +923,8 @@ gc_more:
|
|
|
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)
|