diff options
author | Akash B <[email protected]> | 2023-11-28 03:11:58 +0530 |
---|---|---|
committer | GitHub <[email protected]> | 2023-11-27 13:41:58 -0800 |
commit | c1a47de86fd5edde091e68e8e91840d3cb9c55b0 (patch) | |
tree | 5efb3566b0db88ced00a1c9556e342e32a69fb12 /cmd | |
parent | 213d6829673ce28095f7c15b8fb65e1ade91d20a (diff) |
zdb: Fix zdb '-O|-r' options with -e/exported zpool
zdb with '-e' or exported zpool doesn't work along with
'-O' and '-r' options as we process them before '-e' has
been processed.
Below errors are seen:
~> zdb -e pool-mds65/mdt65 -O oi.9/0x200000009:0x0:0x0
failed to hold dataset 'pool-mds65/mdt65': No such file or directory
~> zdb -e pool-oss0/ost0 -r file1 /tmp/filecopy1 -p.
failed to hold dataset 'pool-oss0/ost0': No such file or directory
zdb: internal error: No such file or directory
We need to make sure to process '-O|-r' options after the
'-e' option has been processed, which imports the pool to
the namespace if it's not in the cachefile.
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Akash B <[email protected]>
Closes #15532
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/zdb/zdb.c | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c index e8726915c..486bec991 100644 --- a/cmd/zdb/zdb.c +++ b/cmd/zdb/zdb.c @@ -9179,22 +9179,6 @@ main(int argc, char **argv) if (dump_opt['l']) return (dump_label(argv[0])); - if (dump_opt['O']) { - if (argc != 2) - usage(); - dump_opt['v'] = verbose + 3; - return (dump_path(argv[0], argv[1], NULL)); - } - if (dump_opt['r']) { - target_is_spa = B_FALSE; - if (argc != 3) - usage(); - dump_opt['v'] = verbose; - error = dump_path(argv[0], argv[1], &object); - if (error != 0) - fatal("internal error: %s", strerror(error)); - } - if (dump_opt['X'] || dump_opt['F']) rewind = ZPOOL_DO_REWIND | (dump_opt['X'] ? ZPOOL_EXTREME_REWIND : 0); @@ -9296,6 +9280,29 @@ main(int argc, char **argv) } /* + * We need to make sure to process -O option or call + * dump_path after the -e option has been processed, + * which imports the pool to the namespace if it's + * not in the cachefile. + */ + if (dump_opt['O']) { + if (argc != 2) + usage(); + dump_opt['v'] = verbose + 3; + return (dump_path(argv[0], argv[1], NULL)); + } + + if (dump_opt['r']) { + target_is_spa = B_FALSE; + if (argc != 3) + usage(); + dump_opt['v'] = verbose; + error = dump_path(argv[0], argv[1], &object); + if (error != 0) + fatal("internal error: %s", strerror(error)); + } + + /* * import_checkpointed_state makes the assumption that the * target pool that we pass it is already part of the spa * namespace. Because of that we need to make sure to call |