diff options
author | Serapheim Dimitropoulos <[email protected]> | 2018-10-30 09:46:18 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2018-10-30 11:46:18 -0500 |
commit | 0a544c174d54d9adcea2faf5817596174582139e (patch) | |
tree | e6dae62fe20d54d8313ce699784c83c33f2281e9 /cmd | |
parent | 63a77ae3cff2eea8f7d92c5ab2ab99af664b34a5 (diff) |
zdb -k does not work on Linux when used with -e
This minor bug was introduced with the port of the feature from
OpenZFS to ZoL. This patch fixes the issue that was caused by
a minor re-ordering from the original code.
Reviewed-by: Matthew Ahrens <[email protected]>
Reviewed-by: George Melikov <[email protected]>
Reviewed-by: Tim Chase <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Serapheim Dimitropoulos <[email protected]>
Closes #8001
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/zdb/zdb.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c index cdea1e584..737217538 100644 --- a/cmd/zdb/zdb.c +++ b/cmd/zdb/zdb.c @@ -6057,17 +6057,6 @@ main(int argc, char **argv) error = 0; target = argv[0]; - char *checkpoint_pool = NULL; - char *checkpoint_target = NULL; - if (dump_opt['k']) { - checkpoint_pool = import_checkpointed_state(target, cfg, - &checkpoint_target); - - if (checkpoint_target != NULL) - target = checkpoint_target; - - } - if (strpbrk(target, "/@") != NULL) { size_t targetlen; @@ -6113,6 +6102,24 @@ main(int argc, char **argv) } } + /* + * 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 + * it always after the -e option has been processed, which + * imports the pool to the namespace if it's not in the + * cachefile. + */ + char *checkpoint_pool = NULL; + char *checkpoint_target = NULL; + if (dump_opt['k']) { + checkpoint_pool = import_checkpointed_state(target, cfg, + &checkpoint_target); + + if (checkpoint_target != NULL) + target = checkpoint_target; + } + if (target_pool != target) free(target_pool); |