On 06/15, Yufen Yu via Linux-f2fs-devel wrote: > gentry ping... Thanks, merged.
> > On 2022/6/7 11:40, Yufen Yu wrote: > > Usage: > > dump.f2fs -I [inode nid] /dev/sda > > > > This feature can be useful for some bugs caused by system crash. > > We not only need dump current valid node page, but alse the history > > data in disk, which can give some clues for status change of the inode. > > > > Signed-off-by: Yufen Yu <yuyu...@huawei.com> > > --- > > fsck/dump.c | 33 +++++++++++++++++++++++++++++++++ > > fsck/fsck.h | 1 + > > fsck/main.c | 14 +++++++++++++- > > man/dump.f2fs.8 | 7 +++++++ > > 4 files changed, 54 insertions(+), 1 deletion(-) > > > > diff --git a/fsck/dump.c b/fsck/dump.c > > index fce86c9..b8f6144 100644 > > --- a/fsck/dump.c > > +++ b/fsck/dump.c > > @@ -539,6 +539,39 @@ static bool is_sit_bitmap_set(struct f2fs_sb_info > > *sbi, u32 blk_addr) > > (const char *)se->cur_valid_map) != 0; > > } > > +void dump_node_scan_disk(struct f2fs_sb_info *sbi, nid_t nid) > > +{ > > + struct f2fs_node *node_blk; > > + pgoff_t blkaddr; > > + int ret; > > + pgoff_t start_blkaddr = SM_I(sbi)->main_blkaddr; > > + pgoff_t end_blkaddr = start_blkaddr + > > + (SM_I(sbi)->main_segments << sbi->log_blocks_per_seg); > > + > > + node_blk = calloc(BLOCK_SZ, 1); > > + ASSERT(node_blk); > > + MSG(0, "Info: scan all nid: %u from block_addr [%lu: %lu]\n", > > + nid, start_blkaddr, end_blkaddr); > > + > > + for (blkaddr = start_blkaddr; blkaddr < end_blkaddr; blkaddr++) { > > + struct seg_entry *se = get_seg_entry(sbi, GET_SEGNO(sbi, > > blkaddr)); > > + if (se->type < CURSEG_HOT_NODE) > > + continue; > > + > > + ret = dev_read_block(node_blk, blkaddr); > > + ASSERT(ret >= 0); > > + if (le32_to_cpu(node_blk->footer.ino) != nid || > > + le32_to_cpu(node_blk->footer.nid) != nid) > > + continue; > > + MSG(0, "Info: nid: %u, blkaddr: %lu\n", nid, blkaddr); > > + MSG(0, "node_blk.footer.flag [0x%x]\n", > > le32_to_cpu(node_blk->footer.flag)); > > + MSG(0, "node_blk.footer.cp_ver [%x]\n", > > (u32)(cpver_of_node(node_blk))); > > + print_inode_info(sbi, node_blk, 0); > > + } > > + > > + free(node_blk); > > +} > > + > > int dump_node(struct f2fs_sb_info *sbi, nid_t nid, int force) > > { > > struct node_info ni; > > diff --git a/fsck/fsck.h b/fsck/fsck.h > > index ce5fffe..0c819f0 100644 > > --- a/fsck/fsck.h > > +++ b/fsck/fsck.h > > @@ -262,6 +262,7 @@ struct dump_option { > > int start_ssa; > > int end_ssa; > > int32_t blk_addr; > > + nid_t scan_nid; > > }; > > extern void nat_dump(struct f2fs_sb_info *, nid_t, nid_t); > > diff --git a/fsck/main.c b/fsck/main.c > > index e4cfdf4..c7ad5ad 100644 > > --- a/fsck/main.c > > +++ b/fsck/main.c > > @@ -93,6 +93,7 @@ void dump_usage() > > MSG(0, "[options]:\n"); > > MSG(0, " -d debug level [default:0]\n"); > > MSG(0, " -i inode no (hex)\n"); > > + MSG(0, " -I inode no (hex) scan full disk\n"); > > MSG(0, " -n [NAT dump nid from #1~#2 (decimal), for all 0~-1]\n"); > > MSG(0, " -M show a block map\n"); > > MSG(0, " -s [SIT dump segno from #1~#2 (decimal), for all 0~-1]\n"); > > @@ -382,7 +383,7 @@ void f2fs_parse_options(int argc, char *argv[]) > > } > > } else if (!strcmp("dump.f2fs", prog)) { > > #ifdef WITH_DUMP > > - const char *option_string = "d:i:n:Ms:Sa:b:V"; > > + const char *option_string = "d:i:I:n:Ms:Sa:b:V"; > > static struct dump_option dump_opt = { > > .nid = 0, /* default root ino */ > > .start_nat = -1, > > @@ -392,6 +393,7 @@ void f2fs_parse_options(int argc, char *argv[]) > > .start_ssa = -1, > > .end_ssa = -1, > > .blk_addr = -1, > > + .scan_nid = 0, > > }; > > c.func = DUMP; > > @@ -424,6 +426,14 @@ void f2fs_parse_options(int argc, char *argv[]) > > ret = sscanf(optarg, "%x", > > &dump_opt.nid); > > break; > > + case 'I': > > + if (strncmp(optarg, "0x", 2)) > > + ret = sscanf(optarg, "%d", > > + &dump_opt.scan_nid); > > + else > > + ret = sscanf(optarg, "%x", > > + &dump_opt.scan_nid); > > + break; > > case 'n': > > ret = sscanf(optarg, "%d~%d", > > &dump_opt.start_nat, > > @@ -916,6 +926,8 @@ static void do_dump(struct f2fs_sb_info *sbi) > > dump_info_from_blkaddr(sbi, opt->blk_addr); > > if (opt->nid) > > dump_node(sbi, opt->nid, 0); > > + if (opt->scan_nid) > > + dump_node_scan_disk(sbi, opt->scan_nid); > > print_cp_state(flag); > > diff --git a/man/dump.f2fs.8 b/man/dump.f2fs.8 > > index 1ddb7fc..94bf5f3 100644 > > --- a/man/dump.f2fs.8 > > +++ b/man/dump.f2fs.8 > > @@ -10,6 +10,10 @@ dump.f2fs \- retrieve directory and file entries from an > > F2FS-formated image > > .I inode number > > ] > > [ > > +.B \-I > > +.I inode number > > +] > > +[ > > .B \-n > > .I NAT range > > ] > > @@ -52,6 +56,9 @@ is 0 on success and -1 on failure. > > .BI \-i " inode number" > > Specify an inode number to dump out. > > .TP > > +.BI \-I " inode number" > > +Specify an inode number and scan full disk to dump out, include history > > inode block > > +.TP > > .BI \-n " NAT range" > > Specify a range presented by nids to dump NAT entries. > > .TP > > > _______________________________________________ > Linux-f2fs-devel mailing list > Linux-f2fs-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel