aboutsummaryrefslogtreecommitdiffstats
path: root/fsck/fsck.c
diff options
context:
space:
mode:
Diffstat (limited to 'fsck/fsck.c')
-rw-r--r--fsck/fsck.c34
1 files changed, 25 insertions, 9 deletions
diff --git a/fsck/fsck.c b/fsck/fsck.c
index e7dd02f..7facf07 100644
--- a/fsck/fsck.c
+++ b/fsck/fsck.c
@@ -129,6 +129,7 @@ static int is_valid_ssa_node_blk(struct f2fs_sb_info *sbi, u32 nid,
{
struct f2fs_summary_block *sum_blk;
struct f2fs_summary *sum_entry;
+ struct seg_entry * se;
u32 segno, offset;
int need_fix = 0, ret = 0;
int type;
@@ -145,9 +146,16 @@ static int is_valid_ssa_node_blk(struct f2fs_sb_info *sbi, u32 nid,
ret = -EINVAL;
goto out;
}
- FIX_MSG("Summary footer indicates a node segment: 0x%x", segno);
- sum_blk->footer.entry_type = SUM_TYPE_NODE;
+
need_fix = 1;
+ se = get_seg_entry(sbi, segno);
+ if(IS_NODESEG(se->type)) {
+ FIX_MSG("Summary footer indicates a node segment: 0x%x", segno);
+ sum_blk->footer.entry_type = SUM_TYPE_NODE;
+ } else {
+ ret = -EINVAL;
+ goto out;
+ }
}
sum_entry = &(sum_blk->entries[offset]);
@@ -235,6 +243,7 @@ static int is_valid_ssa_data_blk(struct f2fs_sb_info *sbi, u32 blk_addr,
{
struct f2fs_summary_block *sum_blk;
struct f2fs_summary *sum_entry;
+ struct seg_entry * se;
u32 segno, offset;
int need_fix = 0, ret = 0;
int type;
@@ -251,9 +260,16 @@ static int is_valid_ssa_data_blk(struct f2fs_sb_info *sbi, u32 blk_addr,
ret = -EINVAL;
goto out;
}
- FIX_MSG("Summary footer indicates a data segment: 0x%x", segno);
- sum_blk->footer.entry_type = SUM_TYPE_DATA;
+
need_fix = 1;
+ se = get_seg_entry(sbi, segno);
+ if (IS_DATASEG(se->type)) {
+ FIX_MSG("Summary footer indicates a data segment: 0x%x", segno);
+ sum_blk->footer.entry_type = SUM_TYPE_DATA;
+ } else {
+ ret = -EINVAL;
+ goto out;
+ }
}
sum_entry = &(sum_blk->entries[offset]);
@@ -352,11 +368,6 @@ static int sanity_check_nid(struct f2fs_sb_info *sbi, u32 nid,
return -EINVAL;
}
- if (is_valid_ssa_node_blk(sbi, nid, ni->blk_addr)) {
- ASSERT_MSG("summary node block is not valid. [0x%x]", nid);
- return -EINVAL;
- }
-
ret = dev_read_block(node_blk, ni->blk_addr);
ASSERT(ret >= 0);
@@ -427,6 +438,11 @@ static int sanity_check_nid(struct f2fs_sb_info *sbi, u32 nid,
ASSERT_MSG("orphan or xattr nid is duplicated [0x%x]\n",
nid);
+ if (is_valid_ssa_node_blk(sbi, nid, ni->blk_addr)) {
+ ASSERT_MSG("summary node block is not valid. [0x%x]", nid);
+ return -EINVAL;
+ }
+
if (f2fs_test_sit_bitmap(sbi, ni->blk_addr) == 0)
ASSERT_MSG("SIT bitmap is 0x0. blk_addr[0x%x]",
ni->blk_addr);