|
@@ -126,17 +126,16 @@ void locate_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno)
|
|
|
static void set_prefree_as_free_segments(struct f2fs_sb_info *sbi)
|
|
|
{
|
|
|
struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
|
|
|
- unsigned int segno, offset = 0;
|
|
|
+ unsigned int segno = -1;
|
|
|
unsigned int total_segs = TOTAL_SEGS(sbi);
|
|
|
|
|
|
mutex_lock(&dirty_i->seglist_lock);
|
|
|
while (1) {
|
|
|
segno = find_next_bit(dirty_i->dirty_segmap[PRE], total_segs,
|
|
|
- offset);
|
|
|
+ segno + 1);
|
|
|
if (segno >= total_segs)
|
|
|
break;
|
|
|
__set_test_and_free(sbi, segno);
|
|
|
- offset = segno + 1;
|
|
|
}
|
|
|
mutex_unlock(&dirty_i->seglist_lock);
|
|
|
}
|
|
@@ -144,17 +143,16 @@ static void set_prefree_as_free_segments(struct f2fs_sb_info *sbi)
|
|
|
void clear_prefree_segments(struct f2fs_sb_info *sbi)
|
|
|
{
|
|
|
struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
|
|
|
- unsigned int segno, offset = 0;
|
|
|
+ unsigned int segno = -1;
|
|
|
unsigned int total_segs = TOTAL_SEGS(sbi);
|
|
|
|
|
|
mutex_lock(&dirty_i->seglist_lock);
|
|
|
while (1) {
|
|
|
segno = find_next_bit(dirty_i->dirty_segmap[PRE], total_segs,
|
|
|
- offset);
|
|
|
+ segno + 1);
|
|
|
if (segno >= total_segs)
|
|
|
break;
|
|
|
|
|
|
- offset = segno + 1;
|
|
|
if (test_and_clear_bit(segno, dirty_i->dirty_segmap[PRE]))
|
|
|
dirty_i->nr_dirty[PRE]--;
|
|
|
|
|
@@ -364,11 +362,11 @@ next:
|
|
|
static int is_next_segment_free(struct f2fs_sb_info *sbi, int type)
|
|
|
{
|
|
|
struct curseg_info *curseg = CURSEG_I(sbi, type);
|
|
|
- unsigned int segno = curseg->segno;
|
|
|
+ unsigned int segno = curseg->segno + 1;
|
|
|
struct free_segmap_info *free_i = FREE_I(sbi);
|
|
|
|
|
|
- if (segno + 1 < TOTAL_SEGS(sbi) && (segno + 1) % sbi->segs_per_sec)
|
|
|
- return !test_bit(segno + 1, free_i->free_segmap);
|
|
|
+ if (segno < TOTAL_SEGS(sbi) && segno % sbi->segs_per_sec)
|
|
|
+ return !test_bit(segno, free_i->free_segmap);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -495,7 +493,7 @@ static void new_curseg(struct f2fs_sb_info *sbi, int type, bool new_sec)
|
|
|
int dir = ALLOC_LEFT;
|
|
|
|
|
|
write_sum_page(sbi, curseg->sum_blk,
|
|
|
- GET_SUM_BLOCK(sbi, curseg->segno));
|
|
|
+ GET_SUM_BLOCK(sbi, segno));
|
|
|
if (type == CURSEG_WARM_DATA || type == CURSEG_COLD_DATA)
|
|
|
dir = ALLOC_RIGHT;
|
|
|
|