|
|
@@ -3476,7 +3476,7 @@ static int build_curseg(struct f2fs_sb_info *sbi)
|
|
|
return restore_curseg_summaries(sbi);
|
|
|
}
|
|
|
|
|
|
-static void build_sit_entries(struct f2fs_sb_info *sbi)
|
|
|
+static int build_sit_entries(struct f2fs_sb_info *sbi)
|
|
|
{
|
|
|
struct sit_info *sit_i = SIT_I(sbi);
|
|
|
struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA);
|
|
|
@@ -3486,6 +3486,7 @@ static void build_sit_entries(struct f2fs_sb_info *sbi)
|
|
|
int sit_blk_cnt = SIT_BLK_CNT(sbi);
|
|
|
unsigned int i, start, end;
|
|
|
unsigned int readed, start_blk = 0;
|
|
|
+ int err = 0;
|
|
|
|
|
|
do {
|
|
|
readed = ra_meta_pages(sbi, start_blk, BIO_MAX_PAGES,
|
|
|
@@ -3504,7 +3505,9 @@ static void build_sit_entries(struct f2fs_sb_info *sbi)
|
|
|
sit = sit_blk->entries[SIT_ENTRY_OFFSET(sit_i, start)];
|
|
|
f2fs_put_page(page, 1);
|
|
|
|
|
|
- check_block_count(sbi, start, &sit);
|
|
|
+ err = check_block_count(sbi, start, &sit);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
seg_info_from_raw_sit(se, &sit);
|
|
|
|
|
|
/* build discard map only one time */
|
|
|
@@ -3539,7 +3542,9 @@ static void build_sit_entries(struct f2fs_sb_info *sbi)
|
|
|
|
|
|
old_valid_blocks = se->valid_blocks;
|
|
|
|
|
|
- check_block_count(sbi, start, &sit);
|
|
|
+ err = check_block_count(sbi, start, &sit);
|
|
|
+ if (err)
|
|
|
+ break;
|
|
|
seg_info_from_raw_sit(se, &sit);
|
|
|
|
|
|
if (f2fs_discard_en(sbi)) {
|
|
|
@@ -3559,6 +3564,7 @@ static void build_sit_entries(struct f2fs_sb_info *sbi)
|
|
|
se->valid_blocks - old_valid_blocks;
|
|
|
}
|
|
|
up_read(&curseg->journal_rwsem);
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
static void init_free_segmap(struct f2fs_sb_info *sbi)
|
|
|
@@ -3733,7 +3739,9 @@ int build_segment_manager(struct f2fs_sb_info *sbi)
|
|
|
return err;
|
|
|
|
|
|
/* reinit free segmap based on SIT */
|
|
|
- build_sit_entries(sbi);
|
|
|
+ err = build_sit_entries(sbi);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
|
|
|
init_free_segmap(sbi);
|
|
|
err = build_dirty_segmap(sbi);
|