f2fs: fix calculation of max. gc cost in the SSR case
authorJaegeuk Kim <jaegeuk.kim@samsung.com>
Tue, 5 Feb 2013 04:19:28 +0000 (13:19 +0900)
committerJaegeuk Kim <jaegeuk.kim@samsung.com>
Mon, 11 Feb 2013 22:15:02 +0000 (07:15 +0900)
commitb7250d2d845822466356f7f22a650bf807090d7e
treee7574602a3f4b6f3000f5165e15d113534843a8a
parent437275272f9e635673f065300e5d95226a25cb06
f2fs: fix calculation of max. gc cost in the SSR case

In the SSR case, the max gc cost should be the number of pages in a segment.
Otherwise, f2fs is able to fail getting dirty segments frequently for SSR.

In get_victim_by_default() previously,

while(1) {
   ...
   cost = get_gc_cost(); <- cost is between 0 ~ 512.
   ...
   if (cost == get_max_cost(sbi, &p)) <- max cost is UINT_MAX due to GC_CB type
continue;

   if (nsearched++ >= MAX_VICTIM_SEARCH)
break;
}

So, if there are a number of fully valid segments in series, f2fs cannot skip
those segments by comparing the cost and max cost of each segment.

Note that, the cost is the number of valid blocks at the time of the last
checkpoint.

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