dump.f2fs: fix a wrong report for dump an {d,id,did}node
authorYunlei He <heyunlei@huawei.com>
Wed, 7 Mar 2018 03:59:54 +0000 (11:59 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Mon, 7 May 2018 21:49:38 +0000 (14:49 -0700)
fix a wrong report for dump an {d,id,did}node like this:

[print_node_info: 283] Node ID [0x6820:26656] is direct node or indirect node.
[0]                     [0x 16b6684 : 23815812]
[1]                     [0x 16b6685 : 23815813]
[2]                     [0x 16b6686 : 23815814]
[3]                     [0x 16b6687 : 23815815]
[4]                     [0x 16b6688 : 23815816]
[5]                     [0x 16b6689 : 23815817]
[6]                     [0x 16b668a : 23815818]
[7]                     [0x 16b668b : 23815819]
[8]                     [0x 16b668c : 23815820]
[9]                     [0x 16b668d : 23815821]
[10]                    [0x 16b668e : 23815822]
Invalid (i)node block

Signed-off-by: Yunlei He <heyunlei@huawei.com>
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fsck/dump.c

index 23e4f47..9236a43 100644 (file)
@@ -475,6 +475,18 @@ dump:
        }
 }
 
+static bool is_sit_bitmap_set(struct f2fs_sb_info *sbi, u32 blk_addr)
+{
+       struct seg_entry *se;
+       u32 offset;
+
+       se = get_seg_entry(sbi, GET_SEGNO(sbi, blk_addr));
+       offset = OFFSET_IN_SEG(sbi, blk_addr);
+
+       return f2fs_test_bit(offset,
+                       (const char *)se->cur_valid_map) != 0;
+}
+
 void dump_node(struct f2fs_sb_info *sbi, nid_t nid, int force)
 {
        struct node_info ni;
@@ -492,15 +504,18 @@ void dump_node(struct f2fs_sb_info *sbi, nid_t nid, int force)
 
        if (ni.blk_addr == 0x0)
                MSG(force, "Invalid nat entry\n\n");
+       else if (!is_sit_bitmap_set(sbi, ni.blk_addr))
+               MSG(force, "Invalid node blk addr\n\n");
 
        DBG(1, "node_blk.footer.ino [0x%x]\n", le32_to_cpu(node_blk->footer.ino));
        DBG(1, "node_blk.footer.nid [0x%x]\n", le32_to_cpu(node_blk->footer.nid));
 
        if (le32_to_cpu(node_blk->footer.ino) == ni.ino &&
-                       le32_to_cpu(node_blk->footer.nid) == ni.nid &&
-                       ni.ino == ni.nid) {
+                       le32_to_cpu(node_blk->footer.nid) == ni.nid) {
                print_node_info(sbi, node_blk, force);
-               dump_file(sbi, &ni, node_blk, force);
+
+               if (ni.ino == ni.nid)
+                       dump_file(sbi, &ni, node_blk, force);
        } else {
                print_node_info(sbi, node_blk, force);
                MSG(force, "Invalid (i)node block\n\n");
@@ -678,8 +693,6 @@ int dump_info_from_blkaddr(struct f2fs_sb_info *sbi, u32 blk_addr)
        int type;
        struct f2fs_summary sum_entry;
        struct node_info ni, ino_ni;
-       struct seg_entry *se;
-       u32 offset;
        int enc_name;
        int ret = 0;
 
@@ -712,12 +725,8 @@ int dump_info_from_blkaddr(struct f2fs_sb_info *sbi, u32 blk_addr)
                return ret;
        }
 
-       se = get_seg_entry(sbi, GET_SEGNO(sbi, blk_addr));
-       offset = OFFSET_IN_SEG(sbi, blk_addr);
-
-       if (f2fs_test_bit(offset, (const char *)se->cur_valid_map) == 0) {
+       if (!is_sit_bitmap_set(sbi, blk_addr))
                MSG(0, "\nblkaddr is not valid\n");
-       }
 
        type = get_sum_entry(sbi, blk_addr, &sum_entry);
        nid = le32_to_cpu(sum_entry.nid);