usr/src/cmd/mdb/common/modules/zfs/zfs.c
author Matthew Ahrens <Matthew.Ahrens@Sun.COM>
Tue, 14 Oct 2008 15:57:18 -0700
changeset 7837 001de5627df3
parent 7754 b80e4842ad54
child 7846 a07ebe2d4dfa
permissions -rw-r--r--
6333409 traversal code should be able to issue multiple reads in parallel 6418042 want traversal in depth-first pre-order for quicker 'zfs send' 6757112 zvol dump code is extra complicated 6725668 want ::zfs_blkstats to show block type stats after scrub 6725675 dmu traverse code has extraneous features 6725680 P2CROSS is confusing to use 6725698 zvol dump device should always be 128k 6729696 sync causes scrub or resilver to pause for up to 30s 6730101 online recv can cause scrub to miss some blocks 6752226 assertion failed in dbuf_verify: db->db.db_size >= dn->dn_datablksz 6577985 panic when zfs send a snapshot with i/o errors 6755042 zdb -Lbc counts block several times in case of checksum errors
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: 952
diff changeset
     5
 * Common Development and Distribution License (the "License").
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 952
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
/*
6245
1a2a7cfb9f26 6429205 each zpool needs to monitor its throughput and throttle heavy writers
maybee
parents: 5367
diff changeset
    22
 * Copyright 2008 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
#include <mdb/mdb_ctf.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    27
#include <sys/zfs_context.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    28
#include <sys/mdb_modapi.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    29
#include <sys/dbuf.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    30
#include <sys/dmu_objset.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    31
#include <sys/dsl_dir.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    32
#include <sys/dsl_pool.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    33
#include <sys/metaslab_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    34
#include <sys/space_map.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    35
#include <sys/list.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    36
#include <sys/spa_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    37
#include <sys/vdev_impl.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    38
#include <sys/zio_compress.h>
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    39
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    40
#ifndef _KERNEL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    41
#include "../genunix/list.h"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    42
#endif
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    43
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    44
#ifdef _KERNEL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    45
#define	ZFS_OBJ_NAME	"zfs"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    46
#else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    47
#define	ZFS_OBJ_NAME	"libzpool.so.1"
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    48
#endif
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    49
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    50
static char *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    51
local_strdup(const char *s)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    52
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    53
	char *s1 = mdb_alloc(strlen(s) + 1, UM_SLEEP);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    54
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    55
	(void) strcpy(s1, s);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    56
	return (s1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    57
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    58
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    59
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    60
getmember(uintptr_t addr, const char *type, mdb_ctf_id_t *idp,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    61
    const char *member, int len, void *buf)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    62
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    63
	mdb_ctf_id_t id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    64
	ulong_t off;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    65
	char name[64];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    66
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    67
	if (idp == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    68
		if (mdb_ctf_lookup_by_name(type, &id) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    69
			mdb_warn("couldn't find type %s", type);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    70
			return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    71
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    72
		idp = &id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    73
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    74
		type = name;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    75
		mdb_ctf_type_name(*idp, name, sizeof (name));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    76
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    77
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    78
	if (mdb_ctf_offsetof(*idp, member, &off) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    79
		mdb_warn("couldn't find member %s of type %s\n", member, type);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    80
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    81
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    82
	if (off % 8 != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    83
		mdb_warn("member %s of type %s is unsupported bitfield",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    84
		    member, type);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    85
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    86
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    87
	off /= 8;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    88
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    89
	if (mdb_vread(buf, len, addr + off) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    90
		mdb_warn("failed to read %s from %s at %p",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    91
		    member, type, addr + off);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    92
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    93
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    94
	/* mdb_warn("read %s from %s at %p+%llx\n", member, type, addr, off); */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    95
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    96
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    97
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    98
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
    99
