btrfs-progs: dump-tree: add option to print children nodes of a given block
authorQu Wenruo <wqu@suse.com>
Wed, 14 Mar 2018 01:05:38 +0000 (09:05 +0800)
committerDavid Sterba <dsterba@suse.com>
Fri, 30 Mar 2018 20:15:54 +0000 (22:15 +0200)
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 <wqu@suse.com>
[ remove the short option for now ]
Signed-off-by: David Sterba <dsterba@suse.com>
Documentation/btrfs-inspect-internal.asciidoc
cmds-inspect-dump-tree.c

index e072a94..e2db646 100644 (file)
@@ -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 <block_num>::::
 print info of the specified block only
+--follow::::
+use with '-b', print all children tree blocks of '<block_num>'
 -t <tree_id>::::
 print only the tree with the specified ID, where the ID can be numerical or
 common name in a flexible human readable form
index df44bb6..0802b31 100644 (file)
@@ -198,6 +198,7 @@ const char * const cmd_inspect_dump_tree_usage[] = {
        "-u|--uuid              print only the uuid tree",
        "-b|--block <block_num> print info from the specified block only",
        "-t|--tree <tree_id>    print only tree with the given id (string or number)",
+       "--follow               use with -b, to show all children tree blocks of <block_num>",
        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;
        }