From 992aa558397e519d2251cdc6c4d3a9e019b240a0 Mon Sep 17 00:00:00 2001 From: Qu Wenruo Date: Wed, 14 Mar 2018 09:05:38 +0800 Subject: btrfs-progs: dump-tree: add option to print children nodes of a given block When debuging with "btrfs inspect dump-tree", it's not that handy if we want to iterate all child tree blocks starting from a specified block. -b can only print a single block, while without -b "btrfs inspect dump-tree" will need extra tree roots fulfilled to continue, which is not possible for a damaged filesystem. Add a new option --follow to iterate a sub-tree starting from block specified by --block. Signed-off-by: Qu Wenruo [ remove the short option for now ] Signed-off-by: David Sterba --- Documentation/btrfs-inspect-internal.asciidoc | 2 ++ cmds-inspect-dump-tree.c | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Documentation/btrfs-inspect-internal.asciidoc b/Documentation/btrfs-inspect-internal.asciidoc index e072a943..e2db6466 100644 --- a/Documentation/btrfs-inspect-internal.asciidoc +++ b/Documentation/btrfs-inspect-internal.asciidoc @@ -87,6 +87,8 @@ the respective tree root block offset print only the uuid tree information, empty output if the tree does not exist -b :::: print info of the specified block only +--follow:::: +use with '-b', print all children tree blocks of '' -t :::: print only the tree with the specified ID, where the ID can be numerical or common name in a flexible human readable form diff --git a/cmds-inspect-dump-tree.c b/cmds-inspect-dump-tree.c index df44bb63..0802b31e 100644 --- a/cmds-inspect-dump-tree.c +++ b/cmds-inspect-dump-tree.c @@ -198,6 +198,7 @@ const char * const cmd_inspect_dump_tree_usage[] = { "-u|--uuid print only the uuid tree", "-b|--block print info from the specified block only", "-t|--tree print only tree with the given id (string or number)", + "--follow use with -b, to show all children tree blocks of ", NULL }; @@ -223,9 +224,11 @@ int cmd_inspect_dump_tree(int argc, char **argv) u64 block_only = 0; struct btrfs_root *tree_root_scan; u64 tree_id = 0; + bool follow = false; while (1) { int c; + enum { GETOPT_VAL_FOLLOW = 256 }; static const struct option long_options[] = { { "extents", no_argument, NULL, 'e'}, { "device", no_argument, NULL, 'd'}, @@ -234,6 +237,7 @@ int cmd_inspect_dump_tree(int argc, char **argv) { "uuid", no_argument, NULL, 'u'}, { "block", required_argument, NULL, 'b'}, { "tree", required_argument, NULL, 't'}, + { "follow", no_argument, NULL, GETOPT_VAL_FOLLOW }, { NULL, 0, NULL, 0 } }; @@ -286,6 +290,9 @@ int cmd_inspect_dump_tree(int argc, char **argv) } break; } + case GETOPT_VAL_FOLLOW: + follow = true; + break; default: usage(cmd_inspect_dump_tree_usage); } @@ -324,7 +331,7 @@ int cmd_inspect_dump_tree(int argc, char **argv) (unsigned long long)block_only); goto close_root; } - btrfs_print_tree(root, leaf, 0); + btrfs_print_tree(root, leaf, follow); free_extent_buffer(leaf); goto close_root; } -- cgit v1.2.3