#define	GETMEMB(addr, type, member, dest) \
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   100
	getmember(addr, #type, NULL, #member, sizeof (dest), &(dest))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   101
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   102
#define	GETMEMBID(addr, ctfid, member, dest) \
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   103
	getmember(addr, NULL, ctfid, #member, sizeof (dest), &(dest))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   104
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   105
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   106
getrefcount(uintptr_t addr, mdb_ctf_id_t *id,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   107
    const char *member, uint64_t *rc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   108
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   109
	static int gotid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   110
	static mdb_ctf_id_t rc_id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   111
	ulong_t off;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   112
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   113
	if (!gotid) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   114
		if (mdb_ctf_lookup_by_name("struct refcount", &rc_id) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   115
			mdb_warn("couldn't find struct refcount");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   116
			return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   117
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   118
		gotid = TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   119
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   120
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   121
	if (mdb_ctf_offsetof(*id, member, &off) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   122
		char name[64];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   123
		mdb_ctf_type_name(*id, name, sizeof (name));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   124
		mdb_warn("couldn't find member %s of type %s\n", member, name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   125
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   126
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   127
	off /= 8;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   128
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   129
	return (GETMEMBID(addr + off, &rc_id, rc_count, *rc));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   130
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   131
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   132
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   133
read_symbol(char *sym_name, void **bufp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   134
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   135
	GElf_Sym sym;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   136
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   137
	if (mdb_lookup_by_obj(MDB_TGT_OBJ_EVERY, sym_name, &sym)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   138
		mdb_warn("can't find symbol %s", sym_name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   139
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   140
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   141
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   142
	*bufp = mdb_alloc(sym.st_size, UM_SLEEP);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   143
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   144
	if (mdb_vread(*bufp, sym.st_size, sym.st_value) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   145
		mdb_warn("can't read data for symbol %s", sym_name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   146
		mdb_free(*bufp, sym.st_size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   147
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   148
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   149
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   150
	return (DCMD_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   151
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   152
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   153
static int verbose;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   154
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   155
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   156
freelist_walk_init(mdb_walk_state_t *wsp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   157
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   158
	if (wsp->walk_addr == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   159
		mdb_warn("must supply starting address\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   160
		return (WALK_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   161
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   162
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   163
	wsp->walk_data = 0;  /* Index into the freelist */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   164
	return (WALK_NEXT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   165
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   166
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   167
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   168
freelist_walk_step(mdb_walk_state_t *wsp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   169
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   170
	uint64_t entry;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   171
	uintptr_t number = (uintptr_t)wsp->walk_data;
3361
a3d194896a76 6480230 ::walk spa|::walk zms_freelist cause mdb to core dump
ck153898
parents: 3158
diff changeset
   172
	char *ddata[] = { "ALLOC", "FREE", "CONDENSE", "INVALID",
a3d194896a76 6480230 ::walk spa|::walk zms_freelist cause mdb to core dump
ck153898
parents: 3158
diff changeset
   173
			    "INVALID", "INVALID", "INVALID", "INVALID" };
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   174
	int mapshift = SPA_MINBLOCKSHIFT;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   175
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   176
	if (mdb_vread(&entry, sizeof (entry), wsp->walk_addr) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   177
		mdb_warn("failed to read freelist entry %p", wsp->walk_addr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   178
		return (WALK_DONE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   179
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   180
	wsp->walk_addr += sizeof (entry);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   181
	wsp->walk_data = (void *)(number + 1);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   182
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   183
	if (SM_DEBUG_DECODE(entry)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   184
		mdb_printf("DEBUG: %3u  %10s: txg=%llu  pass=%llu\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   185
		    number,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   186
		    ddata[SM_DEBUG_ACTION_DECODE(entry)],
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   187
		    SM_DEBUG_TXG_DECODE(entry),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   188
		    SM_DEBUG_SYNCPASS_DECODE(entry));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   189
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   190
		mdb_printf("Entry: %3u  offsets=%08llx-%08llx  type=%c  "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   191
		    "size=%06llx", number,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   192
		    SM_OFFSET_DECODE(entry) << mapshift,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   193
		    (SM_OFFSET_DECODE(entry) + SM_RUN_DECODE(entry)) <<
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   194
		    mapshift,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   195
		    SM_TYPE_DECODE(entry) == SM_ALLOC ? 'A' : 'F',
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   196
		    SM_RUN_DECODE(entry) << mapshift);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   197
		if (verbose)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   198
			mdb_printf("      (raw=%012llx)\n", entry);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   199
		mdb_printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   200
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   201
	return (WALK_NEXT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   202
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   203
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   204
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   205
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   206
dataset_name(uintptr_t addr, char *buf)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   207
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   208
	static int gotid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   209
	static mdb_ctf_id_t dd_id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   210
	uintptr_t dd_parent;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   211
	char dd_myname[MAXNAMELEN];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   212
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   213
	if (!gotid) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   214
		if (mdb_ctf_lookup_by_name("struct dsl_dir",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   215
		    &dd_id) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   216
			mdb_warn("couldn't find struct dsl_dir");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   217
			return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   218
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   219
		gotid = TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   220
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   221
	if (GETMEMBID(addr, &dd_id, dd_parent, dd_parent) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   222
	    GETMEMBID(addr, &dd_id, dd_myname, dd_myname)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   223
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   224
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   225
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   226
	if (dd_parent) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   227
		if (dataset_name(dd_parent, buf))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   228
			return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   229
		strcat(buf, "/");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   230
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   231
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   232
	if (dd_myname[0])
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   233
		strcat(buf, dd_myname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   234
	else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   235
		strcat(buf, "???");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   236
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   237
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   238
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   239
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   240
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   241
objset_name(uintptr_t addr, char *buf)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   242
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   243
	static int gotid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   244
	static mdb_ctf_id_t osi_id, ds_id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   245
	uintptr_t os_dsl_dataset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   246
	char ds_snapname[MAXNAMELEN];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   247
	uintptr_t ds_dir;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   248
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   249
	buf[0] = '\0';
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   250
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   251
	if (!gotid) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   252
		if (mdb_ctf_lookup_by_name("struct objset_impl",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   253
		    &osi_id) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   254
			mdb_warn("couldn't find struct objset_impl");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   255
			return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   256
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   257
		if (mdb_ctf_lookup_by_name("struct dsl_dataset",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   258
		    &ds_id) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   259
			mdb_warn("couldn't find struct dsl_dataset");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   260
			return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   261
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   262
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   263
		gotid = TRUE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   264
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   265
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   266
	if (GETMEMBID(addr, &osi_id, os_dsl_dataset, os_dsl_dataset))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   267
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   268
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   269
	if (os_dsl_dataset == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   270
		strcat(buf, "mos");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   271
		return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   272
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   273
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   274
	if (GETMEMBID(os_dsl_dataset, &ds_id, ds_snapname, ds_snapname) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   275
	    GETMEMBID(os_dsl_dataset, &ds_id, ds_dir, ds_dir)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   276
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   277
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   278
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   279
	if (ds_dir && dataset_name(ds_dir, buf))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   280
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   281
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   282
	if (ds_snapname[0]) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   283
		strcat(buf, "@");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   284
		strcat(buf, ds_snapname);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   285
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   286
	return (0);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   287
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   288
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   289
static void
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   290
enum_lookup(char *out, size_t size, mdb_ctf_id_t id, int val,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   291
    const char *prefix)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   292
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   293
	const char *cp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   294
	size_t len = strlen(prefix);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   295
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   296
	if ((cp = mdb_ctf_enum_name(id, val)) != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   297
		if (strncmp(cp, prefix, len) == 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   298
			cp += len;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   299
		(void) strncpy(out, cp, size);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   300
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   301
		mdb_snprintf(out, size, "? (%d)", val);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   302
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   303
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   304
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   305
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   306
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   307
zio_pipeline(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   308
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   309
	mdb_ctf_id_t pipe_enum;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   310
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   311
	char stage[1024];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   312
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   313
	if (mdb_ctf_lookup_by_name("enum zio_stage", &pipe_enum) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   314
		mdb_warn("Could not find enum zio_stage");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   315
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   316
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   317
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   318
	for (i = 0; i < 32; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   319
		if (addr & (1U << i)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   320
			enum_lookup(stage, sizeof (stage), pipe_enum, i,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   321
			    "ZIO_STAGE_");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   322
			mdb_printf("    %s\n", stage);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   323
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   324
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   325
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   326
	return (DCMD_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   327
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   328
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   329
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   330
static int
3059
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   331
zfs_params(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   332
{
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   333
	/*
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   334
	 * This table can be approximately generated by running:
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   335
	 * egrep "^[a-z0-9_]+ [a-z0-9_]+( =.*)?;" *.c | cut -d ' ' -f 2
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   336
	 */
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   337
	static const char *params[] = {
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   338
		"arc_reduce_dnlc_percent",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   339
		"zfs_arc_max",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   340
		"zfs_arc_min",
3158
f30a3849aa23 6493923 nfsfind on ZFS filesystem quickly depletes memory in a 1GB system
maybee
parents: 3059
diff changeset
   341
		"arc_shrink_shift",
3059
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   342
		"zfs_mdcomp_disable",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   343
		"zfs_prefetch_disable",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   344
		"zfetch_max_streams",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   345
		"zfetch_min_sec_reap",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   346
		"zfetch_block_cap",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   347
		"zfetch_array_rd_sz",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   348
		"zfs_default_bs",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   349
		"zfs_default_ibs",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   350
		"metaslab_aliquot",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   351
		"reference_tracking_enable",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   352
		"reference_history",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   353
		"zio_taskq_threads",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   354
		"spa_max_replication_override",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   355
		"spa_mode",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   356
		"zfs_flags",
6245
1a2a7cfb9f26 6429205 each zpool needs to monitor its throughput and throttle heavy writers
maybee
parents: 5367
diff changeset
   357
		"zfs_txg_synctime",
1a2a7cfb9f26 6429205 each zpool needs to monitor its throughput and throttle heavy writers
maybee
parents: 5367
diff changeset
   358
		"zfs_txg_timeout",
1a2a7cfb9f26 6429205 each zpool needs to monitor its throughput and throttle heavy writers
maybee
parents: 5367
diff changeset
   359
		"zfs_write_limit_min",
1a2a7cfb9f26 6429205 each zpool needs to monitor its throughput and throttle heavy writers
maybee
parents: 5367
diff changeset
   360
		"zfs_write_limit_max",
1a2a7cfb9f26 6429205 each zpool needs to monitor its throughput and throttle heavy writers
maybee
parents: 5367
diff changeset
   361
		"zfs_write_limit_shift",
1a2a7cfb9f26 6429205 each zpool needs to monitor its throughput and throttle heavy writers
maybee
parents: 5367
diff changeset
   362
		"zfs_write_limit_override",
1a2a7cfb9f26 6429205 each zpool needs to monitor its throughput and throttle heavy writers
maybee
parents: 5367
diff changeset
   363
		"zfs_no_write_throttle",
3059
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   364
		"zfs_vdev_cache_max",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   365
		"zfs_vdev_cache_size",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   366
		"zfs_vdev_cache_bshift",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   367
		"vdev_mirror_shift",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   368
		"zfs_vdev_max_pending",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   369
		"zfs_vdev_min_pending",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   370
		"zfs_scrub_limit",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   371
		"zfs_vdev_time_shift",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   372
		"zfs_vdev_ramp_rate",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   373
		"zfs_vdev_aggregation_limit",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   374
		"fzap_default_block_shift",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   375
		"zfs_immediate_write_sz",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   376
		"zfs_read_chunk_size",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   377
		"zil_disable",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   378
		"zfs_nocacheflush",
6245
1a2a7cfb9f26 6429205 each zpool needs to monitor its throughput and throttle heavy writers
maybee
parents: 5367
diff changeset
   379
		"metaslab_gang_bang",
3059
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   380
		"zio_injection_enabled",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   381
		"zvol_immediate_write_sz",
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   382
	};
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   383
	int i;
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   384
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   385
	for (i = 0; i < sizeof (params) / sizeof (params[0]); i++) {
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   386
		int sz;
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   387
		uint64_t val64;
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   388
		uint32_t *val32p = (uint32_t *)&val64;
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   389
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   390
		sz = mdb_readvar(&val64, params[i]);
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   391
		if (sz == 4) {
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   392
			mdb_printf("%s = 0x%x\n", params[i], *val32p);
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   393
		} else if (sz == 8) {
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   394
			mdb_printf("%s = 0x%llx\n", params[i], val64);
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   395
		} else {
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   396
			mdb_warn("variable %s not found", params[i]);
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   397
		}
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   398
	}
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   399
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   400
	return (DCMD_OK);
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   401
}
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   402
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   403
/* ARGSUSED */
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
   404
static int
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   405
blkptr(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   406
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   407
	blkptr_t bp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   408
	dmu_object_type_info_t *doti;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   409
	zio_compress_info_t *zct;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   410
	zio_checksum_info_t *zci;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   411
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   412
	char buf[MAXPATHLEN];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   413
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   414
	if (mdb_vread(&bp, sizeof (blkptr_t), addr) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   415
		mdb_warn("failed to read blkptr_t");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   416
		return (DCMD_ERR);
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
	if (read_symbol("dmu_ot", (void **)&doti) != DCMD_OK)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   420
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   421
	for (i = 0; i < DMU_OT_NUMTYPES; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   422
		mdb_readstr(buf, sizeof (buf), (uintptr_t)doti[i].ot_name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   423
		doti[i].ot_name = local_strdup(buf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   424
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   425
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   426
	if (read_symbol("zio_checksum_table", (void **)&zci) != DCMD_OK)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   427
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   428
	for (i = 0; i < ZIO_CHECKSUM_FUNCTIONS; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   429
		mdb_readstr(buf, sizeof (buf), (uintptr_t)zci[i].ci_name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   430
		zci[i].ci_name = local_strdup(buf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   431
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   432
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   433
	if (read_symbol("zio_compress_table", (void **)&zct) != DCMD_OK)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   434
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   435
	for (i = 0; i < ZIO_COMPRESS_FUNCTIONS; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   436
		mdb_readstr(buf, sizeof (buf), (uintptr_t)zct[i].ci_name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   437
		zct[i].ci_name = local_strdup(buf);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   438
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   439
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   440
	/*
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   441
	 * 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
   442
	 * cmd/zdb.c .   Yeah, I hate code replication, too.
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   443
	 */
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   444
	for (i = 0; i < BP_GET_NDVAS(&bp); i++) {
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
   445
		dva_t *dva = &bp.blk_dva[i];
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   446
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   447
		mdb_printf("DVA[%d]: vdev_id %lld / %llx\n", i,
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   448
		    DVA_GET_VDEV(dva), DVA_GET_OFFSET(dva));
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   449
		mdb_printf("DVA[%d]:       GANG: %-5s  GRID:  %04x\t"
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   450
		    "ASIZE: %llx\n", i, DVA_GET_GANG(dva) ? "TRUE" : "FALSE",
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   451
		    DVA_GET_GRID(dva), DVA_GET_ASIZE(dva));
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   452
		mdb_printf("DVA[%d]: :%llu:%llx:%llx:%s%s%s%s\n", i,
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   453
		    DVA_GET_VDEV(dva), DVA_GET_OFFSET(dva), BP_GET_PSIZE(&bp),
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   454
		    BP_SHOULD_BYTESWAP(&bp) ? "e" : "",
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   455
		    !DVA_GET_GANG(dva) && BP_GET_LEVEL(&bp) != 0 ? "i" : "",
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   456
		    DVA_GET_GANG(dva) ? "g" : "",
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   457
		    BP_GET_COMPRESS(&bp) != 0 ? "d" : "");
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   458
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   459
	mdb_printf("LSIZE:  %-16llx\t\tPSIZE: %llx\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   460
	    BP_GET_LSIZE(&bp), BP_GET_PSIZE(&bp));
1775
e51e26b432c0 6410698 ZFS metadata needs to be more highly replicated (ditto blocks)
billm
parents: 1732
diff changeset
   461
	mdb_printf("ENDIAN: %6s\t\t\t\t\tTYPE:  %s\n",
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   462
	    BP_GET_BYTEORDER(&bp) ? "LITTLE" : "BIG",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   463
	    doti[BP_GET_TYPE(&bp)].ot_name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   464
	mdb_printf("BIRTH:  %-16llx   LEVEL: %-2d\tFILL:  %llx\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   465
	    bp.blk_birth, BP_GET_LEVEL(&bp), bp.blk_fill);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   466
	mdb_printf("CKFUNC: %-16s\t\tCOMP:  %s\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   467
	    zci[BP_GET_CHECKSUM(&bp)].ci_name,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   468
	    zct[BP_GET_COMPRESS(&bp)].ci_name);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   469
	mdb_printf("CKSUM:  %llx:%llx:%llx:%llx\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   470
	    bp.blk_cksum.zc_word[0],
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   471
	    bp.blk_cksum.zc_word[1],
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   472
	    bp.blk_cksum.zc_word[2],
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   473
	    bp.blk_cksum.zc_word[3]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   474
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   475
	return (DCMD_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   476
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   477
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   478
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   479
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   480
dbuf(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   481
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   482
	mdb_ctf_id_t id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   483
	dmu_buf_t db;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   484
	uintptr_t objset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   485
	uint8_t level;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   486
	uint64_t blkid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   487
	uint64_t holds;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   488
	char objectname[32];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   489
	char blkidname[32];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   490
	char path[MAXNAMELEN];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   491
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   492
	if (DCMD_HDRSPEC(flags)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   493
		mdb_printf("        addr object lvl blkid holds os\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   494
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   495
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   496
	if (mdb_ctf_lookup_by_name("struct dmu_buf_impl", &id) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   497
		mdb_warn("couldn't find struct dmu_buf_impl_t");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   498
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   499
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   500
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   501
	if (GETMEMBID(addr, &id, db_objset, objset) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   502
	    GETMEMBID(addr, &id, db, db) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   503
	    GETMEMBID(addr, &id, db_level, level) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   504
	    GETMEMBID(addr, &id, db_blkid, blkid)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   505
		return (WALK_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   506
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   507
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   508
	if (getrefcount(addr, &id, "db_holds", &holds)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   509
		return (WALK_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   510
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   511
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   512
	if (db.db_object == DMU_META_DNODE_OBJECT)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   513
		(void) strcpy(objectname, "mdn");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   514
	else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   515
		(void) mdb_snprintf(objectname, sizeof (objectname), "%llx",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   516
		    (u_longlong_t)db.db_object);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   517
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   518
	if (blkid == DB_BONUS_BLKID)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   519
		(void) strcpy(blkidname, "bonus");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   520
	else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   521
		(void) mdb_snprintf(blkidname, sizeof (blkidname), "%llx",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   522
		    (u_longlong_t)blkid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   523
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   524
	if (objset_name(objset, path)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   525
		return (WALK_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   526
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   527
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   528
	mdb_printf("%p %8s %1u %9s %2llu %s\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   529
	    addr, objectname, level, blkidname, holds, path);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   530
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   531
	return (DCMD_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   532
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   533
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   534
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   535
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   536
dbuf_stats(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   537
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   538
#define	HISTOSZ 32
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   539
	uintptr_t dbp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   540
	dmu_buf_impl_t db;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   541
	dbuf_hash_table_t ht;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   542
	uint64_t bucket, ndbufs;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   543
	uint64_t histo[HISTOSZ];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   544
	uint64_t histo2[HISTOSZ];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   545
	int i, maxidx;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   546
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   547
	if (mdb_readvar(&ht, "dbuf_hash_table") == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   548
		mdb_warn("failed to read 'dbuf_hash_table'");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   549
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   550
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   551
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   552
	for (i = 0; i < HISTOSZ; i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   553
		histo[i] = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   554
		histo2[i] = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   555
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   556
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   557
	ndbufs = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   558
	for (bucket = 0; bucket < ht.hash_table_mask+1; bucket++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   559
		int len;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   560
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   561
		if (mdb_vread(&dbp, sizeof (void *),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   562
		    (uintptr_t)(ht.hash_table+bucket)) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   563
			mdb_warn("failed to read hash bucket %u at %p",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   564
			    bucket, ht.hash_table+bucket);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   565
			return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   566
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   567
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   568
		len = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   569
		while (dbp != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   570
			if (mdb_vread(&db, sizeof (dmu_buf_impl_t),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   571
			    dbp) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   572
				mdb_warn("failed to read dbuf at %p", dbp);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   573
				return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   574
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   575
			dbp = (uintptr_t)db.db_hash_next;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   576
			for (i = MIN(len, HISTOSZ - 1); i >= 0; i--)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   577
				histo2[i]++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   578
			len++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   579
			ndbufs++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   580
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   581
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   582
		if (len >= HISTOSZ)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   583
			len = HISTOSZ-1;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   584
		histo[len]++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   585
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   586
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   587
	mdb_printf("hash table has %llu buckets, %llu dbufs "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   588
	    "(avg %llu buckets/dbuf)\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   589
	    ht.hash_table_mask+1, ndbufs,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   590
	    (ht.hash_table_mask+1)/ndbufs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   591
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   592
	mdb_printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   593
	maxidx = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   594
	for (i = 0; i < HISTOSZ; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   595
		if (histo[i] > 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   596
			maxidx = i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   597
	mdb_printf("hash chain length	number of buckets\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   598
	for (i = 0; i <= maxidx; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   599
		mdb_printf("%u			%llu\n", i, histo[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   600
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   601
	mdb_printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   602
	maxidx = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   603
	for (i = 0; i < HISTOSZ; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   604
		if (histo2[i] > 0)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   605
			maxidx = i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   606
	mdb_printf("hash chain depth	number of dbufs\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   607
	for (i = 0; i <= maxidx; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   608
		mdb_printf("%u or more		%llu	%llu%%\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   609
		    i, histo2[i], histo2[i]*100/ndbufs);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   610
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   611
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   612
	return (DCMD_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   613
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   614
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   615
typedef struct dbufs_data {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   616
	mdb_ctf_id_t id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   617
	uint64_t objset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   618
	uint64_t object;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   619
	uint64_t level;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   620
	uint64_t blkid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   621
	char *osname;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   622
} dbufs_data_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   623
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   624
#define	DBUFS_UNSET	(0xbaddcafedeadbeefULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   625
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   626
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   627
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   628
dbufs_cb(uintptr_t addr, const void *unknown, void *arg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   629
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   630
	dbufs_data_t *data = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   631
	uintptr_t objset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   632
	dmu_buf_t db;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   633
	uint8_t level;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   634
	uint64_t blkid;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   635
	char osname[MAXNAMELEN];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   636
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   637
	if (GETMEMBID(addr, &data->id, db_objset, objset) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   638
	    GETMEMBID(addr, &data->id, db, db) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   639
	    GETMEMBID(addr, &data->id, db_level, level) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   640
	    GETMEMBID(addr, &data->id, db_blkid, blkid)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   641
		return (WALK_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   642
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   643
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   644
	if ((data->objset == DBUFS_UNSET || data->objset == objset) &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   645
	    (data->osname == NULL || (objset_name(objset, osname) == 0 &&
4055
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
   646
	    strcmp(data->osname, osname) == 0)) &&
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   647
	    (data->object == DBUFS_UNSET || data->object == db.db_object) &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   648
	    (data->level == DBUFS_UNSET || data->level == level) &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   649
	    (data->blkid == DBUFS_UNSET || data->blkid == blkid)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   650
		mdb_printf("%#lr\n", addr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   651
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   652
	return (WALK_NEXT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   653
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   654
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   655
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   656
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   657
dbufs(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   658
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   659
	dbufs_data_t data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   660
	char *object = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   661
	char *blkid = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   662
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   663
	data.objset = data.object = data.level = data.blkid = DBUFS_UNSET;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   664
	data.osname = NULL;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   665
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   666
	if (mdb_getopts(argc, argv,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   667
	    'O', MDB_OPT_UINT64, &data.objset,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   668
	    'n', MDB_OPT_STR, &data.osname,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   669
	    'o', MDB_OPT_STR, &object,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   670
	    'l', MDB_OPT_UINT64, &data.level,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   671
	    'b', MDB_OPT_STR, &blkid) != argc) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   672
		return (DCMD_USAGE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   673
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   674
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   675
	if (object) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   676
		if (strcmp(object, "mdn") == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   677
			data.object = DMU_META_DNODE_OBJECT;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   678
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   679
			data.object = mdb_strtoull(object);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   680
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   681
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   682
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   683
	if (blkid) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   684
		if (strcmp(blkid, "bonus") == 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   685
			data.blkid = DB_BONUS_BLKID;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   686
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   687
			data.blkid = mdb_strtoull(blkid);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   688
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   689
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   690
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   691
	if (mdb_ctf_lookup_by_name("struct dmu_buf_impl", &data.id) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   692
		mdb_warn("couldn't find struct dmu_buf_impl_t");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   693
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   694
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   695
2459
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
   696
	if (mdb_walk("dmu_buf_impl_t", dbufs_cb, &data) != 0) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   697
		mdb_warn("can't walk dbufs");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   698
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   699
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   700
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   701
	return (DCMD_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   702
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   703
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   704
typedef struct abuf_find_data {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   705
	dva_t dva;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   706
	mdb_ctf_id_t id;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   707
} abuf_find_data_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   708
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   709
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   710
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   711
abuf_find_cb(uintptr_t addr, const void *unknown, void *arg)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   712
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   713
	abuf_find_data_t *data = arg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   714
	dva_t dva;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   715
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   716
	if (GETMEMBID(addr, &data->id, b_dva, dva)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   717
		return (WALK_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   718
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   719
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   720
	if (dva.dva_word[0] == data->dva.dva_word[0] &&
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   721
	    dva.dva_word[1] == data->dva.dva_word[1]) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   722
		mdb_printf("%#lr\n", addr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   723
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   724
	return (WALK_NEXT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   725
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   726
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   727
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   728
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   729
abuf_find(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   730
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   731
	abuf_find_data_t data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   732
	GElf_Sym sym;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   733
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   734
	const char *syms[] = {
2885
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2459
diff changeset
   735
		"ARC_mru",
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2459
diff changeset
   736
		"ARC_mru_ghost",
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2459
diff changeset
   737
		"ARC_mfu",
c0259887ebbc 6460059 zfs destroy <snapshot> leaves behind kruft
ahrens
parents: 2459
diff changeset
   738
		"ARC_mfu_ghost",
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   739
	};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   740
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   741
	if (argc != 2)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   742
		return (DCMD_USAGE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   743
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   744
	for (i = 0; i < 2; i ++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   745
		switch (argv[i].a_type) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   746
		case MDB_TYPE_STRING:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   747
			data.dva.dva_word[i] = mdb_strtoull(argv[i].a_un.a_str);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   748
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   749
		case MDB_TYPE_IMMEDIATE:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   750
			data.dva.dva_word[i] = argv[i].a_un.a_val;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   751
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   752
		default:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   753
			return (DCMD_USAGE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   754
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   755
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   756
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   757
	if (mdb_ctf_lookup_by_name("struct arc_buf_hdr", &data.id) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   758
		mdb_warn("couldn't find struct arc_buf_hdr");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   759
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   760
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   761
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   762
	for (i = 0; i < sizeof (syms) / sizeof (syms[0]); i++) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   763
		if (mdb_lookup_by_name(syms[i], &sym)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   764
			mdb_warn("can't find symbol %s", syms[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   765
			return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   766
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   767
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   768
		if (mdb_pwalk("list", abuf_find_cb, &data, sym.st_value) != 0) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   769
			mdb_warn("can't walk %s", syms[i]);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   770
			return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   771
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   772
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   773
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   774
	return (DCMD_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   775
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   776
3403
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   777
/*ARGSUSED*/
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   778
static int
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   779
arc_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   780
{
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   781
	kstat_named_t *stats;
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   782
	GElf_Sym sym;
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   783
	int nstats, i;
3403
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   784
	uint_t opt_a = FALSE;
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   785
	uint_t opt_b = FALSE;
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   786
	uint_t shift = 0;
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   787
	const char *suffix;
3403
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   788
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   789
	static const char *bytestats[] = {
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   790
		"p", "c", "c_min", "c_max", "size", NULL
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   791
	};
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   792
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   793
	static const char *extras[] = {
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   794
		"arc_no_grow", "arc_tempreserve",
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   795
		"arc_meta_used", "arc_meta_limit", "arc_meta_max",
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   796
		NULL
3403
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   797
	};
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   798
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   799
	if (mdb_lookup_by_name("arc_stats", &sym) == -1) {
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   800
		mdb_warn("failed to find 'arc_stats'");
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   801
		return (DCMD_ERR);
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   802
	}
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   803
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   804
	stats = mdb_zalloc(sym.st_size, UM_SLEEP | UM_GC);
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   805
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   806
	if (mdb_vread(stats, sym.st_size, sym.st_value) == -1) {
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   807
		mdb_warn("couldn't read 'arc_stats' at %p", sym.st_value);
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   808
		return (DCMD_ERR);
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   809
	}
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   810
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   811
	nstats = sym.st_size / sizeof (kstat_named_t);
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   812
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   813
	/* NB: -a / opt_a are ignored for backwards compatability */
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   814
	if (mdb_getopts(argc, argv,
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   815
	    'a', MDB_OPT_SETBITS, TRUE, &opt_a,
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   816
	    'b', MDB_OPT_SETBITS, TRUE, &opt_b,
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   817
	    'k', MDB_OPT_SETBITS, 10, &shift,
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   818
	    'm', MDB_OPT_SETBITS, 20, &shift,
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   819
	    'g', MDB_OPT_SETBITS, 30, &shift,
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   820
	    NULL) != argc)
3403
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   821
		return (DCMD_USAGE);
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   822
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   823
	if (!opt_b && !shift)
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   824
		shift = 20;
3403
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   825
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   826
	switch (shift) {
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   827
	case 0:
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   828
		suffix = "B";
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   829
		break;
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   830
	case 10:
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   831
		suffix = "KB";
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   832
		break;
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   833
	case 20:
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   834
		suffix = "MB";
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   835
		break;
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   836
	case 30:
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   837
		suffix = "GB";
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   838
		break;
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   839
	default:
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   840
		suffix = "XX";
3403
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   841
	}
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   842
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   843
	for (i = 0; i < nstats; i++) {
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   844
		int j;
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   845
		boolean_t bytes = B_FALSE;
3403
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   846
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   847
		for (j = 0; bytestats[j]; j++) {
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   848
			if (strcmp(stats[i].name, bytestats[j]) == 0) {
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   849
				bytes = B_TRUE;
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   850
				break;
3403
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   851
			}
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   852
		}
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   853
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   854
		if (bytes) {
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   855
			mdb_printf("%-25s = %9llu %s\n", stats[i].name,
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   856
			    stats[i].value.ui64 >> shift, suffix);
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   857
		} else {
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   858
			mdb_printf("%-25s = %9llu\n", stats[i].name,
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   859
			    stats[i].value.ui64);
3403
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   860
		}
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   861
	}
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   862
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   863
	for (i = 0; extras[i]; i++) {
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   864
		uint64_t buf;
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   865
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   866
		if (mdb_lookup_by_name(extras[i], &sym) == -1) {
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   867
			mdb_warn("failed to find '%s'", extras[i]);
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   868
			return (DCMD_ERR);
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   869
		}
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   870
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   871
		if (sym.st_size != sizeof (uint64_t) &&
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   872
		    sym.st_size != sizeof (uint32_t)) {
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   873
			mdb_warn("expected scalar for variable '%s'\n",
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   874
			    extras[i]);
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   875
			return (DCMD_ERR);
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   876
		}
3403
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   877
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   878
		if (mdb_vread(&buf, sym.st_size, sym.st_value) == -1) {
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   879
			mdb_warn("couldn't read '%s'", extras[i]);
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   880
			return (DCMD_ERR);
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   881
		}
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   882
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   883
		mdb_printf("%-25s = ", extras[i]);
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   884
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   885
		/* NB: all the 64-bit extras happen to be byte counts */
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   886
		if (sym.st_size == sizeof (uint64_t))
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   887
			mdb_printf("%9llu %s\n", buf >> shift, suffix);
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   888
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   889
		if (sym.st_size == sizeof (uint32_t))
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   890
			mdb_printf("%9d\n", *((uint32_t *)&buf));
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
   891
	}
3403
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   892
	return (DCMD_OK);
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   893
}
e52013d23622 6510807 ARC statistics should be exported via kstat
bmc
parents: 3361
diff changeset
   894
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   895
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   896
 * ::spa
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   897
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   898
 * 	-c	Print configuration information as well
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   899
 * 	-v	Print vdev state
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   900
 * 	-e	Print vdev error stats
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   901
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   902
 * Print a summarized spa_t.  When given no arguments, prints out a table of all
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   903
 * active pools on the system.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   904
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   905
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   906
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   907
spa_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   908
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   909
	spa_t spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   910
	const char *statetab[] = { "ACTIVE", "EXPORTED", "DESTROYED",
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7390
diff changeset
   911
		"SPARE", "L2CACHE", "UNINIT", "UNAVAIL", "POTENTIAL" };
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   912
	const char *state;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   913
	int config = FALSE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   914
	int vdevs = FALSE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   915
	int errors = FALSE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   916
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   917
	if (mdb_getopts(argc, argv,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   918
	    'c', MDB_OPT_SETBITS, TRUE, &config,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   919
	    'v', MDB_OPT_SETBITS, TRUE, &vdevs,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   920
	    'e', MDB_OPT_SETBITS, TRUE, &errors,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   921
	    NULL) != argc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   922
		return (DCMD_USAGE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   923
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   924
	if (!(flags & DCMD_ADDRSPEC)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   925
		if (mdb_walk_dcmd("spa", "spa", argc, argv) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   926
			mdb_warn("can't walk spa");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   927
			return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   928
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   929
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   930
		return (DCMD_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   931
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   932
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   933
	if (flags & DCMD_PIPE_OUT) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   934
		mdb_printf("%#lr\n", addr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   935
		return (DCMD_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   936
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   937
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   938
	if (DCMD_HDRSPEC(flags))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   939
		mdb_printf("%<u>%-?s %9s %-*s%</u>\n", "ADDR", "STATE",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   940
		    sizeof (uintptr_t) == 4 ? 60 : 52, "NAME");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   941
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   942
	if (mdb_vread(&spa, sizeof (spa), addr) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   943
		mdb_warn("failed to read spa_t at %p", addr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   944
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   945
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   946
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   947
	if (spa.spa_state < 0 || spa.spa_state > POOL_STATE_UNAVAIL)
1544
938876158511 PSARC 2006/077 zpool clear
eschrock
parents: 952
diff changeset
   948
		state = "UNKNOWN";
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   949
	else
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   950
		state = statetab[spa.spa_state];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   951
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7390
diff changeset
   952
	mdb_printf("%0?p %9s %s\n", addr, state, spa.spa_name);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   953
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   954
	if (config) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   955
		mdb_printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   956
		mdb_inc_indent(4);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   957
		if (mdb_call_dcmd("spa_config", addr, flags, 0,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   958
		    NULL) != DCMD_OK)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   959
			return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   960
		mdb_dec_indent(4);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   961
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   962
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   963
	if (vdevs || errors) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   964
		mdb_arg_t v;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   965
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   966
		v.a_type = MDB_TYPE_STRING;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   967
		v.a_un.a_str = "-e";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   968
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   969
		mdb_printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   970
		mdb_inc_indent(4);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   971
		if (mdb_call_dcmd("spa_vdevs", addr, flags, errors ? 1 : 0,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   972
		    &v) != DCMD_OK)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   973
			return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   974
		mdb_dec_indent(4);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   975
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   976
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   977
	return (DCMD_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   978
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   979
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   980
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   981
 * ::spa_config
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   982
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   983
 * Given a spa_t, print the configuration information stored in spa_config.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   984
 * Since it's just an nvlist, format it as an indented list of name=value pairs.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   985
 * We simply read the value of spa_config and pass off to ::nvlist.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   986
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   987
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   988
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   989
spa_print_config(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   990
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   991
	spa_t spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   992
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   993
	if (argc != 0 || !(flags & DCMD_ADDRSPEC))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   994
		return (DCMD_USAGE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   995
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   996
	if (mdb_vread(&spa, sizeof (spa), addr) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   997
		mdb_warn("failed to read spa_t at %p", addr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   998
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
   999
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1000
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1001
	if (spa.spa_config == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1002
		mdb_printf("(none)\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1003
		return (DCMD_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1004
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1005
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1006
	return (mdb_call_dcmd("nvlist", (uintptr_t)spa.spa_config, flags,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1007
	    0, NULL));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1008
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1009
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1010
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1011
 * ::vdev
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1012
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1013
 * Print out a summarized vdev_t, in the following form:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1014
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1015
 * ADDR             STATE	AUX            DESC
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1016
 * fffffffbcde23df0 HEALTHY	-              /dev/dsk/c0t0d0
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1017
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1018
 * If '-r' is specified, recursively visit all children.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1019
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1020
 * With '-e', the statistics associated with the vdev are printed as well.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1021
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1022
static int
3059
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
  1023
do_print_vdev(uintptr_t addr, int flags, int depth, int stats,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1024
    int recursive)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1025
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1026
	vdev_t vdev;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1027
	char desc[MAXNAMELEN];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1028
	int c, children;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1029
	uintptr_t *child;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1030
	const char *state, *aux;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1031
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1032
	if (mdb_vread(&vdev, sizeof (vdev), (uintptr_t)addr) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1033
		mdb_warn("failed to read vdev_t at %p\n", (uintptr_t)addr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1034
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1035
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1036
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1037
	if (flags & DCMD_PIPE_OUT) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1038
		mdb_printf("%#lr", addr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1039
	} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1040
		if (vdev.vdev_path != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1041
			if (mdb_readstr(desc, sizeof (desc),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1042
			    (uintptr_t)vdev.vdev_path) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1043
				mdb_warn("failed to read vdev_path at %p\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1044
				    vdev.vdev_path);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1045
				return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1046
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1047
		} else if (vdev.vdev_ops != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1048
			vdev_ops_t ops;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1049
			if (mdb_vread(&ops, sizeof (ops),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1050
			    (uintptr_t)vdev.vdev_ops) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1051
				mdb_warn("failed to read vdev_ops at %p\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1052
				    vdev.vdev_ops);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1053
				return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1054
			}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1055
			(void) strcpy(desc, ops.vdev_op_type);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1056
		} else {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1057
			(void) strcpy(desc, "<unknown>");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1058
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1059
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1060
		if (depth == 0 && DCMD_HDRSPEC(flags))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1061
			mdb_printf("%<u>%-?s %-9s %-12s %-*s%</u>\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1062
			    "ADDR", "STATE", "AUX",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1063
			    sizeof (uintptr_t) == 4 ? 43 : 35,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1064
			    "DESCRIPTION");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1065
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1066
		mdb_printf("%0?p ", addr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1067
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1068
		switch (vdev.vdev_state) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1069
		case VDEV_STATE_CLOSED:
4055
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1070
			state = "CLOSED";
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1071
			break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1072
		case VDEV_STATE_OFFLINE:
4055
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1073
			state = "OFFLINE";
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1074
			break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1075
		case VDEV_STATE_CANT_OPEN:
4055
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1076
			state = "CANT_OPEN";
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1077
			break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1078
		case VDEV_STATE_DEGRADED:
4055
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1079
			state = "DEGRADED";
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1080
			break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1081
		case VDEV_STATE_HEALTHY:
4055
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1082
			state = "HEALTHY";
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1083
			break;
4451
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4217
diff changeset
  1084
		case VDEV_STATE_REMOVED:
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4217
diff changeset
  1085
			state = "REMOVED";
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4217
diff changeset
  1086
			break;
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4217
diff changeset
  1087
		case VDEV_STATE_FAULTED:
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4217
diff changeset
  1088
			state = "FAULTED";
24fbf2d7a5d7 PSARC 2007/197 ZFS hotplug
eschrock
parents: 4217
diff changeset
  1089
			break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1090
		default:
4055
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1091
			state = "UNKNOWN";
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1092
			break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1093
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1094
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1095
		switch (vdev.vdev_stat.vs_aux) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1096
		case VDEV_AUX_NONE:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1097
			aux = "-";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1098
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1099
		case VDEV_AUX_OPEN_FAILED:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1100
			aux = "OPEN_FAILED";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1101
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1102
		case VDEV_AUX_CORRUPT_DATA:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1103
			aux = "CORRUPT_DATA";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1104
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1105
		case VDEV_AUX_NO_REPLICAS:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1106
			aux = "NO_REPLICAS";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1107
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1108
		case VDEV_AUX_BAD_GUID_SUM:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1109
			aux = "BAD_GUID_SUM";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1110
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1111
		case VDEV_AUX_TOO_SMALL:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1112
			aux = "TOO_SMALL";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1113
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1114
		case VDEV_AUX_BAD_LABEL:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1115
			aux = "BAD_LABEL";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1116
			break;
7294
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 6643
diff changeset
  1117
		case VDEV_AUX_VERSION_NEWER:
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 6643
diff changeset
  1118
			aux = "VERS_NEWER";
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 6643
diff changeset
  1119
			break;
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 6643
diff changeset
  1120
		case VDEV_AUX_VERSION_OLDER:
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 6643
diff changeset
  1121
			aux = "VERS_OLDER";
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 6643
diff changeset
  1122
			break;
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 6643
diff changeset
  1123
		case VDEV_AUX_SPARED:
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 6643
diff changeset
  1124
			aux = "SPARED";
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 6643
diff changeset
  1125
			break;
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 6643
diff changeset
  1126
		case VDEV_AUX_ERR_EXCEEDED:
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 6643
diff changeset
  1127
			aux = "ERR_EXCEEDED";
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 6643
diff changeset
  1128
			break;
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 6643
diff changeset
  1129
		case VDEV_AUX_IO_FAILURE:
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 6643
diff changeset
  1130
			aux = "IO_FAILURE";
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 6643
diff changeset
  1131
			break;
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 6643
diff changeset
  1132
		case VDEV_AUX_BAD_LOG:
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 6643
diff changeset
  1133
			aux = "BAD_LOG";
c9c31ef4c960 PSARC 2008/486 Intent log replay failure handling
perrin
parents: 6643
diff changeset
  1134
			break;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1135
		default:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1136
			aux = "UNKNOWN";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1137
			break;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1138
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1139
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1140
		mdb_printf("%-9s %-12s %*s%s\n", state, aux, depth, "", desc);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1141
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1142
		if (stats) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1143
			vdev_stat_t *vs = &vdev.vdev_stat;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1144
			int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1145
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1146
			mdb_inc_indent(4);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1147
			mdb_printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1148
			mdb_printf("%<u>       %12s %12s %12s %12s "
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1149
			    "%12s%</u>\n", "READ", "WRITE", "FREE", "CLAIM",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1150
			    "IOCTL");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1151
			mdb_printf("OPS     ");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1152
			for (i = 1; i < ZIO_TYPES; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1153
				mdb_printf("%11#llx%s", vs->vs_ops[i],
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1154
				    i == ZIO_TYPES - 1 ? "" : "  ");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1155
			mdb_printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1156
			mdb_printf("BYTES   ");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1157
			for (i = 1; i < ZIO_TYPES; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1158
				mdb_printf("%11#llx%s", vs->vs_bytes[i],
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1159
				    i == ZIO_TYPES - 1 ? "" : "  ");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1160
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1161
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1162
			mdb_printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1163
			mdb_printf("EREAD    %10#llx\n", vs->vs_read_errors);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1164
			mdb_printf("EWRITE   %10#llx\n", vs->vs_write_errors);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1165
			mdb_printf("ECKSUM   %10#llx\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1166
			    vs->vs_checksum_errors);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1167
			mdb_dec_indent(4);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1168
		}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1169
3059
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
  1170
		if (stats)
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1171
			mdb_printf("\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1172
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1173
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1174
	children = vdev.vdev_children;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1175
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1176
	if (children == 0 || !recursive)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1177
		return (DCMD_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1178
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1179
	child = mdb_alloc(children * sizeof (void *), UM_SLEEP | UM_GC);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1180
	if (mdb_vread(child, children * sizeof (void *),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1181
	    (uintptr_t)vdev.vdev_child) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1182
		mdb_warn("failed to read vdev children at %p", vdev.vdev_child);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1183
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1184
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1185
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1186
	for (c = 0; c < children; c++) {
3059
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
  1187
		if (do_print_vdev(child[c], flags, depth + 2, stats,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1188
		    recursive))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1189
			return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1190
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1191
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1192
	return (DCMD_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1193
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1194
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1195
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1196
vdev_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1197
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1198
	int recursive = FALSE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1199
	int stats = FALSE;
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1200
	uint64_t depth = 0;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1201
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1202
	if (mdb_getopts(argc, argv,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1203
	    'r', MDB_OPT_SETBITS, TRUE, &recursive,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1204
	    'e', MDB_OPT_SETBITS, TRUE, &stats,
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1205
	    'd', MDB_OPT_UINT64, &depth,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1206
	    NULL) != argc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1207
		return (DCMD_USAGE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1208
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1209
	if (!(flags & DCMD_ADDRSPEC)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1210
		mdb_warn("no vdev_t address given\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1211
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1212
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1213
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1214
	return (do_print_vdev(addr, flags, (int)depth, stats, recursive));
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1215
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1216
2459
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1217
typedef struct metaslab_walk_data {
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1218
	uint64_t mw_numvdevs;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1219
	uintptr_t *mw_vdevs;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1220
	int mw_curvdev;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1221
	uint64_t mw_nummss;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1222
	uintptr_t *mw_mss;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1223
	int mw_curms;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1224
} metaslab_walk_data_t;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1225
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1226
static int
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1227
metaslab_walk_step(mdb_walk_state_t *wsp)
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1228
{
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1229
	metaslab_walk_data_t *mw = wsp->walk_data;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1230
	metaslab_t ms;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1231
	uintptr_t msp;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1232
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1233
	if (mw->mw_curvdev >= mw->mw_numvdevs)
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1234
		return (WALK_DONE);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1235
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1236
	if (mw->mw_mss == NULL) {
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1237
		uintptr_t mssp;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1238
		uintptr_t vdevp;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1239
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1240
		ASSERT(mw->mw_curms == 0);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1241
		ASSERT(mw->mw_nummss == 0);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1242
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1243
		vdevp = mw->mw_vdevs[mw->mw_curvdev];
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1244
		if (GETMEMB(vdevp, struct vdev, vdev_ms, mssp) ||
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1245
		    GETMEMB(vdevp, struct vdev, vdev_ms_count, mw->mw_nummss)) {
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1246
			return (WALK_ERR);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1247
		}
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1248
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1249
		mw->mw_mss = mdb_alloc(mw->mw_nummss * sizeof (void*),
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1250
		    UM_SLEEP | UM_GC);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1251
		if (mdb_vread(mw->mw_mss, mw->mw_nummss * sizeof (void*),
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1252
		    mssp) == -1) {
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1253
			mdb_warn("failed to read vdev_ms at %p", mssp);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1254
			return (WALK_ERR);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1255
		}
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1256
	}
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1257
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1258
	if (mw->mw_curms >= mw->mw_nummss) {
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1259
		mw->mw_mss = NULL;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1260
		mw->mw_curms = 0;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1261
		mw->mw_nummss = 0;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1262
		mw->mw_curvdev++;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1263
		return (WALK_NEXT);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1264
	}
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1265
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1266
	msp = mw->mw_mss[mw->mw_curms];
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1267
	if (mdb_vread(&ms, sizeof (metaslab_t), msp) == -1) {
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1268
		mdb_warn("failed to read metaslab_t at %p", msp);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1269
		return (WALK_ERR);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1270
	}
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1271
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1272
	mw->mw_curms++;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1273
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1274
	return (wsp->walk_callback(msp, &ms, wsp->walk_cbdata));
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1275
}
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1276
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1277
/* ARGSUSED */
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1278
static int
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1279
metaslab_walk_init(mdb_walk_state_t *wsp)
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1280
{
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1281
	metaslab_walk_data_t *mw;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1282
	uintptr_t root_vdevp;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1283
	uintptr_t childp;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1284
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1285
	if (wsp->walk_addr == NULL) {
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1286
		mdb_warn("must supply address of spa_t\n");
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1287
		return (WALK_ERR);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1288
	}
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1289
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1290
	mw = mdb_zalloc(sizeof (metaslab_walk_data_t), UM_SLEEP | UM_GC);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1291
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1292
	if (GETMEMB(wsp->walk_addr, struct spa, spa_root_vdev, root_vdevp) ||
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1293
	    GETMEMB(root_vdevp, struct vdev, vdev_children, mw->mw_numvdevs) ||
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1294
	    GETMEMB(root_vdevp, struct vdev, vdev_child, childp)) {
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1295
		return (DCMD_ERR);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1296
	}
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1297
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1298
	mw->mw_vdevs = mdb_alloc(mw->mw_numvdevs * sizeof (void *),
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1299
	    UM_SLEEP | UM_GC);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1300
	if (mdb_vread(mw->mw_vdevs, mw->mw_numvdevs * sizeof (void *),
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1301
	    childp) == -1) {
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1302
		mdb_warn("failed to read root vdev children at %p", childp);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1303
		return (DCMD_ERR);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1304
	}
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1305
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1306
	wsp->walk_data = mw;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1307
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1308
	return (WALK_NEXT);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1309
}
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1310
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1311
typedef struct mdb_spa {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1312
	uintptr_t spa_dsl_pool;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1313
	uintptr_t spa_root_vdev;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1314
} mdb_spa_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1315
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1316
typedef struct mdb_dsl_dir {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1317
	uintptr_t dd_phys;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1318
	int64_t dd_space_towrite[TXG_SIZE];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1319
} mdb_dsl_dir_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1320
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1321
typedef struct mdb_dsl_dir_phys {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1322
	uint64_t dd_used_bytes;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1323
	uint64_t dd_compressed_bytes;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1324
	uint64_t dd_uncompressed_bytes;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1325
} mdb_dsl_dir_phys_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1326
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1327
typedef struct mdb_vdev {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1328
	uintptr_t vdev_parent;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1329
	uintptr_t vdev_ms;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1330
	uint64_t vdev_ms_count;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1331
	vdev_stat_t vdev_stat;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1332
} mdb_vdev_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1333
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1334
typedef struct mdb_metaslab {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1335
	space_map_t ms_allocmap[TXG_SIZE];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1336
	space_map_t ms_freemap[TXG_SIZE];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1337
	space_map_t ms_map;
1732
9e3ae798af31 6280668 pluggable block allocation policy
bonwick
parents: 1544
diff changeset
  1338
	space_map_obj_t ms_smo;
2459
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1339
	space_map_obj_t ms_smo_syncing;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1340
} mdb_metaslab_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1341
2459
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1342
typedef struct space_data {
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1343
	uint64_t ms_allocmap[TXG_SIZE];
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1344
	uint64_t ms_freemap[TXG_SIZE];
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1345
	uint64_t ms_map;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1346
	uint64_t avail;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1347
	uint64_t nowavail;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1348
} space_data_t;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1349
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1350
/* ARGSUSED */
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1351
static int
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1352
space_cb(uintptr_t addr, const void *unknown, void *arg)
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1353
{
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1354
	space_data_t *sd = arg;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1355
	mdb_metaslab_t ms;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1356
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1357
	if (GETMEMB(addr, struct metaslab, ms_allocmap, ms.ms_allocmap) ||
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1358
	    GETMEMB(addr, struct metaslab, ms_freemap, ms.ms_freemap) ||
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1359
	    GETMEMB(addr, struct metaslab, ms_map, ms.ms_map) ||
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1360
	    GETMEMB(addr, struct metaslab, ms_smo, ms.ms_smo) ||
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1361
	    GETMEMB(addr, struct metaslab, ms_smo_syncing, ms.ms_smo_syncing)) {
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1362
		return (WALK_ERR);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1363
	}
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1364
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1365
	sd->ms_allocmap[0] += ms.ms_allocmap[0].sm_space;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1366
	sd->ms_allocmap[1] += ms.ms_allocmap[1].sm_space;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1367
	sd->ms_allocmap[2] += ms.ms_allocmap[2].sm_space;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1368
	sd->ms_allocmap[3] += ms.ms_allocmap[3].sm_space;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1369
	sd->ms_freemap[0] += ms.ms_freemap[0].sm_space;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1370
	sd->ms_freemap[1] += ms.ms_freemap[1].sm_space;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1371
	sd->ms_freemap[2] += ms.ms_freemap[2].sm_space;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1372
	sd->ms_freemap[3] += ms.ms_freemap[3].sm_space;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1373
	sd->ms_map += ms.ms_map.sm_space;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1374
	sd->avail += ms.ms_map.sm_size - ms.ms_smo.smo_alloc;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1375
	sd->nowavail += ms.ms_map.sm_size - ms.ms_smo_syncing.smo_alloc;
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1376
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1377
	return (WALK_NEXT);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1378
}
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1379
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1380
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1381
 * ::spa_space [-b]
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1382
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1383
 * Given a spa_t, print out it's on-disk space usage and in-core
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1384
 * estimates of future usage.  If -b is given, print space in bytes.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1385
 * Otherwise print in megabytes.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1386
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1387
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1388
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1389
spa_space(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1390
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1391
	mdb_spa_t spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1392
	uintptr_t dp_root_dir;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1393
	mdb_dsl_dir_t dd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1394
	mdb_dsl_dir_phys_t dsp;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1395
	uint64_t children;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1396
	uintptr_t childaddr;
2459
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1397
	space_data_t sd;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1398
	int shift = 20;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1399
	char *suffix = "M";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1400
	int bits = FALSE;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1401
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1402
	if (mdb_getopts(argc, argv, 'b', MDB_OPT_SETBITS, TRUE, &bits, NULL) !=
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1403
	    argc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1404
		return (DCMD_USAGE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1405
	if (!(flags & DCMD_ADDRSPEC))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1406
		return (DCMD_USAGE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1407
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1408
	if (bits) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1409
		shift = 0;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1410
		suffix = "";
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1411
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1412
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1413
	if (GETMEMB(addr, struct spa, spa_dsl_pool, spa.spa_dsl_pool) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1414
	    GETMEMB(addr, struct spa, spa_root_vdev, spa.spa_root_vdev) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1415
	    GETMEMB(spa.spa_root_vdev, struct vdev, vdev_children, children) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1416
	    GETMEMB(spa.spa_root_vdev, struct vdev, vdev_child, childaddr) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1417
	    GETMEMB(spa.spa_dsl_pool, struct dsl_pool,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1418
	    dp_root_dir, dp_root_dir) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1419
	    GETMEMB(dp_root_dir, struct dsl_dir, dd_phys, dd.dd_phys) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1420
	    GETMEMB(dp_root_dir, struct dsl_dir,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1421
	    dd_space_towrite, dd.dd_space_towrite) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1422
	    GETMEMB(dd.dd_phys, struct dsl_dir_phys,
2459
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1423
	    dd_used_bytes, dsp.dd_used_bytes) ||
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1424
	    GETMEMB(dd.dd_phys, struct dsl_dir_phys,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1425
	    dd_compressed_bytes, dsp.dd_compressed_bytes) ||
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1426
	    GETMEMB(dd.dd_phys, struct dsl_dir_phys,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1427
	    dd_uncompressed_bytes, dsp.dd_uncompressed_bytes)) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1428
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1429
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1430
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1431
	mdb_printf("dd_space_towrite = %llu%s %llu%s %llu%s %llu%s\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1432
	    dd.dd_space_towrite[0] >> shift, suffix,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1433
	    dd.dd_space_towrite[1] >> shift, suffix,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1434
	    dd.dd_space_towrite[2] >> shift, suffix,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1435
	    dd.dd_space_towrite[3] >> shift, suffix);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1436
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1437
	mdb_printf("dd_phys.dd_used_bytes = %llu%s\n",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1438
	    dsp.dd_used_bytes >> shift, suffix);
2459
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1439
	mdb_printf("dd_phys.dd_compressed_bytes = %llu%s\n",
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1440
	    dsp.dd_compressed_bytes >> shift, suffix);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1441
	mdb_printf("dd_phys.dd_uncompressed_bytes = %llu%s\n",
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1442
	    dsp.dd_uncompressed_bytes >> shift, suffix);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1443
2459
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1444
	bzero(&sd, sizeof (sd));
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1445
	if (mdb_pwalk("metaslab", space_cb, &sd, addr) != 0) {
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1446
		mdb_warn("can't walk metaslabs");
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1447
		return (DCMD_ERR);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1448
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1449
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1450
	mdb_printf("ms_allocmap = %llu%s %llu%s %llu%s %llu%s\n",
2459
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1451
	    sd.ms_allocmap[0] >> shift, suffix,
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1452
	    sd.ms_allocmap[1] >> shift, suffix,
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1453
	    sd.ms_allocmap[2] >> shift, suffix,
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1454
	    sd.ms_allocmap[3] >> shift, suffix);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1455
	mdb_printf("ms_freemap = %llu%s %llu%s %llu%s %llu%s\n",
2459
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1456
	    sd.ms_freemap[0] >> shift, suffix,
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1457
	    sd.ms_freemap[1] >> shift, suffix,
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1458
	    sd.ms_freemap[2] >> shift, suffix,
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1459
	    sd.ms_freemap[3] >> shift, suffix);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1460
	mdb_printf("ms_map = %llu%s\n", sd.ms_map >> shift, suffix);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1461
	mdb_printf("last synced avail = %llu%s\n", sd.avail >> shift, suffix);
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1462
	mdb_printf("current syncing avail = %llu%s\n",
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  1463
	    sd.nowavail >> shift, suffix);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1464
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1465
	return (DCMD_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1466
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1467
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1468
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1469
 * ::spa_verify
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1470
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1471
 * Given a spa_t, verify that that the pool is self-consistent.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1472
 * Currently, it only checks to make sure that the vdev tree exists.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1473
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1474
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1475
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1476
spa_verify(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1477
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1478
	spa_t spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1479
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1480
	if (argc != 0 || !(flags & DCMD_ADDRSPEC))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1481
		return (DCMD_USAGE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1482
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1483
	if (mdb_vread(&spa, sizeof (spa), addr) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1484
		mdb_warn("failed to read spa_t at %p", addr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1485
		return (DCMD_ERR);
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 (spa.spa_root_vdev == NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1489
		mdb_printf("no vdev tree present\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1490
		return (DCMD_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1491
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1492
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1493
	return (DCMD_OK);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1494
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1495
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1496
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1497
 * ::spa_vdevs
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1498
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1499
 * 	-e	Include error stats
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1500
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1501
 * Print out a summarized list of vdevs for the given spa_t.
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1502
 * This is accomplished by invoking "::vdev -re" on the root vdev, as well as
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1503
 * iterating over the cache devices.
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1504
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1505
/* ARGSUSED */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1506
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1507
spa_vdevs(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1508
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1509
	spa_t spa;
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1510
	mdb_arg_t v[3];
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1511
	int errors = FALSE;
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1512
	int ret, i;
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1513
	uintptr_t *aux;
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1514
	size_t len;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1515
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1516
	if (mdb_getopts(argc, argv,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1517
	    'e', MDB_OPT_SETBITS, TRUE, &errors,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1518
	    NULL) != argc)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1519
		return (DCMD_USAGE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1520
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1521
	if (!(flags & DCMD_ADDRSPEC))
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1522
		return (DCMD_USAGE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1523
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1524
	if (mdb_vread(&spa, sizeof (spa), addr) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1525
		mdb_warn("failed to read spa_t at %p", addr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1526
		return (DCMD_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1527
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1528
952
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
  1529
	/*
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
  1530
	 * Unitialized spa_t structures can have a NULL root vdev.
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
  1531
	 */
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
  1532
	if (spa.spa_root_vdev == NULL) {
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
  1533
		mdb_printf("no associated vdevs\n");
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
  1534
		return (DCMD_OK);
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
  1535
	}
12ec54aa046e 6344502 placeholder bug for the remaining Makefile cleanup work for ZFS
eschrock
parents: 789
diff changeset
  1536
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1537
	v[0].a_type = MDB_TYPE_STRING;
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1538
	v[0].a_un.a_str = errors ? "-re" : "-r";
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1539
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1540
	ret = mdb_call_dcmd("vdev", (uintptr_t)spa.spa_root_vdev,
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1541
	    flags, 1, v);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1542
	if (ret != DCMD_OK)
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1543
		return (ret);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1544
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1545
	/*
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1546
	 * Iterate over cache devices and print those out as well.  This is a
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1547
	 * little annoying because we don't have a root vdev to pass to ::vdev.
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1548
	 * Instead, we print a single 'cache' line and then call it for each
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1549
	 * child vdev.
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1550
	 */
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1551
	if (spa.spa_l2cache.sav_count != 0) {
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1552
		v[1].a_type = MDB_TYPE_STRING;
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1553
		v[1].a_un.a_str = "-d";
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1554
		v[2].a_type = MDB_TYPE_IMMEDIATE;
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1555
		v[2].a_un.a_val = 2;
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1556
6643
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1557
		len = spa.spa_l2cache.sav_count * sizeof (uintptr_t);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1558
		aux = mdb_alloc(len, UM_SLEEP);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1559
		if (mdb_vread(aux, len,
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1560
		    (uintptr_t)spa.spa_l2cache.sav_vdevs) == -1) {
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1561
			mdb_free(aux, len);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1562
			mdb_warn("failed to read l2cache vdevs at %p",
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1563
			    spa.spa_l2cache.sav_vdevs);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1564
			return (DCMD_ERR);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1565
		}
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1566
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1567
		mdb_printf("%-?s %-9s %-12s cache\n", "-", "-", "-");
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1568
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1569
		for (i = 0; i < spa.spa_l2cache.sav_count; i++) {
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1570
			ret = mdb_call_dcmd("vdev", aux[i], flags, 3, v);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1571
			if (ret != DCMD_OK) {
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1572
				mdb_free(aux, len);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1573
				return (ret);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1574
			}
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1575
		}
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1576
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1577
		mdb_free(aux, len);
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1578
	}
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1579
3a34b0dbb107 6625086 changing cachefile doesn't remove old cache on last user
eschrock
parents: 6245
diff changeset
  1580
	return (DCMD_OK);
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1581
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1582
4055
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1583
/*
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1584
 * ::zio
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1585
 *
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1586
 * Print a summary of zio_t and all its children.  This is intended to display a
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1587
 * zio tree, and hence we only pick the most important pieces of information for
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1588
 * the main summary.  More detailed information can always be found by doing a
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1589
 * '::print zio' on the underlying zio_t.  The columns we display are:
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1590
 *
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1591
 *	ADDRESS		TYPE	STAGE		WAITER
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1592
 *
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1593
 * The 'address' column is indented by one space for each depth level as we
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1594
 * descend down the tree.
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1595
 */
4217
3411a82f178f 6552521 truss dumps core with multibyte characters in syscall args
eschrock
parents: 4055
diff changeset
  1596
3411a82f178f 6552521 truss dumps core with multibyte characters in syscall args
eschrock
parents: 4055
diff changeset
  1597
#define	ZIO_MAXDEPTH	16
3411a82f178f 6552521 truss dumps core with multibyte characters in syscall args
eschrock
parents: 4055
diff changeset
  1598
4055
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1599
static int
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1600
zio_print_cb(uintptr_t addr, const void *data, void *priv)
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1601
{
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1602
	const zio_t *zio = data;
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1603
	uintptr_t depth = (uintptr_t)priv;
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1604
	mdb_ctf_id_t type_enum, stage_enum;
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1605
	const char *type, *stage;
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1606
	int maxdepth;
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1607
4217
3411a82f178f 6552521 truss dumps core with multibyte characters in syscall args
eschrock
parents: 4055
diff changeset
  1608
	maxdepth = sizeof (uintptr_t) * 2 + ZIO_MAXDEPTH;
3411a82f178f 6552521 truss dumps core with multibyte characters in syscall args
eschrock
parents: 4055
diff changeset
  1609
	if (depth > ZIO_MAXDEPTH)
3411a82f178f 6552521 truss dumps core with multibyte characters in syscall args
eschrock
parents: 4055
diff changeset
  1610
		depth = ZIO_MAXDEPTH;
4055
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1611
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1612
	if (mdb_ctf_lookup_by_name("enum zio_type", &type_enum) == -1 ||
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1613
	    mdb_ctf_lookup_by_name("enum zio_stage", &stage_enum) == -1) {
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1614
		mdb_warn("failed to lookup zio enums");
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1615
		return (WALK_ERR);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1616
	}
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1617
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1618
	if ((type = mdb_ctf_enum_name(type_enum, zio->io_type)) != NULL)
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1619
		type += sizeof ("ZIO_TYPE_") - 1;
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1620
	else
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1621
		type = "?";
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1622
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1623
	if ((stage = mdb_ctf_enum_name(stage_enum, zio->io_stage)) != NULL)
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1624
		stage += sizeof ("ZIO_STAGE_") - 1;
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1625
	else
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1626
		stage = "?";
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1627
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1628
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1629
	mdb_printf("%*s%-*p %-5s %-22s ",
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1630
	    depth, "", maxdepth - depth, addr, type, stage);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1631
	if (zio->io_waiter)
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1632
		mdb_printf("%?p\n", zio->io_waiter);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1633
	else
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1634
		mdb_printf("-\n");
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1635
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1636
	if (mdb_pwalk("zio_child", zio_print_cb, (void *)(depth + 1),
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1637
	    addr) !=  0) {
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1638
		mdb_warn("failed to walk zio_t children at %p\n", addr);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1639
		return (WALK_ERR);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1640
	}
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1641
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1642
	return (WALK_NEXT);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1643
}
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1644
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1645
/*ARGSUSED*/
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1646
static int
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1647
zio_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1648
{
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1649
	zio_t zio;
4217
3411a82f178f 6552521 truss dumps core with multibyte characters in syscall args
eschrock
parents: 4055
diff changeset
  1650
	int maxdepth;
3411a82f178f 6552521 truss dumps core with multibyte characters in syscall args
eschrock
parents: 4055
diff changeset
  1651
3411a82f178f 6552521 truss dumps core with multibyte characters in syscall args
eschrock
parents: 4055
diff changeset
  1652
	maxdepth = sizeof (uintptr_t) * 2 + ZIO_MAXDEPTH;
4055
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1653
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1654
	if (!(flags & DCMD_ADDRSPEC))
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1655
		return (DCMD_USAGE);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1656
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1657
	if (mdb_vread(&zio, sizeof (zio_t), addr) == -1) {
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1658
		mdb_warn("failed to read zio_t at %p", addr);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1659
		return (DCMD_ERR);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1660
	}
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1661
4217
3411a82f178f 6552521 truss dumps core with multibyte characters in syscall args
eschrock
parents: 4055
diff changeset
  1662
	if (DCMD_HDRSPEC(flags))
3411a82f178f 6552521 truss dumps core with multibyte characters in syscall args
eschrock
parents: 4055
diff changeset
  1663
		mdb_printf("%<u>%-*s %-5s %-22s %-?s%</u>\n", maxdepth,
3411a82f178f 6552521 truss dumps core with multibyte characters in syscall args
eschrock
parents: 4055
diff changeset
  1664
		    "ADDRESS", "TYPE", "STAGE", "WAITER");
3411a82f178f 6552521 truss dumps core with multibyte characters in syscall args
eschrock
parents: 4055
diff changeset
  1665
4055
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1666
	if (zio_print_cb(addr, &zio, NULL) != WALK_NEXT)
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1667
		return (DCMD_ERR);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1668
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1669
	return (DCMD_OK);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1670
}
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1671
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1672
/*
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1673
 * [addr]::zio_state
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1674
 *
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1675
 * Print a summary of all zio_t structures on the system, or for a particular
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1676
 * pool.  This is equivalent to '::walk zio_root | ::zio'.
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1677
 */
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1678
/*ARGSUSED*/
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1679
static int
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1680
zio_state(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1681
{
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1682
	/*
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1683
	 * MDB will remember the last address of the pipeline, so if we don't
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1684
	 * zero this we'll end up trying to walk zio structures for a
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1685
	 * non-existent spa_t.
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1686
	 */
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1687
	if (!(flags & DCMD_ADDRSPEC))
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1688
		addr = 0;
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1689
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1690
	return (mdb_pwalk_dcmd("zio_root", "zio", argc, argv, addr));
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1691
}
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1692
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1693
typedef struct txg_list_walk_data {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1694
	uintptr_t lw_head[TXG_SIZE];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1695
	int	lw_txgoff;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1696
	int	lw_maxoff;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1697
	size_t	lw_offset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1698
	void	*lw_obj;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1699
} txg_list_walk_data_t;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1700
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1701
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1702
txg_list_walk_init_common(mdb_walk_state_t *wsp, int txg, int maxoff)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1703
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1704
	txg_list_walk_data_t *lwd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1705
	txg_list_t list;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1706
	int i;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1707
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1708
	lwd = mdb_alloc(sizeof (txg_list_walk_data_t), UM_SLEEP | UM_GC);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1709
	if (mdb_vread(&list, sizeof (txg_list_t), wsp->walk_addr) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1710
		mdb_warn("failed to read txg_list_t at %#lx", wsp->walk_addr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1711
		return (WALK_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1712
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1713
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1714
	for (i = 0; i < TXG_SIZE; i++)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1715
		lwd->lw_head[i] = (uintptr_t)list.tl_head[i];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1716
	lwd->lw_offset = list.tl_offset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1717
	lwd->lw_obj = mdb_alloc(lwd->lw_offset + sizeof (txg_node_t),
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1718
	    UM_SLEEP | UM_GC);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1719
	lwd->lw_txgoff = txg;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1720
	lwd->lw_maxoff = maxoff;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1721
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1722
	wsp->walk_addr = lwd->lw_head[lwd->lw_txgoff];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1723
	wsp->walk_data = lwd;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1724
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1725
	return (WALK_NEXT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1726
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1727
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1728
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1729
txg_list_walk_init(mdb_walk_state_t *wsp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1730
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1731
	return (txg_list_walk_init_common(wsp, 0, TXG_SIZE-1));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1732
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1733
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1734
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1735
txg_list0_walk_init(mdb_walk_state_t *wsp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1736
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1737
	return (txg_list_walk_init_common(wsp, 0, 0));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1738
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1739
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1740
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1741
txg_list1_walk_init(mdb_walk_state_t *wsp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1742
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1743
	return (txg_list_walk_init_common(wsp, 1, 1));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1744
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1745
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1746
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1747
txg_list2_walk_init(mdb_walk_state_t *wsp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1748
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1749
	return (txg_list_walk_init_common(wsp, 2, 2));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1750
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1751
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1752
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1753
txg_list3_walk_init(mdb_walk_state_t *wsp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1754
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1755
	return (txg_list_walk_init_common(wsp, 3, 3));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1756
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1757
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1758
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1759
txg_list_walk_step(mdb_walk_state_t *wsp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1760
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1761
	txg_list_walk_data_t *lwd = wsp->walk_data;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1762
	uintptr_t addr;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1763
	txg_node_t *node;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1764
	int status;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1765
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1766
	while (wsp->walk_addr == NULL && lwd->lw_txgoff < lwd->lw_maxoff) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1767
		lwd->lw_txgoff++;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1768
		wsp->walk_addr = lwd->lw_head[lwd->lw_txgoff];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1769
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1770
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1771
	if (wsp->walk_addr == NULL)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1772
		return (WALK_DONE);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1773
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1774
	addr = wsp->walk_addr - lwd->lw_offset;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1775
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1776
	if (mdb_vread(lwd->lw_obj,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1777
	    lwd->lw_offset + sizeof (txg_node_t), addr) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1778
		mdb_warn("failed to read list element at %#lx", addr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1779
		return (WALK_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1780
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1781
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1782
	status = wsp->walk_callback(addr, lwd->lw_obj, wsp->walk_cbdata);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1783
	node = (txg_node_t *)((uintptr_t)lwd->lw_obj + lwd->lw_offset);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1784
	wsp->walk_addr = (uintptr_t)node->tn_next[lwd->lw_txgoff];
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1785
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1786
	return (status);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1787
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1788
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1789
/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1790
 * ::walk spa
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1791
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1792
 * Walk all named spa_t structures in the namespace.  This is nothing more than
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1793
 * a layered avl walk.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1794
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1795
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1796
spa_walk_init(mdb_walk_state_t *wsp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1797
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1798
	GElf_Sym sym;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1799
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1800
	if (wsp->walk_addr != NULL) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1801
		mdb_warn("spa walk only supports global walks\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1802
		return (WALK_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1803
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1804
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1805
	if (mdb_lookup_by_obj(ZFS_OBJ_NAME, "spa_namespace_avl", &sym) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1806
		mdb_warn("failed to find symbol 'spa_namespace_avl'");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1807
		return (WALK_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1808
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1809
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1810
	wsp->walk_addr = (uintptr_t)sym.st_value;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1811
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1812
	if (mdb_layered_walk("avl", wsp) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1813
		mdb_warn("failed to walk 'avl'\n");
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1814
		return (WALK_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1815
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1816
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1817
	return (WALK_NEXT);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1818
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1819
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1820
static int
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1821
spa_walk_step(mdb_walk_state_t *wsp)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1822
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1823
	spa_t	spa;
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1824
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1825
	if (mdb_vread(&spa, sizeof (spa), wsp->walk_addr) == -1) {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1826
		mdb_warn("failed to read spa_t at %p", wsp->walk_addr);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1827
		return (WALK_ERR);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1828
	}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1829
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1830
	return (wsp->walk_callback(wsp->walk_addr, &spa, wsp->walk_cbdata));
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1831
}
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1832
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  1833
/*
4055
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1834
 * [addr]::walk zio
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1835
 *
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1836
 * Walk all active zio_t structures on the system.  This is simply a layered
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1837
 * walk on top of ::walk zio_cache, with the optional ability to limit the
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1838
 * structures to a particular pool.
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1839
 */
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1840
static int
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1841
zio_walk_init(mdb_walk_state_t *wsp)
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1842
{
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1843
	wsp->walk_data = (void *)wsp->walk_addr;
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1844
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1845
	if (mdb_layered_walk("zio_cache", wsp) == -1) {
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1846
		mdb_warn("failed to walk 'zio_cache'\n");
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1847
		return (WALK_ERR);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1848
	}
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1849
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1850
	return (WALK_NEXT);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1851
}
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1852
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1853
static int
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1854
zio_walk_step(mdb_walk_state_t *wsp)
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1855
{
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1856
	zio_t zio;
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1857
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1858
	if (mdb_vread(&zio, sizeof (zio), wsp->walk_addr) == -1) {
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1859
		mdb_warn("failed to read zio_t at %p", wsp->walk_addr);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1860
		return (WALK_ERR);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1861
	}
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1862
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1863
	if (wsp->walk_data != NULL && wsp->walk_data != zio.io_spa)
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1864
		return (WALK_NEXT);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1865
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1866
	return (wsp->walk_callback(wsp->walk_addr, &zio, wsp->walk_cbdata));
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1867
}
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1868
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1869
/*
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1870
 * ::walk zio_child
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1871
 *
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1872
 * Walk the children of a zio_t structure.
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1873
 */
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1874
static int
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1875
zio_child_walk_init(mdb_walk_state_t *wsp)
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1876
{
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1877
	zio_t zio;
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1878
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1879
	if (wsp->walk_addr == 0) {
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1880
		mdb_warn("::walk zio_child doesn't support global walks\n");
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1881
		return (WALK_ERR);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1882
	}
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1883
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1884
	if (mdb_vread(&zio, sizeof (zio), wsp->walk_addr) == -1) {
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1885
		mdb_warn("failed to read zio_t at %p", wsp->walk_addr);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1886
		return (WALK_ERR);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1887
	}
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1888
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1889
	wsp->walk_addr = (uintptr_t)zio.io_child;
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1890
	return (WALK_NEXT);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1891
}
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1892
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1893
static int
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1894
zio_sibling_walk_step(mdb_walk_state_t *wsp)
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1895
{
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1896
	zio_t zio;
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1897
	int status;
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1898
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1899
	if (wsp->walk_addr == NULL)
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1900
		return (WALK_DONE);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1901
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1902
	if (mdb_vread(&zio, sizeof (zio), wsp->walk_addr) == -1) {
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1903
		mdb_warn("failed to read zio_t at %p", wsp->walk_addr);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1904
		return (WALK_ERR);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1905
	}
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1906
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1907
	status = wsp->walk_callback(wsp->walk_addr, &zio, wsp->walk_cbdata);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1908
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1909
	wsp->walk_addr = (uintptr_t)zio.io_sibling_next;
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1910
	return (status);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1911
}
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1912
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1913
/*
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1914
 * [addr]::walk zio_root
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1915
 *
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1916
 * Walk only root zio_t structures, optionally for a particular spa_t.
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1917
 */
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1918
static int
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1919
zio_walk_root_step(mdb_walk_state_t *wsp)
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1920
{
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1921
	zio_t zio;
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1922
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1923
	if (mdb_vread(&zio, sizeof (zio), wsp->walk_addr) == -1) {
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1924
		mdb_warn("failed to read zio_t at %p", wsp->walk_addr);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1925
		return (WALK_ERR);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1926
	}
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1927
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1928
	if (wsp->walk_data != NULL && wsp->walk_data != zio.io_spa)
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1929
		return (WALK_NEXT);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1930
7754
b80e4842ad54 6754011 SPA 3.0: lock breakup, i/o pipeline refactoring, device failure handling
Jeff Bonwick <Jeff.Bonwick@Sun.COM>
parents: 7390
diff changeset
  1931
	if ((uintptr_t)zio.io_parent != NULL)
4055
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1932
		return (WALK_NEXT);
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1933
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1934
	return (wsp->walk_callback(wsp->walk_addr, &zio, wsp->walk_cbdata));
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1935
}
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  1936
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1937
#define	NICENUM_BUFLEN 6
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1938
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1939
static int
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1940
snprintfloat(char *buf, int len, float f, int frac_digits)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1941
{
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1942
	float mul = 1;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1943
	int whole, frac, i;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1944
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1945
	for (i = frac_digits; i; i--)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1946
		mul *= 10;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1947
	whole = (int)f;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1948
	frac = (int)((f - whole) * mul);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1949
	return (mdb_snprintf(buf, len, "%u.%0*u", whole, frac_digits, frac));
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1950
}
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1951
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1952
static void
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1953
mdb_nicenum(uint64_t num, char *buf)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1954
{
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1955
	uint64_t n = num;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1956
	int index = 0;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1957
	char *u;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1958
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1959
	while (n >= 1024) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1960
		n = (n + (1024 / 2)) / 1024; /* Round up or down */
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1961
		index++;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1962
	}
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1963
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1964
	u = &" \0K\0M\0G\0T\0P\0E\0"[index*2];
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1965
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1966
	if (index == 0) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1967
		(void) mdb_snprintf(buf, NICENUM_BUFLEN, "%llu",
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1968
		    (u_longlong_t)n);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1969
	} else if (n < 10 && (num & (num - 1)) != 0) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1970
		(void) snprintfloat(buf, NICENUM_BUFLEN,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1971
		    (float)num / (1ULL << 10 * index), 2);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1972
		strcat(buf, u);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1973
	} else if (n < 100 && (num & (num - 1)) != 0) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1974
		(void) snprintfloat(buf, NICENUM_BUFLEN,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1975
		    (float)num / (1ULL << 10 * index), 1);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1976
		strcat(buf, u);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1977
	} else {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1978
		(void) mdb_snprintf(buf, NICENUM_BUFLEN, "%llu%s",
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1979
		    (u_longlong_t)n, u);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1980
	}
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1981
}
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1982
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1983
/*
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1984
 * ::zfs_blkstats
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1985
 *
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1986
 * 	-v	print verbose per-level information
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1987
 *
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1988
 */
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1989
static int
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1990
zfs_blkstats(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1991
{
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1992
	boolean_t verbose = B_FALSE;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1993
	zfs_all_blkstats_t stats;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1994
	dmu_object_type_t t;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1995
	zfs_blkstat_t *tzb;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1996
	uint64_t ditto;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1997
	dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES + 10];
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1998
	/* +10 in case it grew */
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  1999
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2000
	if (mdb_readvar(&dmu_ot, "dmu_ot") == -1) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2001
		mdb_warn("failed to read 'dmu_ot'");
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2002
		return (DCMD_ERR);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2003
	}
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2004
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2005
	if (mdb_getopts(argc, argv,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2006
	    'v', MDB_OPT_SETBITS, TRUE, &verbose,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2007
	    NULL) != argc)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2008
		return (DCMD_USAGE);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2009
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2010
	if (!(flags & DCMD_ADDRSPEC))
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2011
		return (DCMD_USAGE);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2012
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2013
	if (GETMEMB(addr, struct spa, spa_dsl_pool, addr) ||
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2014
	    GETMEMB(addr, struct dsl_pool, dp_blkstats, addr) ||
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2015
	    mdb_vread(&stats, sizeof (zfs_all_blkstats_t), addr) == -1) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2016
		mdb_warn("failed to read data at %p;", addr);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2017
		mdb_printf("maybe no stats? run \"zpool scrub\" first.");
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2018
		return (DCMD_ERR);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2019
	}
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2020
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2021
	tzb = &stats.zab_type[DN_MAX_LEVELS][DMU_OT_NUMTYPES];
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2022
	if (tzb->zb_gangs != 0) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2023
		mdb_printf("Ganged blocks: %llu\n",
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2024
		    (longlong_t)tzb->zb_gangs);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2025
	}
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2026
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2027
	ditto = tzb->zb_ditto_2_of_2_samevdev + tzb->zb_ditto_2_of_3_samevdev +
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2028
	    tzb->zb_ditto_3_of_3_samevdev;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2029
	if (ditto != 0) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2030
		mdb_printf("Dittoed blocks on same vdev: %llu\n",
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2031
		    (longlong_t)ditto);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2032
	}
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2033
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2034
	mdb_printf("\nBlocks\tLSIZE\tPSIZE\tASIZE"
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2035
	    "\t  avg\t comp\t%%Total\tType\n");
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2036
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2037
	for (t = 0; t <= DMU_OT_NUMTYPES; t++) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2038
		char csize[NICENUM_BUFLEN], lsize[NICENUM_BUFLEN];
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2039
		char psize[NICENUM_BUFLEN], asize[NICENUM_BUFLEN];
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2040
		char avg[NICENUM_BUFLEN];
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2041
		char comp[NICENUM_BUFLEN], pct[NICENUM_BUFLEN];
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2042
		char typename[64];
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2043
		int l;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2044
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2045
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2046
		if (t == DMU_OT_DEFERRED)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2047
			strcpy(typename, "deferred free");
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2048
		else if (t == DMU_OT_TOTAL)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2049
			strcpy(typename, "Total");
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2050
		else if (mdb_readstr(typename, sizeof (typename),
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2051
		    (uintptr_t)dmu_ot[t].ot_name) == -1) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2052
			mdb_warn("failed to read type name");
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2053
			return (DCMD_ERR);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2054
		}
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2055
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2056
		if (stats.zab_type[DN_MAX_LEVELS][t].zb_asize == 0)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2057
			continue;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2058
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2059
		for (l = -1; l < DN_MAX_LEVELS; l++) {
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2060
			int level = (l == -1 ? DN_MAX_LEVELS : l);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2061
			zfs_blkstat_t *zb = &stats.zab_type[level][t];
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2062
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2063
			if (zb->zb_asize == 0)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2064
				continue;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2065
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2066
			/*
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2067
			 * Don't print each level unless requested.
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2068
			 */
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2069
			if (!verbose && level != DN_MAX_LEVELS)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2070
				continue;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2071
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2072
			/*
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2073
			 * If all the space is level 0, don't print the
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2074
			 * level 0 separately.
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2075
			 */
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2076
			if (level == 0 && zb->zb_asize ==
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2077
			    stats.zab_type[DN_MAX_LEVELS][t].zb_asize)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2078
				continue;
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2079
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2080
			mdb_nicenum(zb->zb_count, csize);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2081
			mdb_nicenum(zb->zb_lsize, lsize);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2082
			mdb_nicenum(zb->zb_psize, psize);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2083
			mdb_nicenum(zb->zb_asize, asize);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2084
			mdb_nicenum(zb->zb_asize / zb->zb_count, avg);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2085
			(void) snprintfloat(comp, NICENUM_BUFLEN,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2086
			    (float)zb->zb_lsize / zb->zb_psize, 2);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2087
			(void) snprintfloat(pct, NICENUM_BUFLEN,
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2088
			    100.0 * zb->zb_asize / tzb->zb_asize, 2);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2089
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2090
			mdb_printf("%6s\t%5s\t%5s\t%5s\t%5s"
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2091
			    "\t%5s\t%6s\t",
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2092
			    csize, lsize, psize, asize, avg, comp, pct);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2093
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2094
			if (level == DN_MAX_LEVELS)
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2095
				mdb_printf("%s\n", typename);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2096
			else
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2097
				mdb_printf("  L%d %s\n",
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2098
				    level, typename);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2099
		}
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2100
	}
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2101
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2102
	return (DCMD_OK);
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2103
}
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2104
4055
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  2105
/*
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2106
 * MDB module linkage information:
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2107
 *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2108
 * We declare a list of structures describing our dcmds, and a function
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2109
 * named _mdb_init to return a pointer to our module information.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2110
 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2111
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2112
static const mdb_dcmd_t dcmds[] = {
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
  2113
	{ "arc", "[-bkmg]", "print ARC variables", arc_print },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2114
	{ "blkptr", ":", "print blkptr_t", blkptr },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2115
	{ "dbuf", ":", "print dmu_buf_impl_t", dbuf },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2116
	{ "dbuf_stats", ":", "dbuf stats", dbuf_stats },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2117
	{ "dbufs",
5367
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5329
diff changeset
  2118
	"\t[-O objset_impl_t*] [-n objset_name | \"mos\"] "
c40abbe796be PSARC/2007/574 zfs send -R
ahrens
parents: 5329
diff changeset
  2119
	"[-o object | \"mdn\"] \n"
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2120
	"\t[-l level] [-b blkid | \"bonus\"]",
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
  2121
	"find dmu_buf_impl_t's that match specified criteria", dbufs },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2122
	{ "abuf_find", "dva_word[0] dva_word[1]",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2123
	"find arc_buf_hdr_t of a specified DVA",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2124
	abuf_find },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2125
	{ "spa", "?[-cv]", "spa_t summary", spa_print },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2126
	{ "spa_config", ":", "print spa_t configuration", spa_print_config },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2127
	{ "spa_verify", ":", "verify spa_t consistency", spa_verify },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2128
	{ "spa_space", ":[-b]", "print spa_t on-disk space usage", spa_space },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2129
	{ "spa_vdevs", ":", "given a spa_t, print vdev summary", spa_vdevs },
4787
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
  2130
	{ "vdev", ":[-re]\n"
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
  2131
	"\t-r display recursively\n"
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
  2132
	"\t-e print statistics\n",
602d3f97842c 6393351 unique_* could be improved
ahrens
parents: 4451
diff changeset
  2133
	"vdev_t summary", vdev_print },
4055
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  2134
	{ "zio", ":", "zio_t summary", zio_print },
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  2135
	{ "zio_state", "?", "print out all zio_t structures on system or "
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  2136
	    "for a particular pool", zio_state },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2137
	{ "zio_pipeline", ":", "decode a zio pipeline", zio_pipeline },
7837
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2138
	{ "zfs_blkstats", ":[-v]",
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2139
	    "given a spa_t, print block type stats from last scrub",
001de5627df3 6333409 traversal code should be able to issue multiple reads in parallel
Matthew Ahrens <Matthew.Ahrens@Sun.COM>
parents: 7754
diff changeset
  2140
	    zfs_blkstats },
3059
7d69dbccfcbb 6472021 vdev knobs can not be turned
ahrens
parents: 2885
diff changeset
  2141
	{ "zfs_params", "", "print zfs tunable parameters", zfs_params },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2142
	{ NULL }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2143
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2144
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2145
static const mdb_walker_t walkers[] = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2146
	/*
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2147
	 * In userland, there is no generic provider of list_t walkers, so we
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2148
	 * need to add it.
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2149
	 */
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2150
#ifndef _KERNEL
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2151
	{ LIST_WALK_NAME, LIST_WALK_DESC,
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2152
		list_walk_init, list_walk_step, list_walk_fini },
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2153
#endif
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2154
	{ "zms_freelist", "walk ZFS metaslab freelist",
2459
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  2155
		freelist_walk_init, freelist_walk_step, NULL },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2156
	{ "txg_list", "given any txg_list_t *, walk all entries in all txgs",
2459
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  2157
		txg_list_walk_init, txg_list_walk_step, NULL },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2158
	{ "txg_list0", "given any txg_list_t *, walk all entries in txg 0",
2459
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  2159
		txg_list0_walk_init, txg_list_walk_step, NULL },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2160
	{ "txg_list1", "given any txg_list_t *, walk all entries in txg 1",
2459
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  2161
		txg_list1_walk_init, txg_list_walk_step, NULL },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2162
	{ "txg_list2", "given any txg_list_t *, walk all entries in txg 2",
2459
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  2163
		txg_list2_walk_init, txg_list_walk_step, NULL },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2164
	{ "txg_list3", "given any txg_list_t *, walk all entries in txg 3",
2459
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  2165
		txg_list3_walk_init, txg_list_walk_step, NULL },
4055
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  2166
	{ "zio", "walk all zio structures, optionally for a particular spa_t",
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  2167
		zio_walk_init, zio_walk_step, NULL },
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  2168
	{ "zio_child", "walk children of a zio_t structure",
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  2169
		zio_child_walk_init, zio_sibling_walk_step, NULL },
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  2170
	{ "zio_root", "walk all root zio_t structures, optionally for a "
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  2171
	    "particular spa_t",
9b8dd5af941d 6536445 want ::zio to show zio tree
eschrock
parents: 3403
diff changeset
  2172
		zio_walk_init, zio_walk_root_step, NULL },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2173
	{ "spa", "walk all spa_t entries in the namespace",
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2174
		spa_walk_init, spa_walk_step, NULL },
2459
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  2175
	{ "metaslab", "given a spa_t *, walk all metaslab_t structures",
7511d9859fcd 6452923 really out of space panic even though ms_map.sm_space > 0
ahrens
parents: 2082
diff changeset
  2176
		metaslab_walk_init, metaslab_walk_step, NULL },
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2177
	{ NULL }
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2178
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2179
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2180
static const mdb_modinfo_t modinfo = {
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2181
	MDB_API_VERSION, dcmds, walkers
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2182
};
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2183
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2184
const mdb_modinfo_t *
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2185
_mdb_init(void)
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2186
{
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2187
	return (&modinfo);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents:
diff changeset
  2188
}