usr/src/cmd/zdb/zdb.c
author mc142369
Thu, 19 Apr 2007 15:50:31 -0700
changeset 4070 4390ea390a1e
parent 3912 f6891a60bd72
child 4527 5d5b6ba91b17
permissions -rw-r--r--
6386594 zdb message should be clearer when failing for lack of permissions
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     1
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     2
 * CDDL HEADER START
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     3
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
     5
 * Common Development and Distribution License (the "License").
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
     6
 * You may not use this file except in compliance with the License.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     7
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    11
 * and limitations under the License.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    12
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    18
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    19
 * CDDL HEADER END
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    20
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    21
/*
3361
a3d194896a76 6480230 ::walk spa|::walk zms_freelist cause mdb to core dump
ck153898
parents: 3060
diff changeset
    22
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    23
 * Use is subject to license terms.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    24
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    25
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    26
#pragma ident	"%Z%%M%	%I%	%E% SMI"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    27
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
#include <stdio.h>
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 1807
diff changeset
    29
#include <stdio_ext.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
#include <stdlib.h>
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
    31
#include <ctype.h>
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
#include <sys/zfs_context.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    33
#include <sys/spa.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    34
#include <sys/spa_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
#include <sys/dmu.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    36
#include <sys/zap.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    37
#include <sys/fs/zfs.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    38
#include <sys/zfs_znode.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    39
#include <sys/vdev.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    40
#include <sys/vdev_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    41
#include <sys/metaslab_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    42
#include <sys/dmu_objset.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    43
#include <sys/dsl_dir.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    44
#include <sys/dsl_dataset.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    45
#include <sys/dsl_pool.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    46
#include <sys/dbuf.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    47
#include <sys/zil.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    48
#include <sys/zil_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    49
#include <sys/stat.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    50
#include <sys/resource.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    51
#include <sys/dmu_traverse.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    52
#include <sys/zio_checksum.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    53
#include <sys/zio_compress.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    54
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    55
const char cmdname[] = "zdb";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    56
uint8_t dump_opt[256];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    57
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    58
typedef void object_viewer_t(objset_t *, uint64_t, void *data, size_t size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    59
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    60
extern void dump_intent_log(zilog_t *);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    61
uint64_t *zopt_object = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    62
int zopt_objects = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    63
int zdb_advance = ADVANCE_PRE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    64
zbookmark_t zdb_noread = { 0, 0, ZB_NO_LEVEL, 0 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    65
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    66
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    67
 * These libumem hooks provide a reasonable set of defaults for the allocator's
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    68
 * debugging facilities.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    69
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    70
const char *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    71
_umem_debug_init()
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    72
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    73
	return ("default,verbose"); /* $UMEM_DEBUG setting */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    74
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    75
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    76
const char *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    77
_umem_logging_init(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    78
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    79
	return ("fail,contents"); /* $UMEM_LOGGING setting */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    80
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    81
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    82
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    83
usage(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    84
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    85
	(void) fprintf(stderr,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    86
	    "Usage: %s [-udibcsvLU] [-O order] [-B os:obj:level:blkid] "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    87
	    "dataset [object...]\n"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    88
	    "       %s -C [pool]\n"
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
    89
	    "       %s -l dev\n"
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
    90
	    "       %s -R vdev:offset:size:flags\n",
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
    91
	    cmdname, cmdname, cmdname, cmdname);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    92
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    93
	(void) fprintf(stderr, "	-u uberblock\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    94
	(void) fprintf(stderr, "	-d datasets\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    95
	(void) fprintf(stderr, "        -C cached pool configuration\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    96
	(void) fprintf(stderr, "	-i intent logs\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    97
	(void) fprintf(stderr, "	-b block statistics\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    98
	(void) fprintf(stderr, "	-c checksum all data blocks\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    99
	(void) fprintf(stderr, "	-s report stats on zdb's I/O\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   100
	(void) fprintf(stderr, "	-v verbose (applies to all others)\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   101
	(void) fprintf(stderr, "        -l dump label contents\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   102
	(void) fprintf(stderr, "	-L live pool (allows some errors)\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   103
	(void) fprintf(stderr, "	-O [!]<pre|post|prune|data|holes> "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   104
	    "visitation order\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   105
	(void) fprintf(stderr, "	-U use zpool.cache in /tmp\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   106
	(void) fprintf(stderr, "	-B objset:object:level:blkid -- "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   107
	    "simulate bad block\n");
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   108
	(void) fprintf(stderr, "        -R read and display block from a"
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   109
	    "device\n");
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   110
	(void) fprintf(stderr, "Specify an option more than once (e.g. -bb) "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   111
	    "to make only that option verbose\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   112
	(void) fprintf(stderr, "Default is to dump everything non-verbosely\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   113
	exit(1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   114
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   115
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   116
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   117
fatal(const char *fmt, ...)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   118
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   119
	va_list ap;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   120
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   121
	va_start(ap, fmt);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   122
	(void) fprintf(stderr, "%s: ", cmdname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   123
	(void) vfprintf(stderr, fmt, ap);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   124
	va_end(ap);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   125
	(void) fprintf(stderr, "\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   126
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   127
	exit(1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   128
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   129
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   130
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   131
dump_nvlist(nvlist_t *list, int indent)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   132
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   133
	nvpair_t *elem = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   134
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   135
	while ((elem = nvlist_next_nvpair(list, elem)) != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   136
		switch (nvpair_type(elem)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   137
		case DATA_TYPE_STRING:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   138
			{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   139
				char *value;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   140
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   141
				VERIFY(nvpair_value_string(elem, &value) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   142
				(void) printf("%*s%s='%s'\n", indent, "",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   143
				    nvpair_name(elem), value);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   144
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   145
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   146
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   147
		case DATA_TYPE_UINT64:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   148
			{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   149
				uint64_t value;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   150
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   151
				VERIFY(nvpair_value_uint64(elem, &value) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   152
				(void) printf("%*s%s=%llu\n", indent, "",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   153
				    nvpair_name(elem), (u_longlong_t)value);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   154
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   155
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   156
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   157
		case DATA_TYPE_NVLIST:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   158
			{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   159
				nvlist_t *value;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   160
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   161
				VERIFY(nvpair_value_nvlist(elem, &value) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   162
				(void) printf("%*s%s\n", indent, "",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   163
				    nvpair_name(elem));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   164
				dump_nvlist(value, indent + 4);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   165
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   166
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   167
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   168
		case DATA_TYPE_NVLIST_ARRAY:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   169
			{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   170
				nvlist_t **value;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   171
				uint_t c, count;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   172
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   173
				VERIFY(nvpair_value_nvlist_array(elem, &value,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   174
				    &count) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   175
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   176
				for (c = 0; c < count; c++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   177
					(void) printf("%*s%s[%u]\n", indent, "",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   178
					    nvpair_name(elem), c);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   179
					dump_nvlist(value[c], indent + 8);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   180
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   181
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   182
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   183
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   184
		default:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   185
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   186
			(void) printf("bad config type %d for %s\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   187
			    nvpair_type(elem), nvpair_name(elem));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   188
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   189
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   190
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   191
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   192
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   193
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   194
dump_packed_nvlist(objset_t *os, uint64_t object, void *data, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   195
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   196
	nvlist_t *nv;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   197
	size_t nvsize = *(uint64_t *)data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   198
	char *packed = umem_alloc(nvsize, UMEM_NOFAIL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   199
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
   200
	VERIFY(0 == dmu_read(os, object, 0, nvsize, packed));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   201
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   202
	VERIFY(nvlist_unpack(packed, nvsize, &nv, 0) == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   203
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   204
	umem_free(packed, nvsize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   205
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   206
	dump_nvlist(nv, 8);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   207
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   208
	nvlist_free(nv);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   209
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   210
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   211
const char dump_zap_stars[] = "****************************************";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   212
const int dump_zap_width = sizeof (dump_zap_stars) - 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   213
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   214
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   215
dump_zap_histogram(uint64_t histo[ZAP_HISTOGRAM_SIZE])
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   216
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   217
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   218
	int minidx = ZAP_HISTOGRAM_SIZE - 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   219
	int maxidx = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   220
	uint64_t max = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   221
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   222
	for (i = 0; i < ZAP_HISTOGRAM_SIZE; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   223
		if (histo[i] > max)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   224
			max = histo[i];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   225
		if (histo[i] > 0 && i > maxidx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   226
			maxidx = i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   227
		if (histo[i] > 0 && i < minidx)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   228
			minidx = i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   229
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   230
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   231
	if (max < dump_zap_width)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   232
		max = dump_zap_width;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   233
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   234
	for (i = minidx; i <= maxidx; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   235
		(void) printf("\t\t\t%u: %6llu %s\n", i, (u_longlong_t)histo[i],
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   236
		    &dump_zap_stars[(max - histo[i]) * dump_zap_width / max]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   237
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   238
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   239
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   240
dump_zap_stats(objset_t *os, uint64_t object)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   241
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   242
	int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   243
	zap_stats_t zs;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   244
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   245
	error = zap_get_stats(os, object, &zs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   246
	if (error)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   247
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   248
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   249
	if (zs.zs_ptrtbl_len == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   250
		ASSERT(zs.zs_num_blocks == 1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   251
		(void) printf("\tmicrozap: %llu bytes, %llu entries\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   252
		    (u_longlong_t)zs.zs_blocksize,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   253
		    (u_longlong_t)zs.zs_num_entries);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   254
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   255
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   256
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   257
	(void) printf("\tFat ZAP stats:\n");
1632
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   258
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   259
	(void) printf("\t\tPointer table:\n");
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   260
	(void) printf("\t\t\t%llu elements\n",
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   261
	    (u_longlong_t)zs.zs_ptrtbl_len);
1632
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   262
	(void) printf("\t\t\tzt_blk: %llu\n",
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   263
	    (u_longlong_t)zs.zs_ptrtbl_zt_blk);
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   264
	(void) printf("\t\t\tzt_numblks: %llu\n",
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   265
	    (u_longlong_t)zs.zs_ptrtbl_zt_numblks);
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   266
	(void) printf("\t\t\tzt_shift: %llu\n",
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   267
	    (u_longlong_t)zs.zs_ptrtbl_zt_shift);
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   268
	(void) printf("\t\t\tzt_blks_copied: %llu\n",
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   269
	    (u_longlong_t)zs.zs_ptrtbl_blks_copied);
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   270
	(void) printf("\t\t\tzt_nextblk: %llu\n",
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   271
	    (u_longlong_t)zs.zs_ptrtbl_nextblk);
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   272
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   273
	(void) printf("\t\tZAP entries: %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   274
	    (u_longlong_t)zs.zs_num_entries);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   275
	(void) printf("\t\tLeaf blocks: %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   276
	    (u_longlong_t)zs.zs_num_leafs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   277
	(void) printf("\t\tTotal blocks: %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   278
	    (u_longlong_t)zs.zs_num_blocks);
1632
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   279
	(void) printf("\t\tzap_block_type: 0x%llx\n",
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   280
	    (u_longlong_t)zs.zs_block_type);
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   281
	(void) printf("\t\tzap_magic: 0x%llx\n",
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   282
	    (u_longlong_t)zs.zs_magic);
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   283
	(void) printf("\t\tzap_salt: 0x%llx\n",
7d486ebd46b7 6392291 zdb needs to tell the entire goodness of the fat zap
nd150628
parents: 1578
diff changeset
   284
	    (u_longlong_t)zs.zs_salt);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   285
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   286
	(void) printf("\t\tLeafs with 2^n pointers:\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   287
	dump_zap_histogram(zs.zs_leafs_with_2n_pointers);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   288
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   289
	(void) printf("\t\tBlocks with n*5 entries:\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   290
	dump_zap_histogram(zs.zs_blocks_with_n5_entries);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   291
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   292
	(void) printf("\t\tBlocks n/10 full:\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   293
	dump_zap_histogram(zs.zs_blocks_n_tenths_full);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   294
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   295
	(void) printf("\t\tEntries with n chunks:\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   296
	dump_zap_histogram(zs.zs_entries_using_n_chunks);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   297
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   298
	(void) printf("\t\tBuckets with n entries:\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   299
	dump_zap_histogram(zs.zs_buckets_with_n_entries);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   300
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   301
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   302
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   303
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   304
dump_none(objset_t *os, uint64_t object, void *data, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   305
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   306
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   307
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   308
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   309
void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   310
dump_uint8(objset_t *os, uint64_t object, void *data, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   311
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   312
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   313
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   314
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   315
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   316
dump_uint64(objset_t *os, uint64_t object, void *data, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   317
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   318
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   319
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   320
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   321
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   322
dump_zap(objset_t *os, uint64_t object, void *data, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   323
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   324
	zap_cursor_t zc;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   325
	zap_attribute_t attr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   326
	void *prop;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   327
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   328
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   329
	dump_zap_stats(os, object);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   330
	(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   331
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   332
	for (zap_cursor_init(&zc, os, object);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   333
	    zap_cursor_retrieve(&zc, &attr) == 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   334
	    zap_cursor_advance(&zc)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   335
		(void) printf("\t\t%s = ", attr.za_name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   336
		if (attr.za_num_integers == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   337
			(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   338
			continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   339
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   340
		prop = umem_zalloc(attr.za_num_integers *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   341
		    attr.za_integer_length, UMEM_NOFAIL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   342
		(void) zap_lookup(os, object, attr.za_name,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   343
		    attr.za_integer_length, attr.za_num_integers, prop);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   344
		if (attr.za_integer_length == 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   345
			(void) printf("%s", (char *)prop);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   346
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   347
			for (i = 0; i < attr.za_num_integers; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   348
				switch (attr.za_integer_length) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   349
				case 2:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   350
					(void) printf("%u ",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   351
					    ((uint16_t *)prop)[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   352
					break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   353
				case 4:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   354
					(void) printf("%u ",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   355
					    ((uint32_t *)prop)[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   356
					break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   357
				case 8:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   358
					(void) printf("%lld ",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   359
					    (u_longlong_t)((int64_t *)prop)[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   360
					break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   361
				}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   362
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   363
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   364
		(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   365
		umem_free(prop, attr.za_num_integers * attr.za_integer_length);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   366
	}
885
d925b21dba78 6347493 tar of 25K empty directory entries in ZFS takes 30+ seconds ...
ahrens
parents: 789
diff changeset
   367
	zap_cursor_fini(&zc);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   368
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   369
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   370
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   371
dump_spacemap(objset_t *os, space_map_obj_t *smo, space_map_t *sm)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   372
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   373
	uint64_t alloc, offset, entry;
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1731
diff changeset
   374
	uint8_t mapshift = sm->sm_shift;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   375
	uint64_t mapstart = sm->sm_start;
3361
a3d194896a76 6480230 ::walk spa|::walk zms_freelist cause mdb to core dump
ck153898
parents: 3060
diff changeset
   376
	char *ddata[] = { "ALLOC", "FREE", "CONDENSE", "INVALID",
a3d194896a76 6480230 ::walk spa|::walk zms_freelist cause mdb to core dump
ck153898
parents: 3060
diff changeset
   377
			    "INVALID", "INVALID", "INVALID", "INVALID" };
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   378
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   379
	if (smo->smo_object == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   380
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   381
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   382
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   383
	 * Print out the freelist entries in both encoded and decoded form.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   384
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   385
	alloc = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   386
	for (offset = 0; offset < smo->smo_objsize; offset += sizeof (entry)) {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
   387
		VERIFY(0 == dmu_read(os, smo->smo_object, offset,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
   388
		    sizeof (entry), &entry));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   389
		if (SM_DEBUG_DECODE(entry)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   390
			(void) printf("\t\t[%4llu] %s: txg %llu, pass %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   391
			    (u_longlong_t)(offset / sizeof (entry)),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   392
			    ddata[SM_DEBUG_ACTION_DECODE(entry)],
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2417
diff changeset
   393
			    (u_longlong_t)SM_DEBUG_TXG_DECODE(entry),
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2417
diff changeset
   394
			    (u_longlong_t)SM_DEBUG_SYNCPASS_DECODE(entry));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   395
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   396
			(void) printf("\t\t[%4llu]    %c  range:"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   397
			    " %08llx-%08llx  size: %06llx\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   398
			    (u_longlong_t)(offset / sizeof (entry)),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   399
			    SM_TYPE_DECODE(entry) == SM_ALLOC ? 'A' : 'F',
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2417
diff changeset
   400
			    (u_longlong_t)((SM_OFFSET_DECODE(entry) <<
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2417
diff changeset
   401
			    mapshift) + mapstart),
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2417
diff changeset
   402
			    (u_longlong_t)((SM_OFFSET_DECODE(entry) <<
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2417
diff changeset
   403
			    mapshift) + mapstart + (SM_RUN_DECODE(entry) <<
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2417
diff changeset
   404
			    mapshift)),
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2417
diff changeset
   405
			    (u_longlong_t)(SM_RUN_DECODE(entry) << mapshift));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   406
			if (SM_TYPE_DECODE(entry) == SM_ALLOC)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   407
				alloc += SM_RUN_DECODE(entry) << mapshift;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   408
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   409
				alloc -= SM_RUN_DECODE(entry) << mapshift;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   410
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   411
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   412
	if (alloc != smo->smo_alloc) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   413
		(void) printf("space_map_object alloc (%llu) INCONSISTENT "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   414
		    "with space map summary (%llu)\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   415
		    (u_longlong_t)smo->smo_alloc, (u_longlong_t)alloc);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   416
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   417
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   418
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   419
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   420
dump_metaslab(metaslab_t *msp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   421
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   422
	char freebuf[5];
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1731
diff changeset
   423
	space_map_obj_t *smo = &msp->ms_smo;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   424
	vdev_t *vd = msp->ms_group->mg_vd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   425
	spa_t *spa = vd->vdev_spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   426
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   427
	nicenum(msp->ms_map.sm_size - smo->smo_alloc, freebuf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   428
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   429
	if (dump_opt['d'] <= 5) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   430
		(void) printf("\t%10llx   %10llu   %5s\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   431
		    (u_longlong_t)msp->ms_map.sm_start,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   432
		    (u_longlong_t)smo->smo_object,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   433
		    freebuf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   434
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   435
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   436
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   437
	(void) printf(
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   438
	    "\tvdev %llu   offset %08llx   spacemap %4llu   free %5s\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   439
	    (u_longlong_t)vd->vdev_id, (u_longlong_t)msp->ms_map.sm_start,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   440
	    (u_longlong_t)smo->smo_object, freebuf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   441
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   442
	ASSERT(msp->ms_map.sm_size == (1ULL << vd->vdev_ms_shift));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   443
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   444
	dump_spacemap(spa->spa_meta_objset, smo, &msp->ms_map);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   445
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   446
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   447
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   448
dump_metaslabs(spa_t *spa)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   449
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   450
	vdev_t *rvd = spa->spa_root_vdev;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   451
	vdev_t *vd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   452
	int c, m;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   453
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   454
	(void) printf("\nMetaslabs:\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   455
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   456
	for (c = 0; c < rvd->vdev_children; c++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   457
		vd = rvd->vdev_child[c];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   458
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
   459
		spa_config_enter(spa, RW_READER, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   460
		(void) printf("\n    vdev %llu = %s\n\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   461
		    (u_longlong_t)vd->vdev_id, vdev_description(vd));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
   462
		spa_config_exit(spa, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   463
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   464
		if (dump_opt['d'] <= 5) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   465
			(void) printf("\t%10s   %10s   %5s\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   466
			    "offset", "spacemap", "free");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   467
			(void) printf("\t%10s   %10s   %5s\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   468
			    "------", "--------", "----");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   469
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   470
		for (m = 0; m < vd->vdev_ms_count; m++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   471
			dump_metaslab(vd->vdev_ms[m]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   472
		(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   473
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   474
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   475
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   476
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   477
dump_dtl(vdev_t *vd, int indent)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   478
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   479
	avl_tree_t *t = &vd->vdev_dtl_map.sm_root;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   480
	spa_t *spa = vd->vdev_spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   481
	space_seg_t *ss;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   482
	vdev_t *pvd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   483
	int c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   484
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   485
	if (indent == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   486
		(void) printf("\nDirty time logs:\n\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   487
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
   488
	spa_config_enter(spa, RW_READER, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   489
	(void) printf("\t%*s%s\n", indent, "", vdev_description(vd));
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
   490
	spa_config_exit(spa, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   491
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   492
	for (ss = avl_first(t); ss; ss = AVL_NEXT(t, ss)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   493
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   494
		 * Everything in this DTL must appear in all parent DTL unions.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   495
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   496
		for (pvd = vd; pvd; pvd = pvd->vdev_parent)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   497
			ASSERT(vdev_dtl_contains(&pvd->vdev_dtl_map,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   498
			    ss->ss_start, ss->ss_end - ss->ss_start));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   499
		(void) printf("\t%*soutage [%llu,%llu] length %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   500
		    indent, "",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   501
		    (u_longlong_t)ss->ss_start,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   502
		    (u_longlong_t)ss->ss_end - 1,
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2417
diff changeset
   503
		    (u_longlong_t)(ss->ss_end - ss->ss_start));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   504
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   505
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   506
	(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   507
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   508
	if (dump_opt['d'] > 5 && vd->vdev_children == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   509
		dump_spacemap(vd->vdev_spa->spa_meta_objset, &vd->vdev_dtl,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   510
		    &vd->vdev_dtl_map);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   511
		(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   512
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   513
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   514
	for (c = 0; c < vd->vdev_children; c++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   515
		dump_dtl(vd->vdev_child[c], indent + 4);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   516
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   517
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   518
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   519
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   520
dump_dnode(objset_t *os, uint64_t object, void *data, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   521
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   522
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   523
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   524
static uint64_t
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   525
blkid2offset(dnode_phys_t *dnp, int level, uint64_t blkid)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   526
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   527
	if (level < 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   528
		return (blkid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   529
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   530
	return ((blkid << (level * (dnp->dn_indblkshift - SPA_BLKPTRSHIFT))) *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   531
	    dnp->dn_datablkszsec << SPA_MINBLOCKSHIFT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   532
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   533
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   534
static void
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   535
sprintf_blkptr_compact(char *blkbuf, blkptr_t *bp, int alldvas)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   536
{
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   537
	dva_t *dva = bp->blk_dva;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   538
	int ndvas = alldvas ? BP_GET_NDVAS(bp) : 1;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   539
	int i;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   540
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   541
	blkbuf[0] = '\0';
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   542
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   543
	for (i = 0; i < ndvas; i++)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   544
		(void) sprintf(blkbuf + strlen(blkbuf), "%llu:%llx:%llx ",
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   545
		    (u_longlong_t)DVA_GET_VDEV(&dva[i]),
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   546
		    (u_longlong_t)DVA_GET_OFFSET(&dva[i]),
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   547
		    (u_longlong_t)DVA_GET_ASIZE(&dva[i]));
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   548
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   549
	(void) sprintf(blkbuf + strlen(blkbuf), "%llxL/%llxP F=%llu B=%llu",
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   550
	    (u_longlong_t)BP_GET_LSIZE(bp),
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   551
	    (u_longlong_t)BP_GET_PSIZE(bp),
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   552
	    (u_longlong_t)bp->blk_fill,
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   553
	    (u_longlong_t)bp->blk_birth);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   554
}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   555
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   556
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   557
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   558
zdb_indirect_cb(traverse_blk_cache_t *bc, spa_t *spa, void *a)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   559
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   560
	zbookmark_t *zb = &bc->bc_bookmark;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   561
	blkptr_t *bp = &bc->bc_blkptr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   562
	void *data = bc->bc_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   563
	dnode_phys_t *dnp = bc->bc_dnode;
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   564
	char blkbuf[BP_SPRINTF_LEN + 80];
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   565
	int l;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   566
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   567
	if (bc->bc_errno) {
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   568
		(void) sprintf(blkbuf,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
   569
		    "Error %d reading <%llu, %llu, %lld, %llu>: ",
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   570
		    bc->bc_errno,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   571
		    (u_longlong_t)zb->zb_objset,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   572
		    (u_longlong_t)zb->zb_object,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
   573
		    (u_longlong_t)zb->zb_level,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   574
		    (u_longlong_t)zb->zb_blkid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   575
		goto out;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   576
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   577
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   578
	if (zb->zb_level == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   579
		ASSERT3U(BP_GET_TYPE(bp), ==, DMU_OT_OBJSET);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   580
		ASSERT3U(BP_GET_LEVEL(bp), ==, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   581
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   582
		ASSERT3U(BP_GET_TYPE(bp), ==, dnp->dn_type);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   583
		ASSERT3U(BP_GET_LEVEL(bp), ==, zb->zb_level);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   584
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   585
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   586
	if (zb->zb_level > 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   587
		uint64_t fill = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   588
		blkptr_t *bpx, *bpend;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   589
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   590
		for (bpx = data, bpend = bpx + BP_GET_LSIZE(bp) / sizeof (*bpx);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   591
		    bpx < bpend; bpx++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   592
			if (bpx->blk_birth != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   593
				fill += bpx->blk_fill;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   594
			} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   595
				ASSERT(bpx->blk_fill == 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   596
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   597
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   598
		ASSERT3U(fill, ==, bp->blk_fill);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   599
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   600
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   601
	if (zb->zb_level == 0 && dnp->dn_type == DMU_OT_DNODE) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   602
		uint64_t fill = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   603
		dnode_phys_t *dnx, *dnend;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   604
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   605
		for (dnx = data, dnend = dnx + (BP_GET_LSIZE(bp)>>DNODE_SHIFT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   606
		    dnx < dnend; dnx++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   607
			if (dnx->dn_type != DMU_OT_NONE)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   608
				fill++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   609
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   610
		ASSERT3U(fill, ==, bp->blk_fill);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   611
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   612
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   613
	(void) sprintf(blkbuf, "%16llx ",
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   614
	    (u_longlong_t)blkid2offset(dnp, zb->zb_level, zb->zb_blkid));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   615
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   616
	ASSERT(zb->zb_level >= 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   617
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   618
	for (l = dnp->dn_nlevels - 1; l >= -1; l--) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   619
		if (l == zb->zb_level) {
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   620
			(void) sprintf(blkbuf + strlen(blkbuf), "L%llx",
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
   621
			    (u_longlong_t)zb->zb_level);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   622
		} else {
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   623
			(void) sprintf(blkbuf + strlen(blkbuf), " ");
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   624
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   625
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   626
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   627
out:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   628
	if (bp->blk_birth == 0) {
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   629
		(void) sprintf(blkbuf + strlen(blkbuf), "<hole>");
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   630
		(void) printf("%s\n", blkbuf);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   631
	} else {
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   632
		sprintf_blkptr_compact(blkbuf + strlen(blkbuf), bp,
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   633
		    dump_opt['d'] > 5 ? 1 : 0);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   634
		(void) printf("%s\n", blkbuf);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   635
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   636
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   637
	return (bc->bc_errno ? ERESTART : 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   638
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   639
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   640
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   641
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   642
dump_indirect(objset_t *os, uint64_t object, void *data, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   643
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   644
	traverse_handle_t *th;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   645
	uint64_t objset = dmu_objset_id(os);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   646
	int advance = zdb_advance;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   647
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   648
	(void) printf("Indirect blocks:\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   649
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   650
	if (object == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   651
		advance |= ADVANCE_DATA;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   652
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   653
	th = traverse_init(dmu_objset_spa(os), zdb_indirect_cb, NULL, advance,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   654
	    ZIO_FLAG_CANFAIL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   655
	th->th_noread = zdb_noread;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   656
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   657
	traverse_add_dnode(th, 0, -1ULL, objset, object);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   658
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   659
	while (traverse_more(th) == EAGAIN)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   660
		continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   661
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   662
	(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   663
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   664
	traverse_fini(th);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   665
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   666
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   667
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   668
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   669
dump_dsl_dir(objset_t *os, uint64_t object, void *data, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   670
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   671
	dsl_dir_phys_t *dd = data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   672
	time_t crtime;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   673
	char used[6], compressed[6], uncompressed[6], quota[6], resv[6];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   674
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   675
	if (dd == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   676
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   677
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   678
	ASSERT(size == sizeof (*dd));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   679
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   680
	crtime = dd->dd_creation_time;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   681
	nicenum(dd->dd_used_bytes, used);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   682
	nicenum(dd->dd_compressed_bytes, compressed);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   683
	nicenum(dd->dd_uncompressed_bytes, uncompressed);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   684
	nicenum(dd->dd_quota, quota);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   685
	nicenum(dd->dd_reserved, resv);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   686
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   687
	(void) printf("\t\tcreation_time = %s", ctime(&crtime));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   688
	(void) printf("\t\thead_dataset_obj = %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   689
	    (u_longlong_t)dd->dd_head_dataset_obj);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   690
	(void) printf("\t\tparent_dir_obj = %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   691
	    (u_longlong_t)dd->dd_parent_obj);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   692
	(void) printf("\t\tclone_parent_obj = %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   693
	    (u_longlong_t)dd->dd_clone_parent_obj);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   694
	(void) printf("\t\tchild_dir_zapobj = %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   695
	    (u_longlong_t)dd->dd_child_dir_zapobj);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   696
	(void) printf("\t\tused_bytes = %s\n", used);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   697
	(void) printf("\t\tcompressed_bytes = %s\n", compressed);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   698
	(void) printf("\t\tuncompressed_bytes = %s\n", uncompressed);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   699
	(void) printf("\t\tquota = %s\n", quota);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   700
	(void) printf("\t\treserved = %s\n", resv);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   701
	(void) printf("\t\tprops_zapobj = %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   702
	    (u_longlong_t)dd->dd_props_zapobj);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   703
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   704
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   705
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   706
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   707
dump_dsl_dataset(objset_t *os, uint64_t object, void *data, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   708
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   709
	dsl_dataset_phys_t *ds = data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   710
	time_t crtime;
896
f5270e6bd04d 6348089 panic in dbuf_remove_ref
maybee
parents: 885
diff changeset
   711
	char used[6], compressed[6], uncompressed[6], unique[6];
f5270e6bd04d 6348089 panic in dbuf_remove_ref
maybee
parents: 885
diff changeset
   712
	char blkbuf[BP_SPRINTF_LEN];
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   713
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   714
	if (ds == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   715
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   716
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   717
	ASSERT(size == sizeof (*ds));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   718
	crtime = ds->ds_creation_time;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   719
	nicenum(ds->ds_used_bytes, used);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   720
	nicenum(ds->ds_compressed_bytes, compressed);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   721
	nicenum(ds->ds_uncompressed_bytes, uncompressed);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   722
	nicenum(ds->ds_unique_bytes, unique);
896
f5270e6bd04d 6348089 panic in dbuf_remove_ref
maybee
parents: 885
diff changeset
   723
	sprintf_blkptr(blkbuf, BP_SPRINTF_LEN, &ds->ds_bp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   724
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   725
	(void) printf("\t\tdataset_obj = %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   726
	    (u_longlong_t)ds->ds_dir_obj);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   727
	(void) printf("\t\tprev_snap_obj = %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   728
	    (u_longlong_t)ds->ds_prev_snap_obj);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   729
	(void) printf("\t\tprev_snap_txg = %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   730
	    (u_longlong_t)ds->ds_prev_snap_txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   731
	(void) printf("\t\tnext_snap_obj = %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   732
	    (u_longlong_t)ds->ds_next_snap_obj);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   733
	(void) printf("\t\tsnapnames_zapobj = %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   734
	    (u_longlong_t)ds->ds_snapnames_zapobj);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   735
	(void) printf("\t\tnum_children = %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   736
	    (u_longlong_t)ds->ds_num_children);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   737
	(void) printf("\t\tcreation_time = %s", ctime(&crtime));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   738
	(void) printf("\t\tcreation_txg = %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   739
	    (u_longlong_t)ds->ds_creation_txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   740
	(void) printf("\t\tdeadlist_obj = %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   741
	    (u_longlong_t)ds->ds_deadlist_obj);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   742
	(void) printf("\t\tused_bytes = %s\n", used);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   743
	(void) printf("\t\tcompressed_bytes = %s\n", compressed);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   744
	(void) printf("\t\tuncompressed_bytes = %s\n", uncompressed);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   745
	(void) printf("\t\tunique = %s\n", unique);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   746
	(void) printf("\t\tfsid_guid = %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   747
	    (u_longlong_t)ds->ds_fsid_guid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   748
	(void) printf("\t\tguid = %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   749
	    (u_longlong_t)ds->ds_guid);
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1914
diff changeset
   750
	(void) printf("\t\tflags = %llx\n",
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1914
diff changeset
   751
	    (u_longlong_t)ds->ds_flags);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   752
	(void) printf("\t\tbp = %s\n", blkbuf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   753
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   754
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   755
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   756
dump_bplist(objset_t *mos, uint64_t object, char *name)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   757
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   758
	bplist_t bpl = { 0 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   759
	blkptr_t blk, *bp = &blk;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   760
	uint64_t itor = 0;
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1914
diff changeset
   761
	char bytes[6];
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1914
diff changeset
   762
	char comp[6];
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1914
diff changeset
   763
	char uncomp[6];
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   764
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   765
	if (dump_opt['d'] < 3)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   766
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   767
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
   768
	VERIFY(0 == bplist_open(&bpl, mos, object));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   769
	if (bplist_empty(&bpl)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   770
		bplist_close(&bpl);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   771
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   772
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   773
2082
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1914
diff changeset
   774
	nicenum(bpl.bpl_phys->bpl_bytes, bytes);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1914
diff changeset
   775
	if (bpl.bpl_dbuf->db_size == sizeof (bplist_phys_t)) {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1914
diff changeset
   776
		nicenum(bpl.bpl_phys->bpl_comp, comp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1914
diff changeset
   777
		nicenum(bpl.bpl_phys->bpl_uncomp, uncomp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1914
diff changeset
   778
		(void) printf("\n    %s: %llu entries, %s (%s/%s comp)\n",
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1914
diff changeset
   779
		    name, (u_longlong_t)bpl.bpl_phys->bpl_entries,
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1914
diff changeset
   780
		    bytes, comp, uncomp);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1914
diff changeset
   781
	} else {
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1914
diff changeset
   782
		(void) printf("\n    %s: %llu entries, %s\n",
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1914
diff changeset
   783
		    name, (u_longlong_t)bpl.bpl_phys->bpl_entries, bytes);
76b439ec3ac1 PSARC 2006/223 ZFS Hot Spares
eschrock
parents: 1914
diff changeset
   784
	}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   785
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   786
	if (dump_opt['d'] < 5) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   787
		bplist_close(&bpl);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   788
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   789
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   790
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   791
	(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   792
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   793
	while (bplist_iterate(&bpl, &itor, bp) == 0) {
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   794
		char blkbuf[BP_SPRINTF_LEN];
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   795
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   796
		ASSERT(bp->blk_birth != 0);
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   797
		sprintf_blkptr_compact(blkbuf, bp, dump_opt['d'] > 5 ? 1 : 0);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   798
		(void) printf("\tItem %3llu: %s\n",
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   799
		    (u_longlong_t)itor - 1, blkbuf);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   800
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   801
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   802
	bplist_close(&bpl);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   803
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   804
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   805
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   806
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   807
dump_znode(objset_t *os, uint64_t object, void *data, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   808
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   809
	znode_phys_t *zp = data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   810
	time_t z_crtime, z_atime, z_mtime, z_ctime;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   811
	char path[MAXPATHLEN * 2];	/* allow for xattr and failure prefix */
3444
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3361
diff changeset
   812
	int error;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   813
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   814
	ASSERT(size >= sizeof (znode_phys_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   815
3444
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3361
diff changeset
   816
	error = zfs_obj_to_path(os, object, path, sizeof (path));
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3361
diff changeset
   817
	if (error != 0) {
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3361
diff changeset
   818
		(void) snprintf(path, sizeof (path), "\?\?\?<object#%llu>",
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3361
diff changeset
   819
		    (u_longlong_t)object);
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3361
diff changeset
   820
	}
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3361
diff changeset
   821
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   822
	if (dump_opt['d'] < 3) {
3444
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3361
diff changeset
   823
		(void) printf("\t%s\n", path);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   824
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   825
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   826
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   827
	z_crtime = (time_t)zp->zp_crtime[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   828
	z_atime = (time_t)zp->zp_atime[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   829
	z_mtime = (time_t)zp->zp_mtime[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   830
	z_ctime = (time_t)zp->zp_ctime[0];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   831
3444
dc160a70a50d 6410433 'zpool status -v' would be more useful with filenames
ek110237
parents: 3361
diff changeset
   832
	(void) printf("\tpath	%s\n", path);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   833
	(void) printf("\tatime	%s", ctime(&z_atime));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   834
	(void) printf("\tmtime	%s", ctime(&z_mtime));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   835
	(void) printf("\tctime	%s", ctime(&z_ctime));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   836
	(void) printf("\tcrtime	%s", ctime(&z_crtime));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   837
	(void) printf("\tgen	%llu\n", (u_longlong_t)zp->zp_gen);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   838
	(void) printf("\tmode	%llo\n", (u_longlong_t)zp->zp_mode);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   839
	(void) printf("\tsize	%llu\n", (u_longlong_t)zp->zp_size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   840
	(void) printf("\tparent	%llu\n", (u_longlong_t)zp->zp_parent);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   841
	(void) printf("\tlinks	%llu\n", (u_longlong_t)zp->zp_links);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   842
	(void) printf("\txattr	%llu\n", (u_longlong_t)zp->zp_xattr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   843
	(void) printf("\trdev	0x%016llx\n", (u_longlong_t)zp->zp_rdev);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   844
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   845
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   846
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   847
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   848
dump_acl(objset_t *os, uint64_t object, void *data, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   849
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   850
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   851
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   852
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   853
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   854
dump_dmu_objset(objset_t *os, uint64_t object, void *data, size_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   855
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   856
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   857
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   858
static object_viewer_t *object_viewer[DMU_OT_NUMTYPES] = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   859
	dump_none,		/* unallocated			*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   860
	dump_zap,		/* object directory		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   861
	dump_uint64,		/* object array			*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   862
	dump_none,		/* packed nvlist		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   863
	dump_packed_nvlist,	/* packed nvlist size		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   864
	dump_none,		/* bplist			*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   865
	dump_none,		/* bplist header		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   866
	dump_none,		/* SPA space map header		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   867
	dump_none,		/* SPA space map		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   868
	dump_none,		/* ZIL intent log		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   869
	dump_dnode,		/* DMU dnode			*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   870
	dump_dmu_objset,	/* DMU objset			*/
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
   871
	dump_dsl_dir,		/* DSL directory		*/
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   872
	dump_zap,		/* DSL directory child map	*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   873
	dump_zap,		/* DSL dataset snap map		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   874
	dump_zap,		/* DSL props			*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   875
	dump_dsl_dataset,	/* DSL dataset			*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   876
	dump_znode,		/* ZFS znode			*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   877
	dump_acl,		/* ZFS ACL			*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   878
	dump_uint8,		/* ZFS plain file		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   879
	dump_zap,		/* ZFS directory		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   880
	dump_zap,		/* ZFS master node		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   881
	dump_zap,		/* ZFS delete queue		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   882
	dump_uint8,		/* zvol object			*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   883
	dump_zap,		/* zvol prop			*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   884
	dump_uint8,		/* other uint8[]		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   885
	dump_uint64,		/* other uint64[]		*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   886
	dump_zap,		/* other ZAP			*/
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
   887
	dump_zap,		/* persistent error log		*/
2926
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
   888
	dump_uint8,		/* SPA history			*/
acfcfefbc60d PSARC 2006/288 zpool history
ek110237
parents: 2885
diff changeset
   889
	dump_uint64,		/* SPA history offsets		*/
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3547
diff changeset
   890
	dump_zap,		/* Pool properties		*/
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   891
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   892
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   893
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   894
dump_object(objset_t *os, uint64_t object, int verbosity, int *print_header)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   895
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   896
	dmu_buf_t *db = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   897
	dmu_object_info_t doi;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   898
	dnode_t *dn;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   899
	void *bonus = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   900
	size_t bsize = 0;
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1731
diff changeset
   901
	char iblk[6], dblk[6], lsize[6], asize[6], bonus_size[6], segsize[6];
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   902
	char aux[50];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   903
	int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   904
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   905
	if (*print_header) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   906
		(void) printf("\n    Object  lvl   iblk   dblk  lsize"
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1731
diff changeset
   907
		    "  asize  type\n");
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   908
		*print_header = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   909
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   910
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   911
	if (object == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   912
		dn = os->os->os_meta_dnode;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   913
	} else {
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
   914
		error = dmu_bonus_hold(os, object, FTAG, &db);
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
   915
		if (error)
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
   916
			fatal("dmu_bonus_hold(%llu) failed, errno %u",
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
   917
			    object, error);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   918
		bonus = db->db_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   919
		bsize = db->db_size;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   920
		dn = ((dmu_buf_impl_t *)db)->db_dnode;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   921
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   922
	dmu_object_info_from_dnode(dn, &doi);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   923
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   924
	nicenum(doi.doi_metadata_block_size, iblk);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   925
	nicenum(doi.doi_data_block_size, dblk);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   926
	nicenum(doi.doi_data_block_size * (doi.doi_max_block_offset + 1),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   927
	    lsize);
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1731
diff changeset
   928
	nicenum(doi.doi_physical_blks << 9, asize);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   929
	nicenum(doi.doi_bonus_size, bonus_size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   930
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   931
	aux[0] = '\0';
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   932
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   933
	if (doi.doi_checksum != ZIO_CHECKSUM_INHERIT || verbosity >= 6)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   934
		(void) snprintf(aux + strlen(aux), sizeof (aux), " (K=%s)",
4070
4390ea390a1e 6386594 zdb message should be clearer when failing for lack of permissions
mc142369
parents: 3912
diff changeset
   935
		zio_checksum_table[doi.doi_checksum].ci_name);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   936
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   937
	if (doi.doi_compress != ZIO_COMPRESS_INHERIT || verbosity >= 6)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   938
		(void) snprintf(aux + strlen(aux), sizeof (aux), " (Z=%s)",
4070
4390ea390a1e 6386594 zdb message should be clearer when failing for lack of permissions
mc142369
parents: 3912
diff changeset
   939
		zio_compress_table[doi.doi_compress].ci_name);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   940
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   941
	(void) printf("%10lld  %3u  %5s  %5s  %5s  %5s  %s%s\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   942
	    (u_longlong_t)object, doi.doi_indirection, iblk, dblk, lsize,
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1731
diff changeset
   943
	    asize, dmu_ot[doi.doi_type].ot_name, aux);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   944
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   945
	if (doi.doi_bonus_type != DMU_OT_NONE && verbosity > 3) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   946
		(void) printf("%10s  %3s  %5s  %5s  %5s  %5s  %s\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   947
		    "", "", "", "", bonus_size, "bonus",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   948
		    dmu_ot[doi.doi_bonus_type].ot_name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   949
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   950
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   951
	if (verbosity >= 4) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   952
		object_viewer[doi.doi_bonus_type](os, object, bonus, bsize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   953
		object_viewer[doi.doi_type](os, object, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   954
		*print_header = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   955
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   956
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   957
	if (verbosity >= 5)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   958
		dump_indirect(os, object, NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   959
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   960
	if (verbosity >= 5) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   961
		/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   962
		 * Report the list of segments that comprise the object.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   963
		 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   964
		uint64_t start = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   965
		uint64_t end;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   966
		uint64_t blkfill = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   967
		int minlvl = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   968
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   969
		if (dn->dn_type == DMU_OT_DNODE) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   970
			minlvl = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   971
			blkfill = DNODES_PER_BLOCK;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   972
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   973
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   974
		for (;;) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   975
			error = dnode_next_offset(dn, B_FALSE, &start, minlvl,
3025
4e5ee8301d84 6424466 "panic: data after EOF" when unmounting abused pool
ahrens
parents: 2926
diff changeset
   976
			    blkfill, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   977
			if (error)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   978
				break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   979
			end = start;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   980
			error = dnode_next_offset(dn, B_TRUE, &end, minlvl,
3025
4e5ee8301d84 6424466 "panic: data after EOF" when unmounting abused pool
ahrens
parents: 2926
diff changeset
   981
			    blkfill, 0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   982
			nicenum(end - start, segsize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   983
			(void) printf("\t\tsegment [%016llx, %016llx)"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   984
			    " size %5s\n", (u_longlong_t)start,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   985
			    (u_longlong_t)end, segsize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   986
			if (error)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   987
				break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   988
			start = end;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   989
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   990
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   991
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   992
	if (db != NULL)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
   993
		dmu_buf_rele(db, FTAG);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   994
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   995
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   996
static char *objset_types[DMU_OST_NUMTYPES] = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   997
	"NONE", "META", "ZPL", "ZVOL", "OTHER", "ANY" };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   998
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   999
/*ARGSUSED*/
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1000
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1001
dump_dir(objset_t *os)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1002
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1003
	dmu_objset_stats_t dds;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1004
	uint64_t object, object_count;
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
  1005
	uint64_t refdbytes, usedobjs, scratch;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1006
	char numbuf[8];
896
f5270e6bd04d 6348089 panic in dbuf_remove_ref
maybee
parents: 885
diff changeset
  1007
	char blkbuf[BP_SPRINTF_LEN];
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1008
	char osname[MAXNAMELEN];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1009
	char *type = "UNKNOWN";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1010
	int verbosity = dump_opt['d'];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1011
	int print_header = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1012
	int i, error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1013
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
  1014
	dmu_objset_fast_stat(os, &dds);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1015
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1016
	if (dds.dds_type < DMU_OST_NUMTYPES)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1017
		type = objset_types[dds.dds_type];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1018
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1019
	if (dds.dds_type == DMU_OST_META) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1020
		dds.dds_creation_txg = TXG_INITIAL;
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1021
		usedobjs = os->os->os_rootbp->blk_fill;
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
  1022
		refdbytes =
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1023
		    os->os->os_spa->spa_dsl_pool->dp_mos_dir->dd_used_bytes;
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
  1024
	} else {
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
  1025
		dmu_objset_space(os, &refdbytes, &scratch, &usedobjs, &scratch);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1026
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1027
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1028
	ASSERT3U(usedobjs, ==, os->os->os_rootbp->blk_fill);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1029
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
  1030
	nicenum(refdbytes, numbuf);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1031
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1032
	if (verbosity >= 4) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1033
		(void) strcpy(blkbuf, ", rootbp ");
896
f5270e6bd04d 6348089 panic in dbuf_remove_ref
maybee
parents: 885
diff changeset
  1034
		sprintf_blkptr(blkbuf + strlen(blkbuf),
3547
e396e0a440b1 6512391 DMU should leverage ZIO dependencies to achieve greater parallelism
maybee
parents: 3444
diff changeset
  1035
		    BP_SPRINTF_LEN - strlen(blkbuf), os->os->os_rootbp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1036
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1037
		blkbuf[0] = '\0';
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1038
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1039
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1040
	dmu_objset_name(os, osname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1041
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
  1042
	(void) printf("Dataset %s [%s], ID %llu, cr_txg %llu, "
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1043
	    "%s, %llu objects%s\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1044
	    osname, type, (u_longlong_t)dmu_objset_id(os),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1045
	    (u_longlong_t)dds.dds_creation_txg,
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
  1046
	    numbuf, (u_longlong_t)usedobjs, blkbuf);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1047
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1048
	dump_intent_log(dmu_objset_zil(os));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1049
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1050
	if (dmu_objset_ds(os) != NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1051
		dump_bplist(dmu_objset_pool(os)->dp_meta_objset,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1052
		    dmu_objset_ds(os)->ds_phys->ds_deadlist_obj, "Deadlist");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1053
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1054
	if (verbosity < 2)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1055
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1056
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1057
	if (zopt_objects != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1058
		for (i = 0; i < zopt_objects; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1059
			dump_object(os, zopt_object[i], verbosity,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1060
			    &print_header);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1061
		(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1062
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1063
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1064
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1065
	dump_object(os, 0, verbosity, &print_header);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1066
	object_count = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1067
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1068
	object = 0;
3025
4e5ee8301d84 6424466 "panic: data after EOF" when unmounting abused pool
ahrens
parents: 2926
diff changeset
  1069
	while ((error = dmu_object_next(os, &object, B_FALSE, 0)) == 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1070
		dump_object(os, object, verbosity, &print_header);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1071
		object_count++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1072
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1073
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2856
diff changeset
  1074
	ASSERT3U(object_count, ==, usedobjs);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1075
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1076
	(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1077
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1078
	if (error != ESRCH)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1079
		fatal("dmu_object_next() = %d", error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1080
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1081
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1082
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1083
dump_uberblock(uberblock_t *ub)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1084
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1085
	time_t timestamp = ub->ub_timestamp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1086
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1087
	(void) printf("Uberblock\n\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1088
	(void) printf("\tmagic = %016llx\n", (u_longlong_t)ub->ub_magic);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1089
	(void) printf("\tversion = %llu\n", (u_longlong_t)ub->ub_version);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1090
	(void) printf("\ttxg = %llu\n", (u_longlong_t)ub->ub_txg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1091
	(void) printf("\tguid_sum = %llu\n", (u_longlong_t)ub->ub_guid_sum);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1092
	(void) printf("\ttimestamp = %llu UTC = %s",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1093
	    (u_longlong_t)ub->ub_timestamp, asctime(localtime(&timestamp)));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1094
	if (dump_opt['u'] >= 3) {
896
f5270e6bd04d 6348089 panic in dbuf_remove_ref
maybee
parents: 885
diff changeset
  1095
		char blkbuf[BP_SPRINTF_LEN];
f5270e6bd04d 6348089 panic in dbuf_remove_ref
maybee
parents: 885
diff changeset
  1096
		sprintf_blkptr(blkbuf, BP_SPRINTF_LEN, &ub->ub_rootbp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1097
		(void) printf("\trootbp = %s\n", blkbuf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1098
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1099
	(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1100
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1101
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1102
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1103
dump_config(const char *pool)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1104
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1105
	spa_t *spa = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1106
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1107
	mutex_enter(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1108
	while ((spa = spa_next(spa)) != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1109
		if (pool == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1110
			(void) printf("%s\n", spa_name(spa));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1111
		if (pool == NULL || strcmp(pool, spa_name(spa)) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1112
			dump_nvlist(spa->spa_config, 4);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1113
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1114
	mutex_exit(&spa_namespace_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1115
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1116
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1117
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1118
dump_label(const char *dev)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1119
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1120
	int fd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1121
	vdev_label_t label;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1122
	char *buf = label.vl_vdev_phys.vp_nvlist;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1123
	size_t buflen = sizeof (label.vl_vdev_phys.vp_nvlist);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1124
	struct stat64 statbuf;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1125
	uint64_t psize;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1126
	int l;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1127
1170
cbb023fb2c22 6366222 zdb(1M) needs to use largefile primitives when reading label
eschrock
parents: 896
diff changeset
  1128
	if ((fd = open64(dev, O_RDONLY)) < 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1129
		(void) printf("cannot open '%s': %s\n", dev, strerror(errno));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1130
		exit(1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1131
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1132
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1133
	if (fstat64(fd, &statbuf) != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1134
		(void) printf("failed to stat '%s': %s\n", dev,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1135
		    strerror(errno));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1136
		exit(1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1137
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1138
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1139
	psize = statbuf.st_size;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1140
	psize = P2ALIGN(psize, (uint64_t)sizeof (vdev_label_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1141
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1142
	for (l = 0; l < VDEV_LABELS; l++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1143
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1144
		nvlist_t *config = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1145
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1146
		(void) printf("--------------------------------------------\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1147
		(void) printf("LABEL %d\n", l);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1148
		(void) printf("--------------------------------------------\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1149
1170
cbb023fb2c22 6366222 zdb(1M) needs to use largefile primitives when reading label
eschrock
parents: 896
diff changeset
  1150
		if (pread64(fd, &label, sizeof (label),
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1151
		    vdev_label_offset(psize, l, 0)) != sizeof (label)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1152
			(void) printf("failed to read label %d\n", l);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1153
			continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1154
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1155
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1156
		if (nvlist_unpack(buf, buflen, &config, 0) != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1157
			(void) printf("failed to unpack label %d\n", l);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1158
			continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1159
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1160
		dump_nvlist(config, 4);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1161
		nvlist_free(config);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1162
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1163
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1164
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1165
/*ARGSUSED*/
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
  1166
static int
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1167
dump_one_dir(char *dsname, void *arg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1168
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1169
	int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1170
	objset_t *os;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1171
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1172
	error = dmu_objset_open(dsname, DMU_OST_ANY,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1173
	    DS_MODE_STANDARD | DS_MODE_READONLY, &os);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1174
	if (error) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1175
		(void) printf("Could not open %s\n", dsname);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
  1176
		return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1177
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1178
	dump_dir(os);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1179
	dmu_objset_close(os);
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
  1180
	return (0);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1181
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1182
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1183
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1184
zdb_space_map_load(spa_t *spa)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1185
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1186
	vdev_t *rvd = spa->spa_root_vdev;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1187
	vdev_t *vd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1188
	int c, m, error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1189
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1190
	for (c = 0; c < rvd->vdev_children; c++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1191
		vd = rvd->vdev_child[c];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1192
		for (m = 0; m < vd->vdev_ms_count; m++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1193
			metaslab_t *msp = vd->vdev_ms[m];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1194
			mutex_enter(&msp->ms_lock);
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1731
diff changeset
  1195
			error = space_map_load(&msp->ms_allocmap[0], NULL,
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1731
diff changeset
  1196
			    SM_ALLOC, &msp->ms_smo, spa->spa_meta_objset);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1197
			mutex_exit(&msp->ms_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1198
			if (error)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1199
				fatal("%s bad space map #%d, error %d",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1200
				    spa->spa_name, c, error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1201
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1202
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1203
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1204
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1205
static int
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  1206
zdb_space_map_claim(spa_t *spa, blkptr_t *bp, zbookmark_t *zb)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1207
{
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1208
	dva_t *dva = bp->blk_dva;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1209
	vdev_t *vd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1210
	metaslab_t *msp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1211
	space_map_t *allocmap, *freemap;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1212
	int error;
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1213
	int d;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1214
	blkptr_t blk = *bp;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1215
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1216
	for (d = 0; d < BP_GET_NDVAS(bp); d++) {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1217
		uint64_t vdev = DVA_GET_VDEV(&dva[d]);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1218
		uint64_t offset = DVA_GET_OFFSET(&dva[d]);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1219
		uint64_t size = DVA_GET_ASIZE(&dva[d]);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1220
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1221
		if ((vd = vdev_lookup_top(spa, vdev)) == NULL)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1222
			return (ENXIO);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1223
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1224
		if ((offset >> vd->vdev_ms_shift) >= vd->vdev_ms_count)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1225
			return (ENXIO);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1226
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1227
		msp = vd->vdev_ms[offset >> vd->vdev_ms_shift];
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1228
		allocmap = &msp->ms_allocmap[0];
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1229
		freemap = &msp->ms_freemap[0];
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1230
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1231
		/* Prepare our copy of the bp in case we need to read GBHs */
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1232
		if (DVA_GET_GANG(&dva[d])) {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1233
			size = vdev_psize_to_asize(vd, SPA_GANGBLOCKSIZE);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1234
			DVA_SET_ASIZE(&blk.blk_dva[d], size);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1235
			DVA_SET_GANG(&blk.blk_dva[d], 0);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1236
		}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1237
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1238
		mutex_enter(&msp->ms_lock);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1239
		if (space_map_contains(freemap, offset, size)) {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1240
			mutex_exit(&msp->ms_lock);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1241
			return (EAGAIN);	/* allocated more than once */
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1242
		}
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1243
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1244
		if (!space_map_contains(allocmap, offset, size)) {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1245
			mutex_exit(&msp->ms_lock);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1246
			return (ESTALE);	/* not allocated at all */
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1247
		}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1248
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1249
		space_map_remove(allocmap, offset, size);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1250
		space_map_add(freemap, offset, size);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1251
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1252
		mutex_exit(&msp->ms_lock);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1253
	}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1254
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1255
	if (BP_IS_GANG(bp)) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1256
		zio_gbh_phys_t gbh;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1257
		int g;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1258
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1259
		/* LINTED - compile time assert */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1260
		ASSERT(sizeof (zio_gbh_phys_t) == SPA_GANGBLOCKSIZE);
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1261
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1262
		BP_SET_CHECKSUM(&blk, ZIO_CHECKSUM_GANG_HEADER);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1263
		BP_SET_PSIZE(&blk, SPA_GANGBLOCKSIZE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1264
		BP_SET_LSIZE(&blk, SPA_GANGBLOCKSIZE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1265
		BP_SET_COMPRESS(&blk, ZIO_COMPRESS_OFF);
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1266
		error = zio_wait(zio_read(NULL, spa, &blk, &gbh,
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1267
		    SPA_GANGBLOCKSIZE, NULL, NULL, ZIO_PRIORITY_SYNC_READ,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  1268
		    ZIO_FLAG_CANFAIL | ZIO_FLAG_CONFIG_HELD, zb));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1269
		if (error)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1270
			return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1271
		if (BP_SHOULD_BYTESWAP(&blk))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1272
			byteswap_uint64_array(&gbh, SPA_GANGBLOCKSIZE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1273
		for (g = 0; g < SPA_GBH_NBLKPTRS; g++) {
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1274
			if (BP_IS_HOLE(&gbh.zg_blkptr[g]))
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1275
				break;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  1276
			error = zdb_space_map_claim(spa, &gbh.zg_blkptr[g], zb);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1277
			if (error)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1278
				return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1279
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1280
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1281
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1282
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1283
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1284
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1285
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1286
zdb_leak(space_map_t *sm, uint64_t start, uint64_t size)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1287
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1288
	metaslab_t *msp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1289
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1290
	/* LINTED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1291
	msp = (metaslab_t *)((char *)sm - offsetof(metaslab_t, ms_allocmap[0]));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1292
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1293
	(void) printf("leaked space: vdev %llu, offset 0x%llx, size %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1294
	    (u_longlong_t)msp->ms_group->mg_vd->vdev_id,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1295
	    (u_longlong_t)start,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1296
	    (u_longlong_t)size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1297
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1298
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1299
static void
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1731
diff changeset
  1300
zdb_space_map_unload(spa_t *spa)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1301
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1302
	vdev_t *rvd = spa->spa_root_vdev;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1303
	vdev_t *vd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1304
	int c, m;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1305
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1306
	for (c = 0; c < rvd->vdev_children; c++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1307
		vd = rvd->vdev_child[c];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1308
		for (m = 0; m < vd->vdev_ms_count; m++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1309
			metaslab_t *msp = vd->vdev_ms[m];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1310
			mutex_enter(&msp->ms_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1311
			space_map_vacate(&msp->ms_allocmap[0], zdb_leak,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1312
			    &msp->ms_allocmap[0]);
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1731
diff changeset
  1313
			space_map_unload(&msp->ms_allocmap[0]);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1314
			space_map_vacate(&msp->ms_freemap[0], NULL, NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1315
			mutex_exit(&msp->ms_lock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1316
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1317
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1318
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1319
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1320
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1321
zdb_refresh_ubsync(spa_t *spa)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1322
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1323
	uberblock_t ub = { 0 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1324
	vdev_t *rvd = spa->spa_root_vdev;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1325
	zio_t *zio;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1326
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1327
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1328
	 * Reload the uberblock.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1329
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1330
	zio = zio_root(spa, NULL, NULL,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1331
	    ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1332
	vdev_uberblock_load(zio, rvd, &ub);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1333
	(void) zio_wait(zio);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1334
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1335
	if (ub.ub_txg != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1336
		spa->spa_ubsync = ub;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1337
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1338
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1339
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1340
 * Verify that the sum of the sizes of all blocks in the pool adds up
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1341
 * to the SPA's sa_alloc total.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1342
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1343
typedef struct zdb_blkstats {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1344
	uint64_t	zb_asize;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1345
	uint64_t	zb_lsize;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1346
	uint64_t	zb_psize;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1347
	uint64_t	zb_count;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1348
} zdb_blkstats_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1349
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1350
#define	DMU_OT_DEFERRED	DMU_OT_NONE
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1351
#define	DMU_OT_TOTAL	DMU_OT_NUMTYPES
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1352
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1353
#define	ZB_TOTAL	ZB_MAXLEVEL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1354
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1355
typedef struct zdb_cb {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1356
	zdb_blkstats_t	zcb_type[ZB_TOTAL + 1][DMU_OT_TOTAL + 1];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1357
	uint64_t	zcb_errors[256];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1358
	traverse_blk_cache_t *zcb_cache;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1359
	int		zcb_readfails;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1360
	int		zcb_haderrors;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1361
} zdb_cb_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1362
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1363
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1364
zdb_count_block(spa_t *spa, zdb_cb_t *zcb, blkptr_t *bp, int type)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1365
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1366
	int i, error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1367
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1368
	for (i = 0; i < 4; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1369
		int l = (i < 2) ? BP_GET_LEVEL(bp) : ZB_TOTAL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1370
		int t = (i & 1) ? type : DMU_OT_TOTAL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1371
		zdb_blkstats_t *zb = &zcb->zcb_type[l][t];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1372
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1373
		zb->zb_asize += BP_GET_ASIZE(bp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1374
		zb->zb_lsize += BP_GET_LSIZE(bp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1375
		zb->zb_psize += BP_GET_PSIZE(bp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1376
		zb->zb_count++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1377
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1378
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1379
	if (dump_opt['L'])
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1380
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1381
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  1382
	error = zdb_space_map_claim(spa, bp, &zcb->zcb_cache->bc_bookmark);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1383
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1384
	if (error == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1385
		return;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1386
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1387
	if (error == EAGAIN)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1388
		(void) fatal("double-allocation, bp=%p", bp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1389
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1390
	if (error == ESTALE)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1391
		(void) fatal("reference to freed block, bp=%p", bp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1392
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1393
	(void) fatal("fatal error %d in bp %p", error, bp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1394
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1395
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1396
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1397
zdb_blkptr_cb(traverse_blk_cache_t *bc, spa_t *spa, void *arg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1398
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1399
	zbookmark_t *zb = &bc->bc_bookmark;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1400
	zdb_cb_t *zcb = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1401
	blkptr_t *bp = &bc->bc_blkptr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1402
	dmu_object_type_t type = BP_GET_TYPE(bp);
896
f5270e6bd04d 6348089 panic in dbuf_remove_ref
maybee
parents: 885
diff changeset
  1403
	char blkbuf[BP_SPRINTF_LEN];
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1404
	int error = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1405
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1406
	if (bc->bc_errno) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1407
		if (zcb->zcb_readfails++ < 10 && dump_opt['L']) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1408
			zdb_refresh_ubsync(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1409
			error = EAGAIN;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1410
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1411
			zcb->zcb_haderrors = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1412
			zcb->zcb_errors[bc->bc_errno]++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1413
			error = ERESTART;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1414
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1415
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1416
		if (dump_opt['b'] >= 3 || (dump_opt['b'] >= 2 && bc->bc_errno))
896
f5270e6bd04d 6348089 panic in dbuf_remove_ref
maybee
parents: 885
diff changeset
  1417
			sprintf_blkptr(blkbuf, BP_SPRINTF_LEN, bp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1418
		else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1419
			blkbuf[0] = '\0';
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1420
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1421
		(void) printf("zdb_blkptr_cb: Got error %d reading "
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  1422
		    "<%llu, %llu, %lld, %llx> %s -- %s\n",
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1423
		    bc->bc_errno,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1424
		    (u_longlong_t)zb->zb_objset,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1425
		    (u_longlong_t)zb->zb_object,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  1426
		    (u_longlong_t)zb->zb_level,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1427
		    (u_longlong_t)zb->zb_blkid,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1428
		    blkbuf,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1429
		    error == EAGAIN ? "retrying" : "skipping");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1430
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1431
		return (error);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1432
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1433
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1434
	zcb->zcb_readfails = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1435
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1436
	ASSERT(!BP_IS_HOLE(bp));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1437
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1438
	if (dump_opt['b'] >= 4) {
896
f5270e6bd04d 6348089 panic in dbuf_remove_ref
maybee
parents: 885
diff changeset
  1439
		sprintf_blkptr(blkbuf, BP_SPRINTF_LEN, bp);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1440
		(void) printf("objset %llu object %llu offset 0x%llx %s\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1441
		    (u_longlong_t)zb->zb_objset,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1442
		    (u_longlong_t)zb->zb_object,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1443
		    (u_longlong_t)blkid2offset(bc->bc_dnode,
4070
4390ea390a1e 6386594 zdb message should be clearer when failing for lack of permissions
mc142369
parents: 3912
diff changeset
  1444
			zb->zb_level, zb->zb_blkid),
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1445
		    blkbuf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1446
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1447
1807
35c8b566d7af 6410711 intent log blocks don't get invited to pool parties
bonwick
parents: 1775
diff changeset
  1448
	zdb_count_block(spa, zcb, bp, type);
35c8b566d7af 6410711 intent log blocks don't get invited to pool parties
bonwick
parents: 1775
diff changeset
  1449
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1450
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1451
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1452
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1453
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1454
dump_block_stats(spa_t *spa)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1455
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1456
	traverse_handle_t *th;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1457
	zdb_cb_t zcb = { 0 };
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  1458
	traverse_blk_cache_t dummy_cache = { 0 };
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1459
	zdb_blkstats_t *zb, *tzb;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1460
	uint64_t alloc, space;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1461
	int leaks = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1462
	int advance = zdb_advance;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1463
	int flags;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1464
	int e;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1465
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  1466
	zcb.zcb_cache = &dummy_cache;
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  1467
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1468
	if (dump_opt['c'])
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1469
		advance |= ADVANCE_DATA;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1470
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  1471
	advance |= ADVANCE_PRUNE | ADVANCE_ZIL;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1472
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1473
	(void) printf("\nTraversing all blocks to %sverify"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1474
	    " nothing leaked ...\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1475
	    dump_opt['c'] ? "verify checksums and " : "");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1476
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1477
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1478
	 * Load all space maps.  As we traverse the pool, if we find a block
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1479
	 * that's not in its space map, that indicates a double-allocation,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1480
	 * reference to a freed block, or an unclaimed block.  Otherwise we
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1481
	 * remove the block from the space map.  If the space maps are not
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1482
	 * empty when we're done, that indicates leaked blocks.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1483
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1484
	if (!dump_opt['L'])
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1485
		zdb_space_map_load(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1486
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1487
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1488
	 * If there's a deferred-free bplist, process that first.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1489
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1490
	if (spa->spa_sync_bplist_obj != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1491
		bplist_t *bpl = &spa->spa_sync_bplist;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1492
		blkptr_t blk;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1493
		uint64_t itor = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1494
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  1495
		VERIFY(0 == bplist_open(bpl, spa->spa_meta_objset,
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  1496
		    spa->spa_sync_bplist_obj));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1497
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1498
		while (bplist_iterate(bpl, &itor, &blk) == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1499
			if (dump_opt['b'] >= 4) {
896
f5270e6bd04d 6348089 panic in dbuf_remove_ref
maybee
parents: 885
diff changeset
  1500
				char blkbuf[BP_SPRINTF_LEN];
f5270e6bd04d 6348089 panic in dbuf_remove_ref
maybee
parents: 885
diff changeset
  1501
				sprintf_blkptr(blkbuf, BP_SPRINTF_LEN, &blk);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1502
				(void) printf("[%s] %s\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1503
				    "deferred free", blkbuf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1504
			}
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1505
			zdb_count_block(spa, &zcb, &blk, DMU_OT_DEFERRED);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1506
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1507
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1508
		bplist_close(bpl);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1509
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1510
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1511
	/*
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  1512
	 * Now traverse the pool.  If we're reading all data to verify
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  1513
	 * checksums, do a scrubbing read so that we validate all copies.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1514
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1515
	flags = ZIO_FLAG_CANFAIL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1516
	if (advance & ADVANCE_DATA)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1517
		flags |= ZIO_FLAG_SCRUB;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1518
	th = traverse_init(spa, zdb_blkptr_cb, &zcb, advance, flags);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1519
	th->th_noread = zdb_noread;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1520
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1731
diff changeset
  1521
	traverse_add_pool(th, 0, spa_first_txg(spa) + TXG_CONCURRENT_STATES);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1522
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1523
	while (traverse_more(th) == EAGAIN)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1524
		continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1525
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1526
	traverse_fini(th);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1527
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1528
	if (zcb.zcb_haderrors) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1529
		(void) printf("\nError counts:\n\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1530
		(void) printf("\t%5s  %s\n", "errno", "count");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1531
		for (e = 0; e < 256; e++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1532
			if (zcb.zcb_errors[e] != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1533
				(void) printf("\t%5d  %llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1534
				    e, (u_longlong_t)zcb.zcb_errors[e]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1535
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1536
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1537
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1538
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1539
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1540
	 * Report any leaked segments.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1541
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1542
	if (!dump_opt['L'])
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1731
diff changeset
  1543
		zdb_space_map_unload(spa);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1544
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1545
	if (dump_opt['L'])
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1546
		(void) printf("\n\n *** Live pool traversal; "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1547
		    "block counts are only approximate ***\n\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1548
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1549
	alloc = spa_get_alloc(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1550
	space = spa_get_space(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1551
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1552
	tzb = &zcb.zcb_type[ZB_TOTAL][DMU_OT_TOTAL];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1553
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1554
	if (tzb->zb_asize == alloc) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1555
		(void) printf("\n\tNo leaks (block sum matches space"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1556
		    " maps exactly)\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1557
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1558
		(void) printf("block traversal size %llu != alloc %llu "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1559
		    "(leaked %lld)\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1560
		    (u_longlong_t)tzb->zb_asize,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1561
		    (u_longlong_t)alloc,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1562
		    (u_longlong_t)(alloc - tzb->zb_asize));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1563
		leaks = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1564
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1565
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1566
	if (tzb->zb_count == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1567
		return (2);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1568
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1569
	(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1570
	(void) printf("\tbp count:      %10llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1571
	    (u_longlong_t)tzb->zb_count);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1572
	(void) printf("\tbp logical:    %10llu\t avg: %6llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1573
	    (u_longlong_t)tzb->zb_lsize,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1574
	    (u_longlong_t)(tzb->zb_lsize / tzb->zb_count));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1575
	(void) printf("\tbp physical:   %10llu\t avg:"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1576
	    " %6llu\tcompression: %6.2f\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1577
	    (u_longlong_t)tzb->zb_psize,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1578
	    (u_longlong_t)(tzb->zb_psize / tzb->zb_count),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1579
	    (double)tzb->zb_lsize / tzb->zb_psize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1580
	(void) printf("\tbp allocated:  %10llu\t avg:"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1581
	    " %6llu\tcompression: %6.2f\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1582
	    (u_longlong_t)tzb->zb_asize,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1583
	    (u_longlong_t)(tzb->zb_asize / tzb->zb_count),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1584
	    (double)tzb->zb_lsize / tzb->zb_asize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1585
	(void) printf("\tSPA allocated: %10llu\tused: %5.2f%%\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1586
	    (u_longlong_t)alloc, 100.0 * alloc / space);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1587
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1588
	if (dump_opt['b'] >= 2) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1589
		int l, t, level;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1590
		(void) printf("\nBlocks\tLSIZE\tPSIZE\tASIZE"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1591
		    "\t  avg\t comp\t%%Total\tType\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1592
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1593
		for (t = 0; t <= DMU_OT_NUMTYPES; t++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1594
			char csize[6], lsize[6], psize[6], asize[6], avg[6];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1595
			char *typename;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1596
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1597
			typename = t == DMU_OT_DEFERRED ? "deferred free" :
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1598
			    t == DMU_OT_TOTAL ? "Total" : dmu_ot[t].ot_name;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1599
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1600
			if (zcb.zcb_type[ZB_TOTAL][t].zb_asize == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1601
				(void) printf("%6s\t%5s\t%5s\t%5s"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1602
				    "\t%5s\t%5s\t%6s\t%s\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1603
				    "-",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1604
				    "-",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1605
				    "-",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1606
				    "-",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1607
				    "-",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1608
				    "-",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1609
				    "-",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1610
				    typename);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1611
				continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1612
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1613
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1614
			for (l = ZB_TOTAL - 1; l >= -1; l--) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1615
				level = (l == -1 ? ZB_TOTAL : l);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1616
				zb = &zcb.zcb_type[level][t];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1617
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1618
				if (zb->zb_asize == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1619
					continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1620
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1621
				if (dump_opt['b'] < 3 && level != ZB_TOTAL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1622
					continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1623
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1624
				if (level == 0 && zb->zb_asize ==
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1625
				    zcb.zcb_type[ZB_TOTAL][t].zb_asize)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1626
					continue;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1627
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1628
				nicenum(zb->zb_count, csize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1629
				nicenum(zb->zb_lsize, lsize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1630
				nicenum(zb->zb_psize, psize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1631
				nicenum(zb->zb_asize, asize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1632
				nicenum(zb->zb_asize / zb->zb_count, avg);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1633
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1634
				(void) printf("%6s\t%5s\t%5s\t%5s\t%5s"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1635
				    "\t%5.2f\t%6.2f\t",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1636
				    csize, lsize, psize, asize, avg,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1637
				    (double)zb->zb_lsize / zb->zb_psize,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1638
				    100.0 * zb->zb_asize / tzb->zb_asize);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1639
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1640
				if (level == ZB_TOTAL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1641
					(void) printf("%s\n", typename);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1642
				else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1643
					(void) printf("    L%d %s\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1644
					    level, typename);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1645
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1646
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1647
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1648
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1649
	(void) printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1650
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1651
	if (leaks)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1652
		return (2);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1653
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1654
	if (zcb.zcb_haderrors)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1655
		return (3);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1656
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1657
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1658
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1659
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1660
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1661
dump_zpool(spa_t *spa)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1662
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1663
	dsl_pool_t *dp = spa_get_dsl(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1664
	int rc = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1665
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1666
	if (dump_opt['u'])
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1667
		dump_uberblock(&spa->spa_uberblock);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1668
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1669
	if (dump_opt['d'] || dump_opt['i']) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1670
		dump_dir(dp->dp_meta_objset);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1671
		if (dump_opt['d'] >= 3) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1672
			dump_bplist(dp->dp_meta_objset,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1673
			    spa->spa_sync_bplist_obj, "Deferred frees");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1674
			dump_dtl(spa->spa_root_vdev, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1675
			dump_metaslabs(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1676
		}
2199
712a788c2dfd PSARC 2006/388 snapshot -r
ahrens
parents: 2082
diff changeset
  1677
		(void) dmu_objset_find(spa->spa_name, dump_one_dir, NULL,
2417
694d5de97348 6444346 zfs promote fails in zone
ahrens
parents: 2199
diff changeset
  1678
		    DS_FIND_SNAPSHOTS | DS_FIND_CHILDREN);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1679
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1680
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1681
	if (dump_opt['b'] || dump_opt['c'])
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1682
		rc = dump_block_stats(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1683
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1684
	if (dump_opt['s'])
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1685
		show_pool_stats(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1686
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1687
	if (rc != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1688
		exit(rc);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1689
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1690
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1691
#define	ZDB_FLAG_CHECKSUM	0x0001
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1692
#define	ZDB_FLAG_DECOMPRESS	0x0002
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1693
#define	ZDB_FLAG_BSWAP		0x0004
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1694
#define	ZDB_FLAG_GBH		0x0008
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1695
#define	ZDB_FLAG_INDIRECT	0x0010
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1696
#define	ZDB_FLAG_PHYS		0x0020
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1697
#define	ZDB_FLAG_RAW		0x0040
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1698
#define	ZDB_FLAG_PRINT_BLKPTR	0x0080
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1699
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1700
int flagbits[256];
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1701
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1702
static void
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1703
zdb_print_blkptr(blkptr_t *bp, int flags)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1704
{
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1705
	dva_t *dva = bp->blk_dva;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1706
	int d;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1707
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1708
	if (flags & ZDB_FLAG_BSWAP)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1709
		byteswap_uint64_array((void *)bp, sizeof (blkptr_t));
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1710
	/*
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1711
	 * Super-ick warning:  This code is also duplicated in
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1712
	 * cmd/mdb/common/modules/zfs/zfs.c .  Yeah, I hate code
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1713
	 * replication, too.
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1714
	 */
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1715
	for (d = 0; d < BP_GET_NDVAS(bp); d++) {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1716
		(void) printf("\tDVA[%d]: vdev_id %lld / %llx\n", d,
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2417
diff changeset
  1717
		    (longlong_t)DVA_GET_VDEV(&dva[d]),
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2417
diff changeset
  1718
		    (longlong_t)DVA_GET_OFFSET(&dva[d]));
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1719
		(void) printf("\tDVA[%d]:       GANG: %-5s  GRID:  %04llx\t"
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1720
		    "ASIZE: %llx\n", d,
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1721
		    DVA_GET_GANG(&dva[d]) ? "TRUE" : "FALSE",
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2417
diff changeset
  1722
		    (longlong_t)DVA_GET_GRID(&dva[d]),
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2417
diff changeset
  1723
		    (longlong_t)DVA_GET_ASIZE(&dva[d]));
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1724
		(void) printf("\tDVA[%d]: :%llu:%llx:%llx:%s%s%s%s\n", d,
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2417
diff changeset
  1725
		    (u_longlong_t)DVA_GET_VDEV(&dva[d]),
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2417
diff changeset
  1726
		    (longlong_t)DVA_GET_OFFSET(&dva[d]),
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2417
diff changeset
  1727
		    (longlong_t)BP_GET_PSIZE(bp),
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1728
		    BP_SHOULD_BYTESWAP(bp) ? "e" : "",
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1729
		    !DVA_GET_GANG(&dva[d]) && BP_GET_LEVEL(bp) != 0 ?
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1730
		    "d" : "",
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1731
		    DVA_GET_GANG(&dva[d]) ? "g" : "",
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1732
		    BP_GET_COMPRESS(bp) != 0 ? "d" : "");
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1733
	}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1734
	(void) printf("\tLSIZE:  %-16llx\t\tPSIZE: %llx\n",
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2417
diff changeset
  1735
	    (longlong_t)BP_GET_LSIZE(bp), (longlong_t)BP_GET_PSIZE(bp));
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1736
	(void) printf("\tENDIAN: %6s\t\t\t\t\tTYPE:  %s\n",
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1737
	    BP_GET_BYTEORDER(bp) ? "LITTLE" : "BIG",
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1738
	    dmu_ot[BP_GET_TYPE(bp)].ot_name);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1739
	(void) printf("\tBIRTH:  %-16llx   LEVEL: %-2llu\tFILL:  %llx\n",
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2417
diff changeset
  1740
	    (u_longlong_t)bp->blk_birth, (u_longlong_t)BP_GET_LEVEL(bp),
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1741
	    (u_longlong_t)bp->blk_fill);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1742
	(void) printf("\tCKFUNC: %-16s\t\tCOMP:  %s\n",
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1743
	    zio_checksum_table[BP_GET_CHECKSUM(bp)].ci_name,
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1744
	    zio_compress_table[BP_GET_COMPRESS(bp)].ci_name);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1745
	(void) printf("\tCKSUM:  %llx:%llx:%llx:%llx\n",
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1746
	    (u_longlong_t)bp->blk_cksum.zc_word[0],
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1747
	    (u_longlong_t)bp->blk_cksum.zc_word[1],
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1748
	    (u_longlong_t)bp->blk_cksum.zc_word[2],
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1749
	    (u_longlong_t)bp->blk_cksum.zc_word[3]);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1750
}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1751
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1752
static void
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1753
zdb_dump_indirect(blkptr_t *bp, int nbps, int flags)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1754
{
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1755
	int i;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1756
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1757
	for (i = 0; i < nbps; i++)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1758
		zdb_print_blkptr(&bp[i], flags);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1759
}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1760
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1761
static void
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1762
zdb_dump_gbh(void *buf, int flags)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1763
{
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1764
	zdb_dump_indirect((blkptr_t *)buf, SPA_GBH_NBLKPTRS, flags);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1765
}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1766
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1767
static void
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1768
zdb_dump_block_raw(void *buf, uint64_t size, int flags)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1769
{
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1770
	if (flags & ZDB_FLAG_BSWAP)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1771
		byteswap_uint64_array(buf, size);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1772
	(void) write(2, buf, size);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1773
}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1774
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1775
static void
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1776
zdb_dump_block(char *label, void *buf, uint64_t size, int flags)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1777
{
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1778
	uint64_t *d = (uint64_t *)buf;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1779
	int nwords = size / sizeof (uint64_t);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1780
	int do_bswap = !!(flags & ZDB_FLAG_BSWAP);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1781
	int i, j;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1782
	char *hdr, *c;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1783
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1784
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1785
	if (do_bswap)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1786
		hdr = " 7 6 5 4 3 2 1 0   f e d c b a 9 8";
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1787
	else
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1788
		hdr = " 0 1 2 3 4 5 6 7   8 9 a b c d e f";
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1789
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1790
	(void) printf("\n%s\n%6s   %s  0123456789abcdef\n", label, "", hdr);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1791
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1792
	for (i = 0; i < nwords; i += 2) {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1793
		(void) printf("%06llx:  %016llx  %016llx  ",
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1794
		    (u_longlong_t)(i * sizeof (uint64_t)),
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1795
		    (u_longlong_t)(do_bswap ? BSWAP_64(d[i]) : d[i]),
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1796
		    (u_longlong_t)(do_bswap ? BSWAP_64(d[i + 1]) : d[i + 1]));
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1797
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1798
		c = (char *)&d[i];
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1799
		for (j = 0; j < 2 * sizeof (uint64_t); j++)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1800
			(void) printf("%c", isprint(c[j]) ? c[j] : '.');
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1801
		(void) printf("\n");
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1802
	}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1803
}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1804
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1805
/*
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1806
 * There are two acceptable formats:
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1807
 *	leaf_name	  - For example: c1t0d0 or /tmp/ztest.0a
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1808
 *	child[.child]*    - For example: 0.1.1
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1809
 *
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1810
 * The second form can be used to specify arbitrary vdevs anywhere
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1811
 * in the heirarchy.  For example, in a pool with a mirror of
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1812
 * RAID-Zs, you can specify either RAID-Z vdev with 0.0 or 0.1 .
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1813
 */
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1814
static vdev_t *
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1815
zdb_vdev_lookup(vdev_t *vdev, char *path)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1816
{
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1817
	char *s, *p, *q;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1818
	int i;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1819
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1820
	if (vdev == NULL)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1821
		return (NULL);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1822
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1823
	/* First, assume the x.x.x.x format */
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1824
	i = (int)strtoul(path, &s, 10);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1825
	if (s == path || (s && *s != '.' && *s != '\0'))
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1826
		goto name;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1827
	if (i < 0 || i >= vdev->vdev_children)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1828
		return (NULL);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1829
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1830
	vdev = vdev->vdev_child[i];
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1831
	if (*s == '\0')
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1832
		return (vdev);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1833
	return (zdb_vdev_lookup(vdev, s+1));
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1834
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1835
name:
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1836
	for (i = 0; i < vdev->vdev_children; i++) {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1837
		vdev_t *vc = vdev->vdev_child[i];
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1838
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1839
		if (vc->vdev_path == NULL) {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1840
			vc = zdb_vdev_lookup(vc, path);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1841
			if (vc == NULL)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1842
				continue;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1843
			else
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1844
				return (vc);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1845
		}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1846
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1847
		p = strrchr(vc->vdev_path, '/');
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1848
		p = p ? p + 1 : vc->vdev_path;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1849
		q = &vc->vdev_path[strlen(vc->vdev_path) - 2];
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1850
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1851
		if (strcmp(vc->vdev_path, path) == 0)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1852
			return (vc);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1853
		if (strcmp(p, path) == 0)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1854
			return (vc);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1855
		if (strcmp(q, "s0") == 0 && strncmp(p, path, q - p) == 0)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1856
			return (vc);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1857
	}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1858
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1859
	return (NULL);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1860
}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1861
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1862
/*
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1863
 * Read a block from a pool and print it out.  The syntax of the
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1864
 * block descriptor is:
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1865
 *
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1866
 *	pool:vdev_specifier:offset:size[:flags]
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1867
 *
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1868
 *	pool           - The name of the pool you wish to read from
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1869
 *	vdev_specifier - Which vdev (see comment for zdb_vdev_lookup)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1870
 *	offset         - offset, in hex, in bytes
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1871
 *	size           - Amount of data to read, in hex, in bytes
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1872
 *	flags          - A string of characters specifying options
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1873
 *		 b: Decode a blkptr at given offset within block
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1874
 *		*c: Calculate and display checksums
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1875
 *		*d: Decompress data before dumping
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1876
 *		 e: Byteswap data before dumping
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1877
 *		*g: Display data as a gang block header
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1878
 *		*i: Display as an indirect block
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1879
 *		 p: Do I/O to physical offset
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1880
 *		 r: Dump raw data to stdout
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1881
 *
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1882
 *              * = not yet implemented
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1883
 */
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1884
static void
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1885
zdb_read_block(char *thing, spa_t **spap)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1886
{
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1887
	spa_t *spa = *spap;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1888
	int flags = 0;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1889
	uint64_t offset = 0, size = 0, blkptr_offset = 0;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1890
	zio_t *zio;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1891
	vdev_t *vd;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1892
	void *buf;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1893
	char *s, *p, *dup, *spa_name, *vdev, *flagstr;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1894
	int i, error, zio_flags;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1895
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1896
	dup = strdup(thing);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1897
	s = strtok(dup, ":");
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1898
	spa_name = s ? s : "";
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1899
	s = strtok(NULL, ":");
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1900
	vdev = s ? s : "";
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1901
	s = strtok(NULL, ":");
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1902
	offset = strtoull(s ? s : "", NULL, 16);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1903
	s = strtok(NULL, ":");
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1904
	size = strtoull(s ? s : "", NULL, 16);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1905
	s = strtok(NULL, ":");
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1906
	flagstr = s ? s : "";
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1907
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1908
	s = NULL;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1909
	if (size == 0)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1910
		s = "size must not be zero";
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1911
	if (!IS_P2ALIGNED(size, DEV_BSIZE))
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1912
		s = "size must be a multiple of sector size";
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1913
	if (!IS_P2ALIGNED(offset, DEV_BSIZE))
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1914
		s = "offset must be a multiple of sector size";
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1915
	if (s) {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1916
		(void) printf("Invalid block specifier: %s  - %s\n", thing, s);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1917
		free(dup);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1918
		return;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1919
	}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1920
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1921
	for (s = strtok(flagstr, ":"); s; s = strtok(NULL, ":")) {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1922
		for (i = 0; flagstr[i]; i++) {
2856
6f4d5ee1906a 6463348 ZFS code could be more portable
nd150628
parents: 2417
diff changeset
  1923
			int bit = flagbits[(uchar_t)flagstr[i]];
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1924
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1925
			if (bit == 0) {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1926
				(void) printf("***Invalid flag: %c\n",
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1927
				    flagstr[i]);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1928
				continue;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1929
			}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1930
			flags |= bit;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1931
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1932
			/* If it's not something with an argument, keep going */
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1933
			if ((bit & (ZDB_FLAG_CHECKSUM | ZDB_FLAG_DECOMPRESS |
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1934
			    ZDB_FLAG_PRINT_BLKPTR)) == 0)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1935
				continue;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1936
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1937
			p = &flagstr[i + 1];
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1938
			if (bit == ZDB_FLAG_PRINT_BLKPTR)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1939
				blkptr_offset = strtoull(p, &p, 16);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1940
			if (*p != ':' && *p != '\0') {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1941
				(void) printf("***Invalid flag arg: '%s'\n", s);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1942
				free(dup);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1943
				return;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1944
			}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1945
		}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1946
	}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1947
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1948
	if (spa == NULL || spa->spa_name == NULL ||
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1949
	    strcmp(spa->spa_name, spa_name)) {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1950
		if (spa && spa->spa_name)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1951
			spa_close(spa, (void *)zdb_read_block);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1952
		error = spa_open(spa_name, spap, (void *)zdb_read_block);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1953
		if (error)
4070
4390ea390a1e 6386594 zdb message should be clearer when failing for lack of permissions
mc142369
parents: 3912
diff changeset
  1954
			fatal("Failed to open pool '%s': %s",
4390ea390a1e 6386594 zdb message should be clearer when failing for lack of permissions
mc142369
parents: 3912
diff changeset
  1955
			    spa_name, strerror(error));
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1956
		spa = *spap;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1957
	}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1958
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1959
	vd = zdb_vdev_lookup(spa->spa_root_vdev, vdev);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1960
	if (vd == NULL) {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1961
		(void) printf("***Invalid vdev: %s\n", vdev);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1962
		free(dup);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1963
		return;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1964
	} else {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1965
		if (vd->vdev_path)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1966
			(void) printf("Found vdev: %s\n", vd->vdev_path);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1967
		else
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1968
			(void) printf("Found vdev type: %s\n",
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1969
			    vd->vdev_ops->vdev_op_type);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1970
	}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1971
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1972
	buf = umem_alloc(size, UMEM_NOFAIL);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1973
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1974
	zio_flags = ZIO_FLAG_DONT_CACHE | ZIO_FLAG_DONT_QUEUE |
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1975
	    ZIO_FLAG_DONT_PROPAGATE | ZIO_FLAG_DONT_RETRY | ZIO_FLAG_NOBOOKMARK;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1976
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1977
	if (flags & ZDB_FLAG_PHYS)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1978
		zio_flags |= ZIO_FLAG_PHYSICAL;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1979
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1980
	zio = zio_root(spa, NULL, NULL, 0);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1981
	/* XXX todo - cons up a BP so RAID-Z will be happy */
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1982
	zio_nowait(zio_vdev_child_io(zio, NULL, vd, offset, buf, size,
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1983
	    ZIO_TYPE_READ, ZIO_PRIORITY_SYNC_READ, zio_flags, NULL, NULL));
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1984
	error = zio_wait(zio);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1985
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1986
	if (error) {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1987
		(void) printf("Read of %s failed, error: %d\n", thing, error);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1988
		goto out;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1989
	}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1990
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1991
	if (flags & ZDB_FLAG_PRINT_BLKPTR)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1992
		zdb_print_blkptr((blkptr_t *)(void *)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1993
		    ((uintptr_t)buf + (uintptr_t)blkptr_offset), flags);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1994
	else if (flags & ZDB_FLAG_RAW)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1995
		zdb_dump_block_raw(buf, size, flags);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1996
	else if (flags & ZDB_FLAG_INDIRECT)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1997
		zdb_dump_indirect((blkptr_t *)buf, size / sizeof (blkptr_t),
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1998
		    flags);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  1999
	else if (flags & ZDB_FLAG_GBH)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2000
		zdb_dump_gbh(buf, flags);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2001
	else
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2002
		zdb_dump_block(thing, buf, size, flags);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2003
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2004
out:
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2005
	umem_free(buf, size);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2006
	free(dup);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2007
}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2008
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2009
int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2010
main(int argc, char **argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2011
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2012
	int i, c;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2013
	struct rlimit rl = { 1024, 1024 };
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2014
	spa_t *spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2015
	objset_t *os = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2016
	char *endstr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2017
	int dump_all = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2018
	int verbose = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2019
	int error;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2020
	int flag, set;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2021
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2022
	(void) setrlimit(RLIMIT_NOFILE, &rl);
1914
8a8c5f225b1b 4916205 libcmd should not use file operation routines from C library
casper
parents: 1807
diff changeset
  2023
	(void) enable_extended_FILE_stdio(-1, -1);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2024
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2025
	dprintf_setup(&argc, argv);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2026
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2027
	while ((c = getopt(argc, argv, "udibcsvCLO:B:UlR")) != -1) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2028
		switch (c) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2029
		case 'u':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2030
		case 'd':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2031
		case 'i':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2032
		case 'b':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2033
		case 'c':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2034
		case 's':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2035
		case 'C':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2036
		case 'l':
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2037
		case 'R':
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2038
			dump_opt[c]++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2039
			dump_all = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2040
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2041
		case 'L':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2042
			dump_opt[c]++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2043
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2044
		case 'O':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2045
			endstr = optarg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2046
			if (endstr[0] == '!') {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2047
				endstr++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2048
				set = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2049
			} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2050
				set = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2051
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2052
			if (strcmp(endstr, "post") == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2053
				flag = ADVANCE_PRE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2054
				set = !set;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2055
			} else if (strcmp(endstr, "pre") == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2056
				flag = ADVANCE_PRE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2057
			} else if (strcmp(endstr, "prune") == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2058
				flag = ADVANCE_PRUNE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2059
			} else if (strcmp(endstr, "data") == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2060
				flag = ADVANCE_DATA;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2061
			} else if (strcmp(endstr, "holes") == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2062
				flag = ADVANCE_HOLES;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2063
			} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2064
				usage();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2065
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2066
			if (set)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2067
				zdb_advance |= flag;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2068
			else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2069
				zdb_advance &= ~flag;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2070
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2071
		case 'B':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2072
			endstr = optarg - 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2073
			zdb_noread.zb_objset = strtoull(endstr + 1, &endstr, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2074
			zdb_noread.zb_object = strtoull(endstr + 1, &endstr, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2075
			zdb_noread.zb_level = strtol(endstr + 1, &endstr, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2076
			zdb_noread.zb_blkid = strtoull(endstr + 1, &endstr, 16);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2077
			(void) printf("simulating bad block "
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  2078
			    "<%llu, %llu, %lld, %llx>\n",
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2079
			    (u_longlong_t)zdb_noread.zb_objset,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2080
			    (u_longlong_t)zdb_noread.zb_object,
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  2081
			    (u_longlong_t)zdb_noread.zb_level,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2082
			    (u_longlong_t)zdb_noread.zb_blkid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2083
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2084
		case 'v':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2085
			verbose++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2086
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2087
		case 'U':
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2088
			spa_config_dir = "/tmp";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2089
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2090
		default:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2091
			usage();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2092
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2093
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2094
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2095
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2096
	kernel_init(FREAD);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2097
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  2098
	/*
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  2099
	 * Disable vdev caching.  If we don't do this, live pool traversal
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  2100
	 * won't make progress because it will never see disk updates.
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  2101
	 */
3059
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 3025
diff changeset
  2102
	zfs_vdev_cache_size = 0;
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 1170
diff changeset
  2103
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2104
	for (c = 0; c < 256; c++) {
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2105
		if (dump_all && c != 'L' && c != 'l' && c != 'R')
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2106
			dump_opt[c] = 1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2107
		if (dump_opt[c])
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2108
			dump_opt[c] += verbose;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2109
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2110
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2111
	argc -= optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2112
	argv += optind;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2113
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2114
	if (argc < 1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2115
		if (dump_opt['C']) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2116
			dump_config(NULL);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2117
			return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2118
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2119
		usage();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2120
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2121
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2122
	if (dump_opt['l']) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2123
		dump_label(argv[0]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2124
		return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2125
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2126
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2127
	if (dump_opt['R']) {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2128
		flagbits['b'] = ZDB_FLAG_PRINT_BLKPTR;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2129
		flagbits['c'] = ZDB_FLAG_CHECKSUM;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2130
		flagbits['d'] = ZDB_FLAG_DECOMPRESS;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2131
		flagbits['e'] = ZDB_FLAG_BSWAP;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2132
		flagbits['g'] = ZDB_FLAG_GBH;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2133
		flagbits['i'] = ZDB_FLAG_INDIRECT;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2134
		flagbits['p'] = ZDB_FLAG_PHYS;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2135
		flagbits['r'] = ZDB_FLAG_RAW;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2136
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2137
		spa = NULL;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2138
		while (argv[0]) {
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2139
			zdb_read_block(argv[0], &spa);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2140
			argv++;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2141
			argc--;
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2142
		}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2143
		if (spa)
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2144
			spa_close(spa, (void *)zdb_read_block);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2145
		return (0);
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2146
	}
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
  2147
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2148
	if (dump_opt['C'])
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2149
		dump_config(argv[0]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2150
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2151
	if (strchr(argv[0], '/') != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2152
		error = dmu_objset_open(argv[0], DMU_OST_ANY,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2153
		    DS_MODE_STANDARD | DS_MODE_READONLY, &os);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2154
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2155
		error = spa_open(argv[0], &spa, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2156
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2157
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2158
	if (error)
4070
4390ea390a1e 6386594 zdb message should be clearer when failing for lack of permissions
mc142369
parents: 3912
diff changeset
  2159
		fatal("can't open %s: %s", argv[0], strerror(error));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2160
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2161
	argv++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2162
	if (--argc > 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2163
		zopt_objects = argc;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2164
		zopt_object = calloc(zopt_objects, sizeof (uint64_t));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2165
		for (i = 0; i < zopt_objects; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2166
			errno = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2167
			zopt_object[i] = strtoull(argv[i], NULL, 0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2168
			if (zopt_object[i] == 0 && errno != 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2169
				fatal("bad object number %s: %s",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2170
				    argv[i], strerror(errno));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2171
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2172
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2173
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2174
	if (os != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2175
		dump_dir(os);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2176
		dmu_objset_close(os);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2177
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2178
		dump_zpool(spa);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2179
		spa_close(spa, FTAG);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2180
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2181
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2182
	kernel_fini();
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2183
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2184
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2185
}