summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorVictor Latushkin <Victor.Latushkin@Sun.COM>2009-10-25 05:02:46 +0300
committerVictor Latushkin <Victor.Latushkin@Sun.COM>2009-10-25 05:02:46 +0300
commit07428bdfb7bca7c9e74959692785555ea5e27ce2 (patch)
tree0f6132d7cc231288487b46cc599f2617a469d30f /usr/src
parent6de8f417ed556c30c2c5d24961e26ca586e636a1 (diff)
downloadillumos-joyent-07428bdfb7bca7c9e74959692785555ea5e27ce2.tar.gz
6736356 zdb -R/-C needs to work with exported pools
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/mdb/common/modules/zfs/zfs.c2
-rw-r--r--usr/src/cmd/zdb/zdb.c151
2 files changed, 74 insertions, 79 deletions
diff --git a/usr/src/cmd/mdb/common/modules/zfs/zfs.c b/usr/src/cmd/mdb/common/modules/zfs/zfs.c
index b75f0d95fc..6a600d3fe6 100644
--- a/usr/src/cmd/mdb/common/modules/zfs/zfs.c
+++ b/usr/src/cmd/mdb/common/modules/zfs/zfs.c
@@ -452,7 +452,7 @@ blkptr(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
mdb_printf("DVA[%d]: GANG: %-5s GRID: %04x\t"
"ASIZE: %llx\n", i, DVA_GET_GANG(dva) ? "TRUE" : "FALSE",
(int)DVA_GET_GRID(dva), DVA_GET_ASIZE(dva));
- mdb_printf("DVA[%d]: :%llu:%llx:%llx:%s%s%s%s\n", i,
+ mdb_printf("DVA[%d]: %llu:%llx:%llx:%s%s%s%s\n", i,
DVA_GET_VDEV(dva), DVA_GET_OFFSET(dva), BP_GET_PSIZE(&bp),
BP_SHOULD_BYTESWAP(&bp) ? "e" : "",
!DVA_GET_GANG(dva) && BP_GET_LEVEL(&bp) != 0 ? "i" : "",
diff --git a/usr/src/cmd/zdb/zdb.c b/usr/src/cmd/zdb/zdb.c
index ce247b5305..42dd41f5ed 100644
--- a/usr/src/cmd/zdb/zdb.c
+++ b/usr/src/cmd/zdb/zdb.c
@@ -98,9 +98,9 @@ usage(void)
"Usage: %s [-CumdibcsvhL] [-S user:cksumalg] "
"poolname [object...]\n"
" %s [-div] dataset [object...]\n"
- " %s -C [pool]\n"
- " %s -l dev\n"
- " %s -R pool:vdev:offset:size:flags\n\n",
+ " %s -R poolname vdev:offset:size[:flags]\n"
+ " %s -l device\n"
+ " %s -C\n\n",
cmdname, cmdname, cmdname, cmdname, cmdname);
(void) fprintf(stderr, " Dataset name must include at least one "
@@ -113,7 +113,7 @@ usage(void)
(void) fprintf(stderr, " -u uberblock\n");
(void) fprintf(stderr, " -d dataset(s)\n");
(void) fprintf(stderr, " -i intent logs\n");
- (void) fprintf(stderr, " -C cached pool configuration\n");
+ (void) fprintf(stderr, " -C config (or cachefile if alone)\n");
(void) fprintf(stderr, " -h pool history\n");
(void) fprintf(stderr, " -b block statistics\n");
(void) fprintf(stderr, " -m metaslabs\n");
@@ -1293,7 +1293,7 @@ dump_uberblock(uberblock_t *ub)
{
time_t timestamp = ub->ub_timestamp;
- (void) printf("Uberblock\n\n");
+ (void) printf("\nUberblock:\n");
(void) printf("\tmagic = %016llx\n", (u_longlong_t)ub->ub_magic);
(void) printf("\tversion = %llu\n", (u_longlong_t)ub->ub_version);
(void) printf("\ttxg = %llu\n", (u_longlong_t)ub->ub_txg);
@@ -1309,18 +1309,27 @@ dump_uberblock(uberblock_t *ub)
}
static void
-dump_config(const char *pool)
+dump_config(spa_t *spa)
{
- spa_t *spa = NULL;
+ dmu_buf_t *db;
+ size_t nvsize = 0;
+ int error = 0;
+
- mutex_enter(&spa_namespace_lock);
- while ((spa = spa_next(spa)) != NULL) {
- if (pool == NULL)
- (void) printf("%s\n", spa_name(spa));
- if (pool == NULL || strcmp(pool, spa_name(spa)) == 0)
- dump_nvlist(spa->spa_config, 4);
+ error = dmu_bonus_hold(spa->spa_meta_objset,
+ spa->spa_config_object, FTAG, &db);
+
+ if (error == 0) {
+ nvsize = *(uint64_t *)db->db_data;
+ dmu_buf_rele(db, FTAG);
+
+ (void) printf("\nMOS Configuration:\n");
+ dump_packed_nvlist(spa->spa_meta_objset,
+ spa->spa_config_object, (void *)&nvsize, 1);
+ } else {
+ (void) fprintf(stderr, "dmu_bonus_hold(%llu) failed, errno %d",
+ (u_longlong_t)spa->spa_config_object, error);
}
- mutex_exit(&spa_namespace_lock);
}
static void
@@ -1855,6 +1864,14 @@ dump_zpool(spa_t *spa)
dsl_pool_t *dp = spa_get_dsl(spa);
int rc = 0;
+ if (!dump_opt['e'] && dump_opt['C'] > 1) {
+ (void) printf("\nCached configuration:\n");
+ dump_nvlist(spa->spa_config, 8);
+ }
+
+ if (dump_opt['C'])
+ dump_config(spa);
+
if (dump_opt['u'])
dump_uberblock(&spa->spa_uberblock);
@@ -1869,8 +1886,8 @@ dump_zpool(spa_t *spa)
if (dump_opt['d'] >= 3 || dump_opt['m'])
dump_metaslabs(spa);
- (void) dmu_objset_find(spa_name(spa), dump_one_dir, NULL,
- DS_FIND_SNAPSHOTS | DS_FIND_CHILDREN);
+ (void) dmu_objset_find(spa_name(spa), dump_one_dir,
+ NULL, DS_FIND_SNAPSHOTS | DS_FIND_CHILDREN);
}
if (dump_opt['b'] || dump_opt['c'] || dump_opt['S'])
@@ -1919,7 +1936,7 @@ zdb_print_blkptr(blkptr_t *bp, int flags)
DVA_GET_GANG(&dva[d]) ? "TRUE" : "FALSE",
(longlong_t)DVA_GET_GRID(&dva[d]),
(longlong_t)DVA_GET_ASIZE(&dva[d]));
- (void) printf("\tDVA[%d]: :%llu:%llx:%llx:%s%s%s%s\n", d,
+ (void) printf("\tDVA[%d]: %llu:%llx:%llx:%s%s%s%s\n", d,
(u_longlong_t)DVA_GET_VDEV(&dva[d]),
(longlong_t)DVA_GET_OFFSET(&dva[d]),
(longlong_t)BP_GET_PSIZE(bp),
@@ -2080,21 +2097,18 @@ name:
* * = not yet implemented
*/
static void
-zdb_read_block(char *thing, spa_t **spap)
+zdb_read_block(char *thing, spa_t *spa)
{
- spa_t *spa = *spap;
int flags = 0;
uint64_t offset = 0, size = 0, blkptr_offset = 0;
zio_t *zio;
vdev_t *vd;
void *buf;
- char *s, *p, *dup, *pool, *vdev, *flagstr;
+ char *s, *p, *dup, *vdev, *flagstr;
int i, error, zio_flags;
dup = strdup(thing);
s = strtok(dup, ":");
- pool = s ? s : "";
- s = strtok(NULL, ":");
vdev = s ? s : "";
s = strtok(NULL, ":");
offset = strtoull(s ? s : "", NULL, 16);
@@ -2143,16 +2157,6 @@ zdb_read_block(char *thing, spa_t **spap)
}
}
- if (spa == NULL || strcmp(spa_name(spa), pool) != 0) {
- if (spa)
- spa_close(spa, (void *)zdb_read_block);
- error = spa_open(pool, spap, (void *)zdb_read_block);
- if (error)
- fatal("Failed to open pool '%s': %s",
- pool, strerror(error));
- spa = *spap;
- }
-
vd = zdb_vdev_lookup(spa->spa_root_vdev, vdev);
if (vd == NULL) {
(void) printf("***Invalid vdev: %s\n", vdev);
@@ -2300,7 +2304,7 @@ main(int argc, char **argv)
dprintf_setup(&argc, argv);
- while ((c = getopt(argc, argv, "udhibcmsvCLS:U:lRep:t:")) != -1) {
+ while ((c = getopt(argc, argv, "udhibcmsvCLS:RU:lep:t:")) != -1) {
switch (c) {
case 'u':
case 'd':
@@ -2392,6 +2396,8 @@ main(int argc, char **argv)
argc -= optind;
argv += optind;
+ if (argc < 2 && dump_opt['R'])
+ usage();
if (argc < 1) {
if (!dump_opt['e'] && dump_opt['C']) {
dump_cachefile(spa_config_path);
@@ -2405,30 +2411,6 @@ main(int argc, char **argv)
return (0);
}
- if (dump_opt['R']) {
- flagbits['b'] = ZDB_FLAG_PRINT_BLKPTR;
- flagbits['c'] = ZDB_FLAG_CHECKSUM;
- flagbits['d'] = ZDB_FLAG_DECOMPRESS;
- flagbits['e'] = ZDB_FLAG_BSWAP;
- flagbits['g'] = ZDB_FLAG_GBH;
- flagbits['i'] = ZDB_FLAG_INDIRECT;
- flagbits['p'] = ZDB_FLAG_PHYS;
- flagbits['r'] = ZDB_FLAG_RAW;
-
- spa = NULL;
- while (argv[0]) {
- zdb_read_block(argv[0], &spa);
- argv++;
- argc--;
- }
- if (spa)
- spa_close(spa, (void *)zdb_read_block);
- return (0);
- }
-
- if (dump_opt['C'])
- dump_config(argv[0]);
-
error = 0;
target = argv[0];
@@ -2438,16 +2420,17 @@ main(int argc, char **argv)
error = ENOENT;
if (name) {
+ if (dump_opt['C'] > 1) {
+ (void) printf("\nConfiguration for import:\n");
+ dump_nvlist(cfg, 8);
+ }
if ((error = spa_import(name, cfg, NULL)) != 0)
error = spa_import_verbatim(name, cfg, NULL);
}
}
if (error == 0) {
- if (strpbrk(target, "/@") != NULL) {
- error = dmu_objset_own(target, DMU_OST_ANY,
- B_TRUE, FTAG, &os);
- } else {
+ if (strpbrk(target, "/@") == NULL || dump_opt['R']) {
error = spa_open(target, &spa, FTAG);
if (error) {
/*
@@ -2466,33 +2449,45 @@ main(int argc, char **argv)
if (!error)
error = spa_open(target, &spa, FTAG);
}
+ } else {
+ error = dmu_objset_own(target, DMU_OST_ANY,
+ B_TRUE, FTAG, &os);
}
}
-
if (error)
fatal("can't open '%s': %s", target, strerror(error));
argv++;
- if (--argc > 0) {
- zopt_objects = argc;
- zopt_object = calloc(zopt_objects, sizeof (uint64_t));
- for (i = 0; i < zopt_objects; i++) {
- errno = 0;
- zopt_object[i] = strtoull(argv[i], NULL, 0);
- if (zopt_object[i] == 0 && errno != 0)
- fatal("bad object number %s: %s",
- argv[i], strerror(errno));
+ argc--;
+ if (!dump_opt['R']) {
+ if (argc > 0) {
+ zopt_objects = argc;
+ zopt_object = calloc(zopt_objects, sizeof (uint64_t));
+ for (i = 0; i < zopt_objects; i++) {
+ errno = 0;
+ zopt_object[i] = strtoull(argv[i], NULL, 0);
+ if (zopt_object[i] == 0 && errno != 0)
+ fatal("bad object number %s: %s",
+ argv[i], strerror(errno));
+ }
}
- }
-
- if (os != NULL) {
- dump_dir(os);
- dmu_objset_disown(os, FTAG);
+ (os != NULL) ? dump_dir(os) : dump_zpool(spa);
} else {
- dump_zpool(spa);
- spa_close(spa, FTAG);
+ flagbits['b'] = ZDB_FLAG_PRINT_BLKPTR;
+ flagbits['c'] = ZDB_FLAG_CHECKSUM;
+ flagbits['d'] = ZDB_FLAG_DECOMPRESS;
+ flagbits['e'] = ZDB_FLAG_BSWAP;
+ flagbits['g'] = ZDB_FLAG_GBH;
+ flagbits['i'] = ZDB_FLAG_INDIRECT;
+ flagbits['p'] = ZDB_FLAG_PHYS;
+ flagbits['r'] = ZDB_FLAG_RAW;
+
+ for (i = 0; i < argc; i++)
+ zdb_read_block(argv[i], spa);
}
+ (os != NULL) ? dmu_objset_disown(os, FTAG) : spa_close(spa, FTAG);
+
fuid_table_destroy();
libzfs_fini(g_zfs);