From: Martin Wilck <mwi...@arcor.de> Option -B causes btrfs-debug-tree to dump the tree rooted at the backup root number given instead of the real root.
Signed-off-by: Martin Wilck <mwi...@arcor.de> --- btrfs-debug-tree.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 files changed, 38 insertions(+), 1 deletions(-) diff --git a/btrfs-debug-tree.c b/btrfs-debug-tree.c index e61c71c..7cdc368 100644 --- a/btrfs-debug-tree.c +++ b/btrfs-debug-tree.c @@ -45,6 +45,8 @@ static int print_usage(void) " block\n"); fprintf(stderr, "\t-t tree_id : print only the tree with the given id\n"); + fprintf(stderr, + "\t-B nr: use root backup <nr> instead of real root\n"); fprintf(stderr, "%s\n", BTRFS_BUILD_VERSION); exit(1); } @@ -140,6 +142,7 @@ int main(int ac, char **av) int root_backups = 0; u64 block_only = 0; int block_follow = 0; + int use_backup = -1; struct btrfs_root *tree_root_scan; u64 tree_id = 0; @@ -147,7 +150,7 @@ int main(int ac, char **av) while(1) { int c; - c = getopt(ac, av, "defb:rRut:"); + c = getopt(ac, av, "defb:rRut:B:"); if (c < 0) break; switch(c) { @@ -176,6 +179,9 @@ int main(int ac, char **av) case 't': tree_id = arg_strtou64(optarg); break; + case 'B': + use_backup = arg_strtou64(optarg); + break; default: print_usage(); } @@ -221,6 +227,37 @@ int main(int ac, char **av) goto close_root; } + if (use_backup >= BTRFS_NUM_BACKUP_ROOTS) { + fprintf(stderr, "Invalid backup root number %d\n", + use_backup); + exit(1); + } else if (use_backup >= 0) { + u64 bytenr, generation; + u32 blocksize; + struct btrfs_super_block *sb = info->super_copy; + struct btrfs_root_backup *backup = sb->super_roots + use_backup; + struct extent_buffer *eb; + bytenr = btrfs_backup_tree_root(backup); + generation = btrfs_backup_tree_root_gen(backup); + blocksize = btrfs_level_size(info->tree_root, + btrfs_super_root_level(sb)); + eb = info->tree_root->node; + info->tree_root->node = read_tree_block(root, bytenr, + blocksize, generation); + free_extent_buffer(eb); + bytenr = btrfs_backup_chunk_root(backup); + generation = btrfs_backup_chunk_root_gen(backup); + eb = info->chunk_root->node; + info->chunk_root->node = read_tree_block(root, bytenr, + blocksize, generation); + free_extent_buffer(eb); + if (!extent_buffer_uptodate(info->tree_root->node) || + !extent_buffer_uptodate(info->tree_root->node)) { + fprintf(stderr, "Couldn't backup root\n"); + return 1; + } + } + if (!(extent_only || uuid_tree_only || tree_id)) { if (roots_only) { printf("root tree: %llu level %d\n", -- 1.7.3.4 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html