diff options
-rw-r--r-- | cmds-inspect-dump-tree.c | 10 | ||||
-rw-r--r-- | cmds-restore.c | 9 |
2 files changed, 17 insertions, 2 deletions
diff --git a/cmds-inspect-dump-tree.c b/cmds-inspect-dump-tree.c index 71d8e3a9..92a2a45b 100644 --- a/cmds-inspect-dump-tree.c +++ b/cmds-inspect-dump-tree.c @@ -221,12 +221,20 @@ int cmd_inspect_dump_tree(int argc, char **argv) int uuid_tree_only = 0; int roots_only = 0; int root_backups = 0; - unsigned open_ctree_flags = OPEN_CTREE_PARTIAL; + unsigned open_ctree_flags; u64 block_only = 0; struct btrfs_root *tree_root_scan; u64 tree_id = 0; bool follow = false; + /* + * For debug-tree, we care nothing about extent tree (it's just backref + * and usage accounting, only makes sense for RW operations). + * Use NO_BLOCK_GROUPS here could also speedup open_ctree() and allow us + * to inspect fs with corrupted extent tree blocks, and show as many good + * tree blocks as possible. + */ + open_ctree_flags = OPEN_CTREE_PARTIAL | OPEN_CTREE_NO_BLOCK_GROUPS; while (1) { int c; enum { GETOPT_VAL_FOLLOW = 256 }; diff --git a/cmds-restore.c b/cmds-restore.c index ade35f0f..f228acab 100644 --- a/cmds-restore.c +++ b/cmds-restore.c @@ -1281,8 +1281,15 @@ static struct btrfs_root *open_fs(const char *dev, u64 root_location, for (i = super_mirror; i < BTRFS_SUPER_MIRROR_MAX; i++) { bytenr = btrfs_sb_offset(i); + + /* + * Restore won't allocate extent and doesn't care anything + * in extent tree. Skip block group item search will allow + * restore to be executed on heavily damaged fs. + */ fs_info = open_ctree_fs_info(dev, bytenr, root_location, 0, - OPEN_CTREE_PARTIAL); + OPEN_CTREE_PARTIAL | + OPEN_CTREE_NO_BLOCK_GROUPS); if (fs_info) break; fprintf(stderr, "Could not open root, trying backup super\n"); |