Message ID | 20190626083017.1833-1-anand.jain@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v7,RESEND,Rebased] btrfs-progs: dump-tree: add noscan option | expand |
Ping? On 26/6/19 4:30 PM, Anand Jain wrote: > From: Anand Jain <Anand.Jain@oracle.com> > > The cli 'btrfs inspect dump-tree <dev>' will scan for the partner devices > if any by default. > > So as of now you can not inspect each mirrored device independently. > > This patch adds noscan option, which when used won't scan the system for > the partner devices, instead it just uses the devices provided in the > argument. > > For example: > btrfs inspect dump-tree --noscan <dev> [<dev>..] > > This helps to debug degraded raid1 and raid10. > > Signed-off-by: Anand Jain <anand.jain@oracle.com> > --- > v6->v7: rebase on latest btrfs-progs::devel > v5->v6: rebase on latest btrfs-progs::devel > v4->v5: nit: use %m to print error string. > changelog update. > v3->v4: change the patch title. > collapse scan_args() to its only parent cmd_inspect_dump_tree() > (it was bit confusing). > update the change log. > update usage. > update man page. > v2->v3: make it scalable for more than two disks in noscan mode > v1->v2: rename --degraded to --noscan > Documentation/btrfs-inspect-internal.asciidoc | 5 +- > cmds-inspect-dump-tree.c | 53 ++++++++++++++----- > 2 files changed, 45 insertions(+), 13 deletions(-) > > diff --git a/Documentation/btrfs-inspect-internal.asciidoc b/Documentation/btrfs-inspect-internal.asciidoc > index 210f18c30a40..c9962ab3b548 100644 > --- a/Documentation/btrfs-inspect-internal.asciidoc > +++ b/Documentation/btrfs-inspect-internal.asciidoc > @@ -61,7 +61,7 @@ specify which mirror to print, valid values are 0, 1 and 2 and the superblock > must be present on the device with a valid signature, can be used together with > '--force' > > -*dump-tree* [options] <device>:: > +*dump-tree* [options] <device> [device...]:: > (replaces the standalone tool *btrfs-debug-tree*) > + > Dump tree structures from a given device in textual form, expand keys to human > @@ -95,6 +95,9 @@ intermixed in the output > --bfs:::: > use breadth-first search to print trees. the nodes are printed before all > leaves > +--device:::: > +do not scan the system for other partner device(s), only use the device(s) > +provided in the argument > -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 > diff --git a/cmds-inspect-dump-tree.c b/cmds-inspect-dump-tree.c > index 1588a0b0774b..8e13b4335a5d 100644 > --- a/cmds-inspect-dump-tree.c > +++ b/cmds-inspect-dump-tree.c > @@ -21,6 +21,7 @@ > #include <unistd.h> > #include <uuid/uuid.h> > #include <getopt.h> > +#include <fcntl.h> > > #include "kerncompat.h" > #include "radix-tree.h" > @@ -185,7 +186,7 @@ static u64 treeid_from_string(const char *str, const char **end) > } > > static const char * const cmd_inspect_dump_tree_usage[] = { > - "btrfs inspect-internal dump-tree [options] device", > + "btrfs inspect-internal dump-tree [options] <device> [<device> ..]", > "Dump tree structures from a given device", > "Dump tree structures from a given device in textual form, expand keys to human", > "readable equivalents where possible.", > @@ -201,6 +202,7 @@ static const char * const cmd_inspect_dump_tree_usage[] = { > " can be specified multiple times", > "-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>", > + "--noscan do not scan for the partner device(s)", > NULL > }; > > @@ -297,7 +299,7 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd, > struct btrfs_key found_key; > struct cache_tree block_root; /* for multiple --block parameters */ > char uuidbuf[BTRFS_UUID_UNPARSED_SIZE]; > - int ret; > + int ret = 0; > int slot; > int extent_only = 0; > int device_only = 0; > @@ -305,6 +307,7 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd, > int roots_only = 0; > int root_backups = 0; > int traverse = BTRFS_PRINT_TREE_DEFAULT; > + int dev_optind; > unsigned open_ctree_flags; > u64 block_bytenr; > struct btrfs_root *tree_root_scan; > @@ -323,8 +326,8 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd, > optind = 0; > while (1) { > int c; > - enum { GETOPT_VAL_FOLLOW = 256, GETOPT_VAL_DFS, > - GETOPT_VAL_BFS }; > + enum { GETOPT_VAL_FOLLOW = 256, GETOPT_VAL_DFS, GETOPT_VAL_BFS, > + GETOPT_VAL_NOSCAN}; > static const struct option long_options[] = { > { "extents", no_argument, NULL, 'e'}, > { "device", no_argument, NULL, 'd'}, > @@ -336,6 +339,7 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd, > { "follow", no_argument, NULL, GETOPT_VAL_FOLLOW }, > { "bfs", no_argument, NULL, GETOPT_VAL_BFS }, > { "dfs", no_argument, NULL, GETOPT_VAL_DFS }, > + { "noscan", no_argument, NULL, GETOPT_VAL_NOSCAN }, > { NULL, 0, NULL, 0 } > }; > > @@ -400,24 +404,49 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd, > case GETOPT_VAL_BFS: > traverse = BTRFS_PRINT_TREE_BFS; > break; > + case GETOPT_VAL_NOSCAN: > + open_ctree_flags |= OPEN_CTREE_NO_DEVICES; > + break; > default: > usage_unknown_option(cmd, argv); > } > } > > - if (check_argc_exact(argc - optind, 1)) > + if (check_argc_min(argc - optind, 1)) > return 1; > > - ret = check_arg_type(argv[optind]); > - if (ret != BTRFS_ARG_BLKDEV && ret != BTRFS_ARG_REG) { > + dev_optind = optind; > + while (dev_optind < argc) { > + int fd; > + struct btrfs_fs_devices *fs_devices; > + u64 num_devices; > + > + ret = check_arg_type(argv[optind]); > + if (ret != BTRFS_ARG_BLKDEV && ret != BTRFS_ARG_REG) { > + if (ret < 0) { > + errno = -ret; > + error("invalid argument %s: %m", argv[dev_optind]); > + } else { > + error("not a block device or regular file: %s", > + argv[dev_optind]); > + } > + } > + fd = open(argv[dev_optind], O_RDONLY); > + if (fd < 0) { > + error("cannot open %s: %m", argv[dev_optind]); > + return -EINVAL; > + } > + ret = btrfs_scan_one_device(fd, argv[dev_optind], &fs_devices, > + &num_devices, > + BTRFS_SUPER_INFO_OFFSET, > + SBREAD_DEFAULT); > + close(fd); > if (ret < 0) { > errno = -ret; > - error("invalid argument %s: %m", argv[optind]); > - } else { > - error("not a block device or regular file: %s", > - argv[optind]); > + error("device scan %s: %m", argv[dev_optind]); > + return ret; > } > - goto out; > + dev_optind++; > } > > printf("%s\n", PACKAGE_STRING); >
On Wed, Jun 26, 2019 at 01:30:17AM -0700, Anand Jain wrote: > From: Anand Jain <Anand.Jain@oracle.com> > > The cli 'btrfs inspect dump-tree <dev>' will scan for the partner devices > if any by default. > > So as of now you can not inspect each mirrored device independently. > > This patch adds noscan option, which when used won't scan the system for > the partner devices, instead it just uses the devices provided in the > argument. > > For example: > btrfs inspect dump-tree --noscan <dev> [<dev>..] > > This helps to debug degraded raid1 and raid10. > > Signed-off-by: Anand Jain <anand.jain@oracle.com> Added to devel, with some minor tweaks. Sorry for the delay. > --- > v6->v7: rebase on latest btrfs-progs::devel > v5->v6: rebase on latest btrfs-progs::devel > v4->v5: nit: use %m to print error string. > changelog update. > v3->v4: change the patch title. > collapse scan_args() to its only parent cmd_inspect_dump_tree() > (it was bit confusing). > update the change log. > update usage. > update man page. > v2->v3: make it scalable for more than two disks in noscan mode > v1->v2: rename --degraded to --noscan > Documentation/btrfs-inspect-internal.asciidoc | 5 +- > cmds-inspect-dump-tree.c | 53 ++++++++++++++----- > 2 files changed, 45 insertions(+), 13 deletions(-) > > diff --git a/Documentation/btrfs-inspect-internal.asciidoc b/Documentation/btrfs-inspect-internal.asciidoc > index 210f18c30a40..c9962ab3b548 100644 > --- a/Documentation/btrfs-inspect-internal.asciidoc > +++ b/Documentation/btrfs-inspect-internal.asciidoc > @@ -61,7 +61,7 @@ specify which mirror to print, valid values are 0, 1 and 2 and the superblock > must be present on the device with a valid signature, can be used together with > '--force' > > -*dump-tree* [options] <device>:: > +*dump-tree* [options] <device> [device...]:: > (replaces the standalone tool *btrfs-debug-tree*) > + > Dump tree structures from a given device in textual form, expand keys to human > @@ -95,6 +95,9 @@ intermixed in the output > --bfs:::: > use breadth-first search to print trees. the nodes are printed before all > leaves > +--device:::: Minor typo, --noscan, fixed.
On Wed, Jun 26, 2019 at 01:30:17AM -0700, Anand Jain wrote: > From: Anand Jain <Anand.Jain@oracle.com> > > The cli 'btrfs inspect dump-tree <dev>' will scan for the partner devices > if any by default. > > So as of now you can not inspect each mirrored device independently. > > This patch adds noscan option, which when used won't scan the system for > the partner devices, instead it just uses the devices provided in the > argument. > > For example: > btrfs inspect dump-tree --noscan <dev> [<dev>..] There were some concerns regarding the option name, I find --noscan acceptable as the meaning of 'scan' is established, besides that --device already exists for dump-tree.
On Wed, Jun 26, 2019 at 01:30:17AM -0700, Anand Jain wrote: > From: Anand Jain <Anand.Jain@oracle.com> > > The cli 'btrfs inspect dump-tree <dev>' will scan for the partner devices > if any by default. > > So as of now you can not inspect each mirrored device independently. > > This patch adds noscan option, which when used won't scan the system for > the partner devices, instead it just uses the devices provided in the > argument. > > For example: > btrfs inspect dump-tree --noscan <dev> [<dev>..] > > This helps to debug degraded raid1 and raid10. > > Signed-off-by: Anand Jain <anand.jain@oracle.com> This makes misc-test/021-image-multi-devices fail ====== RUN CHECK root_helper mount /dev/loop2 .../btrfs-progs/tests//mnt ====== RUN CHECK md5sum .../btrfs-progs/tests//mnt/foobar md5sum: .../btrfs-progs/tests//mnt/foobar: Input/output error failed: md5sum .../btrfs-progs/tests//mnt/foobar ====== RUN CHECK root_helper umount .../btrfs-progs/tests//mnt ====== RUN CHECK root_helper losetup -d /dev/loop2 ====== RUN CHECK root_helper losetup -d /dev/loop3 note the md5sum error, that does not happen otherwise
> On 4 Jul 2019, at 12:09 AM, David Sterba <dsterba@suse.cz> wrote: > > On Wed, Jun 26, 2019 at 01:30:17AM -0700, Anand Jain wrote: >> From: Anand Jain <Anand.Jain@oracle.com> >> >> The cli 'btrfs inspect dump-tree <dev>' will scan for the partner devices >> if any by default. >> >> So as of now you can not inspect each mirrored device independently. >> >> This patch adds noscan option, which when used won't scan the system for >> the partner devices, instead it just uses the devices provided in the >> argument. >> >> For example: >> btrfs inspect dump-tree --noscan <dev> [<dev>..] >> >> This helps to debug degraded raid1 and raid10. >> >> Signed-off-by: Anand Jain <anand.jain@oracle.com> > > This makes misc-test/021-image-multi-devices fail > > ====== RUN CHECK root_helper mount /dev/loop2 .../btrfs-progs/tests//mnt > ====== RUN CHECK md5sum .../btrfs-progs/tests//mnt/foobar > md5sum: .../btrfs-progs/tests//mnt/foobar: Input/output error > failed: md5sum .../btrfs-progs/tests//mnt/foobar > ====== RUN CHECK root_helper umount .../btrfs-progs/tests//mnt > ====== RUN CHECK root_helper losetup -d /dev/loop2 > ====== RUN CHECK root_helper losetup -d /dev/loop3 > > note the md5sum error, that does not happen otherwise I am on devel. It runs fine. Test-misc/021 doesn’t use dump-tree at all. Its strange that mnt/foobar fails to read in your case. ---- [root@dvm btrfs-progs]# make TEST=021\* test-misc [LD] fssum [TEST] misc-tests.sh [TEST/misc] 021-image-multi-devices [root@dvm btrfs-progs]# [root@dvm btrfs-progs]# [root@dvm btrfs-progs]# [root@dvm btrfs-progs]# gl | head -1 299892f3c43d btrfs-progs: dump-tree: add noscan option [root@dvm btrfs-progs]# make all make: Nothing to be done for `all'. [root@dvm btrfs-progs]# ------
On Thu, Jul 04, 2019 at 06:16:54AM +0800, Anand Jain wrote: > > > > On 4 Jul 2019, at 12:09 AM, David Sterba <dsterba@suse.cz> wrote: > > > > On Wed, Jun 26, 2019 at 01:30:17AM -0700, Anand Jain wrote: > >> From: Anand Jain <Anand.Jain@oracle.com> > >> > >> The cli 'btrfs inspect dump-tree <dev>' will scan for the partner devices > >> if any by default. > >> > >> So as of now you can not inspect each mirrored device independently. > >> > >> This patch adds noscan option, which when used won't scan the system for > >> the partner devices, instead it just uses the devices provided in the > >> argument. > >> > >> For example: > >> btrfs inspect dump-tree --noscan <dev> [<dev>..] > >> > >> This helps to debug degraded raid1 and raid10. > >> > >> Signed-off-by: Anand Jain <anand.jain@oracle.com> > > > > This makes misc-test/021-image-multi-devices fail > > > > ====== RUN CHECK root_helper mount /dev/loop2 .../btrfs-progs/tests//mnt > > ====== RUN CHECK md5sum .../btrfs-progs/tests//mnt/foobar > > md5sum: .../btrfs-progs/tests//mnt/foobar: Input/output error > > failed: md5sum .../btrfs-progs/tests//mnt/foobar > > ====== RUN CHECK root_helper umount .../btrfs-progs/tests//mnt > > ====== RUN CHECK root_helper losetup -d /dev/loop2 > > ====== RUN CHECK root_helper losetup -d /dev/loop3 > > > > note the md5sum error, that does not happen otherwise > > > I am on devel. It runs fine. Test-misc/021 doesn’t use dump-tree at all. > Its strange that mnt/foobar fails to read in your case. Sorry, I replied to the wrong patch, it's the other one "btrfs-progs: dump-tree: add noscan option".
> On 4 Jul 2019, at 7:39 AM, David Sterba <dsterba@suse.cz> wrote: > > On Thu, Jul 04, 2019 at 06:16:54AM +0800, Anand Jain wrote: >> >> >>> On 4 Jul 2019, at 12:09 AM, David Sterba <dsterba@suse.cz> wrote: >>> >>> On Wed, Jun 26, 2019 at 01:30:17AM -0700, Anand Jain wrote: >>>> From: Anand Jain <Anand.Jain@oracle.com> >>>> >>>> The cli 'btrfs inspect dump-tree <dev>' will scan for the partner devices >>>> if any by default. >>>> >>>> So as of now you can not inspect each mirrored device independently. >>>> >>>> This patch adds noscan option, which when used won't scan the system for >>>> the partner devices, instead it just uses the devices provided in the >>>> argument. >>>> >>>> For example: >>>> btrfs inspect dump-tree --noscan <dev> [<dev>..] >>>> >>>> This helps to debug degraded raid1 and raid10. >>>> >>>> Signed-off-by: Anand Jain <anand.jain@oracle.com> >>> >>> This makes misc-test/021-image-multi-devices fail >>> >>> ====== RUN CHECK root_helper mount /dev/loop2 .../btrfs-progs/tests//mnt >>> ====== RUN CHECK md5sum .../btrfs-progs/tests//mnt/foobar >>> md5sum: .../btrfs-progs/tests//mnt/foobar: Input/output error >>> failed: md5sum .../btrfs-progs/tests//mnt/foobar >>> ====== RUN CHECK root_helper umount .../btrfs-progs/tests//mnt >>> ====== RUN CHECK root_helper losetup -d /dev/loop2 >>> ====== RUN CHECK root_helper losetup -d /dev/loop3 >>> >>> note the md5sum error, that does not happen otherwise >> >> >> I am on devel. It runs fine. Test-misc/021 doesn’t use dump-tree at all. >> Its strange that mnt/foobar fails to read in your case. > > Sorry, I replied to the wrong patch, > it's the other one "btrfs-progs: > dump-tree: add noscan option”. Typo in the other one? Because "dump-tree: add noscan option” is this.
diff --git a/Documentation/btrfs-inspect-internal.asciidoc b/Documentation/btrfs-inspect-internal.asciidoc index 210f18c30a40..c9962ab3b548 100644 --- a/Documentation/btrfs-inspect-internal.asciidoc +++ b/Documentation/btrfs-inspect-internal.asciidoc @@ -61,7 +61,7 @@ specify which mirror to print, valid values are 0, 1 and 2 and the superblock must be present on the device with a valid signature, can be used together with '--force' -*dump-tree* [options] <device>:: +*dump-tree* [options] <device> [device...]:: (replaces the standalone tool *btrfs-debug-tree*) + Dump tree structures from a given device in textual form, expand keys to human @@ -95,6 +95,9 @@ intermixed in the output --bfs:::: use breadth-first search to print trees. the nodes are printed before all leaves +--device:::: +do not scan the system for other partner device(s), only use the device(s) +provided in the argument -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 diff --git a/cmds-inspect-dump-tree.c b/cmds-inspect-dump-tree.c index 1588a0b0774b..8e13b4335a5d 100644 --- a/cmds-inspect-dump-tree.c +++ b/cmds-inspect-dump-tree.c @@ -21,6 +21,7 @@ #include <unistd.h> #include <uuid/uuid.h> #include <getopt.h> +#include <fcntl.h> #include "kerncompat.h" #include "radix-tree.h" @@ -185,7 +186,7 @@ static u64 treeid_from_string(const char *str, const char **end) } static const char * const cmd_inspect_dump_tree_usage[] = { - "btrfs inspect-internal dump-tree [options] device", + "btrfs inspect-internal dump-tree [options] <device> [<device> ..]", "Dump tree structures from a given device", "Dump tree structures from a given device in textual form, expand keys to human", "readable equivalents where possible.", @@ -201,6 +202,7 @@ static const char * const cmd_inspect_dump_tree_usage[] = { " can be specified multiple times", "-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>", + "--noscan do not scan for the partner device(s)", NULL }; @@ -297,7 +299,7 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd, struct btrfs_key found_key; struct cache_tree block_root; /* for multiple --block parameters */ char uuidbuf[BTRFS_UUID_UNPARSED_SIZE]; - int ret; + int ret = 0; int slot; int extent_only = 0; int device_only = 0; @@ -305,6 +307,7 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd, int roots_only = 0; int root_backups = 0; int traverse = BTRFS_PRINT_TREE_DEFAULT; + int dev_optind; unsigned open_ctree_flags; u64 block_bytenr; struct btrfs_root *tree_root_scan; @@ -323,8 +326,8 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd, optind = 0; while (1) { int c; - enum { GETOPT_VAL_FOLLOW = 256, GETOPT_VAL_DFS, - GETOPT_VAL_BFS }; + enum { GETOPT_VAL_FOLLOW = 256, GETOPT_VAL_DFS, GETOPT_VAL_BFS, + GETOPT_VAL_NOSCAN}; static const struct option long_options[] = { { "extents", no_argument, NULL, 'e'}, { "device", no_argument, NULL, 'd'}, @@ -336,6 +339,7 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd, { "follow", no_argument, NULL, GETOPT_VAL_FOLLOW }, { "bfs", no_argument, NULL, GETOPT_VAL_BFS }, { "dfs", no_argument, NULL, GETOPT_VAL_DFS }, + { "noscan", no_argument, NULL, GETOPT_VAL_NOSCAN }, { NULL, 0, NULL, 0 } }; @@ -400,24 +404,49 @@ static int cmd_inspect_dump_tree(const struct cmd_struct *cmd, case GETOPT_VAL_BFS: traverse = BTRFS_PRINT_TREE_BFS; break; + case GETOPT_VAL_NOSCAN: + open_ctree_flags |= OPEN_CTREE_NO_DEVICES; + break; default: usage_unknown_option(cmd, argv); } } - if (check_argc_exact(argc - optind, 1)) + if (check_argc_min(argc - optind, 1)) return 1; - ret = check_arg_type(argv[optind]); - if (ret != BTRFS_ARG_BLKDEV && ret != BTRFS_ARG_REG) { + dev_optind = optind; + while (dev_optind < argc) { + int fd; + struct btrfs_fs_devices *fs_devices; + u64 num_devices; + + ret = check_arg_type(argv[optind]); + if (ret != BTRFS_ARG_BLKDEV && ret != BTRFS_ARG_REG) { + if (ret < 0) { + errno = -ret; + error("invalid argument %s: %m", argv[dev_optind]); + } else { + error("not a block device or regular file: %s", + argv[dev_optind]); + } + } + fd = open(argv[dev_optind], O_RDONLY); + if (fd < 0) { + error("cannot open %s: %m", argv[dev_optind]); + return -EINVAL; + } + ret = btrfs_scan_one_device(fd, argv[dev_optind], &fs_devices, + &num_devices, + BTRFS_SUPER_INFO_OFFSET, + SBREAD_DEFAULT); + close(fd); if (ret < 0) { errno = -ret; - error("invalid argument %s: %m", argv[optind]); - } else { - error("not a block device or regular file: %s", - argv[optind]); + error("device scan %s: %m", argv[dev_optind]); + return ret; } - goto out; + dev_optind++; } printf("%s\n", PACKAGE_STRING);