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 <behlendorf1@llnl.gov> Signed-off-by: Akash B <akash-b@hpe.com> Closes #15532
This commit is contained in:
parent
e96675a7b1
commit
e4985bf5a1
|
@ -9164,22 +9164,6 @@ main(int argc, char **argv)
|
||||||
if (dump_opt['l'])
|
if (dump_opt['l'])
|
||||||
return (dump_label(argv[0]));
|
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'])
|
if (dump_opt['X'] || dump_opt['F'])
|
||||||
rewind = ZPOOL_DO_REWIND |
|
rewind = ZPOOL_DO_REWIND |
|
||||||
(dump_opt['X'] ? ZPOOL_EXTREME_REWIND : 0);
|
(dump_opt['X'] ? ZPOOL_EXTREME_REWIND : 0);
|
||||||
|
@ -9280,6 +9264,29 @@ main(int argc, char **argv)
|
||||||
searchdirs = NULL;
|
searchdirs = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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
|
* import_checkpointed_state makes the assumption that the
|
||||||
* target pool that we pass it is already part of the spa
|
* target pool that we pass it is already part of the spa
|
||||||
|
|
Loading…
Reference in New Issue