aboutsummaryrefslogtreecommitdiffstats
path: root/cmd
diff options
context:
space:
mode:
authorAkash B <[email protected]>2023-11-28 03:11:58 +0530
committerGitHub <[email protected]>2023-11-27 13:41:58 -0800
commitc1a47de86fd5edde091e68e8e91840d3cb9c55b0 (patch)
tree5efb3566b0db88ced00a1c9556e342e32a69fb12 /cmd
parent213d6829673ce28095f7c15b8fb65e1ade91d20a (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.c39
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