diff options
author | Jaegeuk Kim <jaegeuk@kernel.org> | 2021-06-18 13:26:17 -0700 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2021-06-23 09:02:00 -0700 |
commit | 8d464ee16fe369d1ad2f514a68a30e57ec80d765 (patch) | |
tree | 466613004736d780aeb62faa1ad7a50be0efa58c | |
parent | acd2518e26f80030493284fc95a94c2a20d4e797 (diff) | |
download | f2fs-tools-8d464ee16fe369d1ad2f514a68a30e57ec80d765.tar.gz |
f2fs-tools: fix wrong file offset
This fixes wrong file offset updates, since we should not do (*ofs)++; for
indirect node blocks.
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r-- | fsck/dump.c | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/fsck/dump.c b/fsck/dump.c index 3307a54..67e94ed 100644 --- a/fsck/dump.c +++ b/fsck/dump.c @@ -293,27 +293,20 @@ static void dump_data_blk(struct f2fs_sb_info *sbi, __u64 offset, u32 blkaddr) } static void dump_node_blk(struct f2fs_sb_info *sbi, int ntype, - u32 nid, u64 *ofs) + u32 nid, u32 addr_per_block, u64 *ofs) { struct node_info ni; struct f2fs_node *node_blk; u32 skip = 0; u32 i, idx = 0; - get_node_info(sbi, nid, &ni); - - node_blk = calloc(BLOCK_SZ, 1); - ASSERT(node_blk); - - dev_read_block(node_blk, ni.blk_addr); - switch (ntype) { case TYPE_DIRECT_NODE: - skip = idx = ADDRS_PER_BLOCK(&node_blk->i); + skip = idx = addr_per_block; break; case TYPE_INDIRECT_NODE: idx = NIDS_PER_BLOCK; - skip = idx * ADDRS_PER_BLOCK(&node_blk->i); + skip = idx * addr_per_block; break; case TYPE_DOUBLE_INDIRECT_NODE: skip = 0; @@ -323,26 +316,37 @@ static void dump_node_blk(struct f2fs_sb_info *sbi, int ntype, if (nid == 0) { *ofs += skip; - goto out; + return; } - for (i = 0; i < idx; i++, (*ofs)++) { + get_node_info(sbi, nid, &ni); + + node_blk = calloc(BLOCK_SZ, 1); + ASSERT(node_blk); + + dev_read_block(node_blk, ni.blk_addr); + + for (i = 0; i < idx; i++) { switch (ntype) { case TYPE_DIRECT_NODE: dump_data_blk(sbi, *ofs * F2FS_BLKSIZE, le32_to_cpu(node_blk->dn.addr[i])); + (*ofs)++; break; case TYPE_INDIRECT_NODE: dump_node_blk(sbi, TYPE_DIRECT_NODE, - le32_to_cpu(node_blk->in.nid[i]), ofs); + le32_to_cpu(node_blk->in.nid[i]), + addr_per_block, + ofs); break; case TYPE_DOUBLE_INDIRECT_NODE: dump_node_blk(sbi, TYPE_INDIRECT_NODE, - le32_to_cpu(node_blk->in.nid[i]), ofs); + le32_to_cpu(node_blk->in.nid[i]), + addr_per_block, + ofs); break; } } -out: free(node_blk); } @@ -421,6 +425,7 @@ static int dump_inode_blk(struct f2fs_sb_info *sbi, u32 nid, { u32 i = 0; u64 ofs = 0; + u32 addr_per_block; if((node_blk->i.i_inline & F2FS_INLINE_DATA)) { DBG(3, "ino[0x%x] has inline data!\n", nid); @@ -431,6 +436,7 @@ static int dump_inode_blk(struct f2fs_sb_info *sbi, u32 nid, } c.show_file_map_max_offset = f2fs_max_file_offset(&node_blk->i); + addr_per_block = ADDRS_PER_BLOCK(&node_blk->i); /* check data blocks in inode */ for (i = 0; i < ADDRS_PER_INODE(&node_blk->i); i++, ofs++) @@ -441,13 +447,19 @@ static int dump_inode_blk(struct f2fs_sb_info *sbi, u32 nid, for (i = 0; i < 5; i++) { if (i == 0 || i == 1) dump_node_blk(sbi, TYPE_DIRECT_NODE, - le32_to_cpu(node_blk->i.i_nid[i]), &ofs); + le32_to_cpu(node_blk->i.i_nid[i]), + addr_per_block, + &ofs); else if (i == 2 || i == 3) dump_node_blk(sbi, TYPE_INDIRECT_NODE, - le32_to_cpu(node_blk->i.i_nid[i]), &ofs); + le32_to_cpu(node_blk->i.i_nid[i]), + addr_per_block, + &ofs); else if (i == 4) dump_node_blk(sbi, TYPE_DOUBLE_INDIRECT_NODE, - le32_to_cpu(node_blk->i.i_nid[i]), &ofs); + le32_to_cpu(node_blk->i.i_nid[i]), + addr_per_block, + &ofs); else ASSERT(0); } |