aboutsummaryrefslogtreecommitdiffstats
path: root/fs/f2fs/segment.c
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk.kim@samsung.com>2013-03-31 00:58:51 -0400
committerJaegeuk Kim <jaegeuk.kim@samsung.com>2013-04-03 04:27:50 -0400
commit60374688a1a1cc8ef173d3dab42574719b851ac4 (patch)
treec658d4b8796ccb85675b8c7c931a4c8052b38ea1 /fs/f2fs/segment.c
parent4ebefc4443898f5429185ef96d85cfce0fbcc16a (diff)
f2fs: allocate remained free segments in the LFS mode
This patch adds a new condition that allocates free segments in the current active section even if SSR is needed. Otherwise, f2fs cannot allocate remained free segments in the section since SSR finds dirty segments only. Reviewed-by: Namjae Jeon <namjae.jeon@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
Diffstat (limited to 'fs/f2fs/segment.c')
-rw-r--r--fs/f2fs/segment.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
index d5244f6765a9..fe520d3448e0 100644
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -347,6 +347,17 @@ next:
347 return NULL_SEGNO; 347 return NULL_SEGNO;
348} 348}
349 349
350static int is_next_segment_free(struct f2fs_sb_info *sbi, int type)
351{
352 struct curseg_info *curseg = CURSEG_I(sbi, type);
353 unsigned int segno = curseg->segno;
354 struct free_segmap_info *free_i = FREE_I(sbi);
355
356 if (segno + 1 < TOTAL_SEGS(sbi) && (segno + 1) % sbi->segs_per_sec)
357 return !test_bit(segno + 1, free_i->free_segmap);
358 return 0;
359}
360
350/* 361/*
351 * Find a new segment from the free segments bitmap to right order 362 * Find a new segment from the free segments bitmap to right order
352 * This function should be returned with success, otherwise BUG 363 * This function should be returned with success, otherwise BUG
@@ -580,6 +591,8 @@ static void allocate_segment_by_default(struct f2fs_sb_info *sbi,
580 change_curseg(sbi, type, false); 591 change_curseg(sbi, type, false);
581 else if (type == CURSEG_WARM_NODE) 592 else if (type == CURSEG_WARM_NODE)
582 new_curseg(sbi, type, false); 593 new_curseg(sbi, type, false);
594 else if (curseg->alloc_type == LFS && is_next_segment_free(sbi, type))
595 new_curseg(sbi, type, false);
583 else if (need_SSR(sbi) && get_ssr_segment(sbi, type)) 596 else if (need_SSR(sbi) && get_ssr_segment(sbi, type))
584 change_curseg(sbi, type, true); 597 change_curseg(sbi, type, true);
585 else 598 else