summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmds-inspect-dump-tree.c10
-rw-r--r--cmds-restore.c9
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");