Skip to content

Commit

Permalink
Fix zdb -ed on objset for exported pool
Browse files Browse the repository at this point in the history
zdb -ed on objset for exported pool would failed with:
  failed to own dataset 'qq/fs0': No such file or directory

The reason is that zdb pass objset name to spa_import, it uses that
name to create a spa. Later, when dmu_objset_own tries to lookup the spa
using real pool name, it can't find one.

We fix this by make sure we pass pool name rather than objset name to
spa_import.

Signed-off-by: Chunwei Chen <[email protected]>
  • Loading branch information
davidchenntnx committed Feb 2, 2018
1 parent fbe67e7 commit caaedd0
Showing 1 changed file with 21 additions and 11 deletions.
32 changes: 21 additions & 11 deletions cmd/zdb/zdb.c
Original file line number Diff line number Diff line change
Expand Up @@ -4270,7 +4270,7 @@ main(int argc, char **argv)
int error = 0;
char **searchdirs = NULL;
int nsearch = 0;
char *target;
char *target, *target_pool;
nvlist_t *policy = NULL;
uint64_t max_txg = UINT64_MAX;
int flags = ZFS_IMPORT_MISSING_LOG;
Expand Down Expand Up @@ -4473,6 +4473,20 @@ main(int argc, char **argv)
error = 0;
target = argv[0];

if (strpbrk(target, "/@") != NULL) {
size_t targetlen;

target_pool = strdup(target);
*strpbrk(target_pool, "/@") = '\0';

target_is_spa = B_FALSE;
targetlen = strlen(target);
if (targetlen && target[targetlen - 1] == '/')
target[targetlen - 1] = '\0';
} else {
target_pool = target;
}

if (dump_opt['e']) {
importargs_t args = { 0 };
nvlist_t *cfg = NULL;
Expand All @@ -4481,8 +4495,10 @@ main(int argc, char **argv)
args.path = searchdirs;
args.can_be_active = B_TRUE;

error = zpool_tryimport(g_zfs, target, &cfg, &args);
error = zpool_tryimport(g_zfs, target_pool, &cfg, &args);

if (error == 0) {

if (nvlist_add_nvlist(cfg,
ZPOOL_REWIND_POLICY, policy) != 0) {
fatal("can't open '%s': %s",
Expand All @@ -4497,19 +4513,13 @@ main(int argc, char **argv)
(void) printf("\nConfiguration for import:\n");
dump_nvlist(cfg, 8);
}
error = spa_import(target, cfg, NULL,
error = spa_import(target_pool, cfg, NULL,
flags | ZFS_IMPORT_SKIP_MMP);
}
}

if (strpbrk(target, "/@") != NULL) {
size_t targetlen;

target_is_spa = B_FALSE;
targetlen = strlen(target);
if (targetlen && target[targetlen - 1] == '/')
target[targetlen - 1] = '\0';
}
if (target_pool != target)
free(target_pool);

if (error == 0) {
if (target_is_spa || dump_opt['R']) {
Expand Down

0 comments on commit caaedd0

Please sign in to comment.