zfs.c revision ff64c0f7947882a0dbee45c31d69cb30bd003e5f
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
fa9e4066f08beec538e775443c5be79dd423fcabahrens * The contents of this file are subject to the terms of the
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * Common Development and Distribution License (the "License").
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock * You may not use this file except in compliance with the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * When distributing Covered Code, include this CDDL HEADER in each
fa9e4066f08beec538e775443c5be79dd423fcabahrens * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If applicable, add the following below this CDDL HEADER, with the
fa9e4066f08beec538e775443c5be79dd423fcabahrens * fields enclosed by brackets "[]" replaced with your own identifying
fa9e4066f08beec538e775443c5be79dd423fcabahrens * information: Portions Copyright [yyyy] [name of copyright owner]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER END
1ab7f2ded02e7a1bc3c73516eb27efa79bf2a2ffmaybee * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Use is subject to license terms.
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include "../genunix/list.h"
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic char *
fa9e4066f08beec538e775443c5be79dd423fcabahrenslocal_strdup(const char *s)
fa9e4066f08beec538e775443c5be79dd423fcabahrensgetmember(uintptr_t addr, const char *type, mdb_ctf_id_t *idp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("couldn't find member %s of type %s\n", member, type);
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("member %s of type %s is unsupported bitfield",
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* mdb_warn("read %s from %s at %p+%llx\n", member, type, addr, off); */
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens getmember(addr, #type, NULL, #member, sizeof (dest), &(dest))
fa9e4066f08beec538e775443c5be79dd423fcabahrens getmember(addr, NULL, ctfid, #member, sizeof (dest), &(dest))
fa9e4066f08beec538e775443c5be79dd423fcabahrens static int gotid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_ctf_lookup_by_name("struct refcount", &rc_id) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("couldn't find member %s of type %s\n", member, name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (GETMEMBID(addr + off, &rc_id, rc_count, *rc));
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_lookup_by_obj(MDB_TGT_OBJ_EVERY, sym_name, &sym)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_vread(*bufp, sym.st_size, sym.st_value) == -1) {
8053a26377fa80614ba5221e12b86aab4e8a675eck char *ddata[] = { "ALLOC", "FREE", "CONDENSE", "INVALID",
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_vread(&entry, sizeof (entry), wsp->walk_addr) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("failed to read freelist entry %p", wsp->walk_addr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("Entry: %3u offsets=%08llx-%08llx type=%c "
fa9e4066f08beec538e775443c5be79dd423fcabahrens static int gotid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens static int gotid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (GETMEMBID(addr, &osi_id, os_dsl_dataset, os_dsl_dataset))
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (GETMEMBID(os_dsl_dataset, &ds_id, ds_snapname, ds_snapname) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrensenum_lookup(char *out, size_t size, mdb_ctf_id_t id, int val,
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *prefix)
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *cp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrenszio_pipeline(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_ctf_lookup_by_name("enum zio_stage", &pipe_enum) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < 32; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens "ZIO_STAGE_");
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens/* ARGSUSED */
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrenszfs_params(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens * This table can be approximately generated by running:
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens * egrep "^[a-z0-9_]+ [a-z0-9_]+( =.*)?;" *.c | cut -d ' ' -f 2
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens static const char *params[] = {
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "arc_reduce_dnlc_percent",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_arc_max",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_arc_min",
49e3519a3f3d730d3bd8870c05aaed24d89cf272maybee "arc_shrink_shift",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_mdcomp_disable",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_prefetch_disable",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfetch_max_streams",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfetch_min_sec_reap",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfetch_block_cap",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfetch_array_rd_sz",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_default_bs",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_default_ibs",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "metaslab_aliquot",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "reference_tracking_enable",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "reference_history",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zio_taskq_threads",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "spa_max_replication_override",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "spa_mode",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_flags",
1ab7f2ded02e7a1bc3c73516eb27efa79bf2a2ffmaybee "zfs_txg_synctime",
1ab7f2ded02e7a1bc3c73516eb27efa79bf2a2ffmaybee "zfs_txg_timeout",
1ab7f2ded02e7a1bc3c73516eb27efa79bf2a2ffmaybee "zfs_write_limit_min",
1ab7f2ded02e7a1bc3c73516eb27efa79bf2a2ffmaybee "zfs_write_limit_max",
1ab7f2ded02e7a1bc3c73516eb27efa79bf2a2ffmaybee "zfs_write_limit_shift",
1ab7f2ded02e7a1bc3c73516eb27efa79bf2a2ffmaybee "zfs_write_limit_override",
1ab7f2ded02e7a1bc3c73516eb27efa79bf2a2ffmaybee "zfs_no_write_throttle",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_vdev_cache_max",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_vdev_cache_size",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_vdev_cache_bshift",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "vdev_mirror_shift",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_vdev_max_pending",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_vdev_min_pending",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_scrub_limit",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_vdev_time_shift",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_vdev_ramp_rate",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_vdev_aggregation_limit",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "fzap_default_block_shift",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_immediate_write_sz",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_read_chunk_size",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zil_disable",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_nocacheflush",
1ab7f2ded02e7a1bc3c73516eb27efa79bf2a2ffmaybee "metaslab_gang_bang",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zio_injection_enabled",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zvol_immediate_write_sz",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens for (i = 0; i < sizeof (params) / sizeof (params[0]); i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensblkptr(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (read_symbol("dmu_ot", (void **)&doti) != DCMD_OK)
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < DMU_OT_NUMTYPES; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_readstr(buf, sizeof (buf), (uintptr_t)doti[i].ot_name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (read_symbol("zio_checksum_table", (void **)&zci) != DCMD_OK)
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < ZIO_CHECKSUM_FUNCTIONS; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_readstr(buf, sizeof (buf), (uintptr_t)zci[i].ci_name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (read_symbol("zio_compress_table", (void **)&zct) != DCMD_OK)
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < ZIO_COMPRESS_FUNCTIONS; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_readstr(buf, sizeof (buf), (uintptr_t)zct[i].ci_name);
44cd46cadd9aab751dae6a4023c1cb5bf316d274billm * Super-ick warning: This code is also duplicated in
44cd46cadd9aab751dae6a4023c1cb5bf316d274billm * cmd/zdb.c . Yeah, I hate code replication, too.
44cd46cadd9aab751dae6a4023c1cb5bf316d274billm "ASIZE: %llx\n", i, DVA_GET_GANG(dva) ? "TRUE" : "FALSE",
44cd46cadd9aab751dae6a4023c1cb5bf316d274billm DVA_GET_VDEV(dva), DVA_GET_OFFSET(dva), BP_GET_PSIZE(&bp),
44cd46cadd9aab751dae6a4023c1cb5bf316d274billm !DVA_GET_GANG(dva) && BP_GET_LEVEL(&bp) != 0 ? "i" : "",
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("BIRTH: %-16llx LEVEL: %-2d\tFILL: %llx\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensdbuf(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_ctf_lookup_by_name("struct dmu_buf_impl", &id) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) mdb_snprintf(objectname, sizeof (objectname), "%llx",
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) mdb_snprintf(blkidname, sizeof (blkidname), "%llx",
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensdbuf_stats(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < HISTOSZ; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (bucket = 0; bucket < ht.hash_table_mask+1; bucket++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (dbp != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("hash table has %llu buckets, %llu dbufs "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "(avg %llu buckets/dbuf)\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < HISTOSZ; i++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (histo[i] > 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i <= maxidx; i++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < HISTOSZ; i++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (histo2[i] > 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i <= maxidx; i++)
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct dbufs_data {
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensdbufs_cb(uintptr_t addr, const void *unknown, void *arg)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((data->objset == DBUFS_UNSET || data->objset == objset) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (data->osname == NULL || (objset_name(objset, osname) == 0 &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (data->object == DBUFS_UNSET || data->object == db.db_object) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (data->level == DBUFS_UNSET || data->level == level) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (data->blkid == DBUFS_UNSET || data->blkid == blkid)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensdbufs(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens data.objset = data.object = data.level = data.blkid = DBUFS_UNSET;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_ctf_lookup_by_name("struct dmu_buf_impl", &data.id) == -1) {
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens if (mdb_walk("dmu_buf_impl_t", dbufs_cb, &data) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct abuf_find_data {
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensabuf_find_cb(uintptr_t addr, const void *unknown, void *arg)
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensabuf_find(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *syms[] = {
a2eea2e101e6a163a537dcc6d4e3c4da2a0ea5b2ahrens "ARC_mru_ghost",
a2eea2e101e6a163a537dcc6d4e3c4da2a0ea5b2ahrens "ARC_mfu_ghost",
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < 2; i ++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens data.dva.dva_word[i] = mdb_strtoull(argv[i].a_un.a_str);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_ctf_lookup_by_name("struct arc_buf_hdr", &data.id) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < sizeof (syms) / sizeof (syms[0]); i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_pwalk("list", abuf_find_cb, &data, sym.st_value) != 0) {
44cb6abc89aa591c23f5e58296c6d2a29302344abmc/*ARGSUSED*/
44cb6abc89aa591c23f5e58296c6d2a29302344abmcarc_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens const char *suffix;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens static const char *bytestats[] = {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens static const char *extras[] = {
44cb6abc89aa591c23f5e58296c6d2a29302344abmc if (mdb_vread(stats, sym.st_size, sym.st_value) == -1) {
44cb6abc89aa591c23f5e58296c6d2a29302344abmc mdb_warn("couldn't read 'arc_stats' at %p", sym.st_value);
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens /* NB: -a / opt_a are ignored for backwards compatability */
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens for (i = 0; i < nstats; i++) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens for (j = 0; bytestats[j]; j++) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens for (i = 0; extras[i]; i++) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens if (mdb_vread(&buf, sym.st_size, sym.st_value) == -1) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens /* NB: all the 64-bit extras happen to be byte counts */
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -c Print configuration information as well
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -v Print vdev state
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -e Print vdev error stats
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print a summarized spa_t. When given no arguments, prints out a table of all
fa9e4066f08beec538e775443c5be79dd423fcabahrens * active pools on the system.
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensspa_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *statetab[] = { "ACTIVE", "EXPORTED", "DESTROYED",
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick "SPARE", "L2CACHE", "UNINIT", "UNAVAIL", "POTENTIAL" };
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *state;
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("%<u>%-?s %9s %-*s%</u>\n", "ADDR", "STATE",
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (spa.spa_state < 0 || spa.spa_state > POOL_STATE_UNAVAIL)
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick mdb_printf("%0?p %9s %s\n", addr, state, spa.spa_name);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_call_dcmd("spa_vdevs", addr, flags, errors ? 1 : 0,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ::spa_config
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Given a spa_t, print the configuration information stored in spa_config.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Since it's just an nvlist, format it as an indented list of name=value pairs.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * We simply read the value of spa_config and pass off to ::nvlist.
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensspa_print_config(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (mdb_call_dcmd("nvlist", (uintptr_t)spa.spa_config, flags,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out a summarized vdev_t, in the following form:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ADDR STATE AUX DESC
fa9e4066f08beec538e775443c5be79dd423fcabahrens * fffffffbcde23df0 HEALTHY - /dev/dsk/c0t0d0
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If '-r' is specified, recursively visit all children.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * With '-e', the statistics associated with the vdev are printed as well.
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrensdo_print_vdev(uintptr_t addr, int flags, int depth, int stats,
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_vread(&vdev, sizeof (vdev), (uintptr_t)addr) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("failed to read vdev_t at %p\n", (uintptr_t)addr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens "DESCRIPTION");
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("%-9s %-12s %*s%s\n", state, aux, depth, "", desc);
fa9e4066f08beec538e775443c5be79dd423fcabahrens child = mdb_alloc(children * sizeof (void *), UM_SLEEP | UM_GC);
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("failed to read vdev children at %p", vdev.vdev_child);
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (c = 0; c < children; c++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrensvdev_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock return (do_print_vdev(addr, flags, (int)depth, stats, recursive));
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrenstypedef struct metaslab_walk_data {
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens GETMEMB(vdevp, struct vdev, vdev_ms_count, mw->mw_nummss)) {
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mw->mw_mss = mdb_alloc(mw->mw_nummss * sizeof (void*),
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens if (mdb_vread(mw->mw_mss, mw->mw_nummss * sizeof (void*),
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens if (mdb_vread(&ms, sizeof (metaslab_t), msp) == -1) {
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens return (wsp->walk_callback(msp, &ms, wsp->walk_cbdata));
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens/* ARGSUSED */
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mw = mdb_zalloc(sizeof (metaslab_walk_data_t), UM_SLEEP | UM_GC);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens if (GETMEMB(wsp->walk_addr, struct spa, spa_root_vdev, root_vdevp) ||
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens GETMEMB(root_vdevp, struct vdev, vdev_children, mw->mw_numvdevs) ||
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens GETMEMB(root_vdevp, struct vdev, vdev_child, childp)) {
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mw->mw_vdevs = mdb_alloc(mw->mw_numvdevs * sizeof (void *),
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens if (mdb_vread(mw->mw_vdevs, mw->mw_numvdevs * sizeof (void *),
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mdb_warn("failed to read root vdev children at %p", childp);
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct mdb_spa {
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct mdb_dsl_dir {
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct mdb_dsl_dir_phys {
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct mdb_vdev {
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct mdb_metaslab {
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrenstypedef struct space_data {
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens/* ARGSUSED */
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensspace_cb(uintptr_t addr, const void *unknown, void *arg)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens if (GETMEMB(addr, struct metaslab, ms_allocmap, ms.ms_allocmap) ||
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens GETMEMB(addr, struct metaslab, ms_freemap, ms.ms_freemap) ||
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens GETMEMB(addr, struct metaslab, ms_smo_syncing, ms.ms_smo_syncing)) {
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens sd->avail += ms.ms_map.sm_size - ms.ms_smo.smo_alloc;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens sd->nowavail += ms.ms_map.sm_size - ms.ms_smo_syncing.smo_alloc;
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ::spa_space [-b]
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Given a spa_t, print out it's on-disk space usage and in-core
fa9e4066f08beec538e775443c5be79dd423fcabahrens * estimates of future usage. If -b is given, print space in bytes.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Otherwise print in megabytes.
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensspa_space(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_getopts(argc, argv, 'b', MDB_OPT_SETBITS, TRUE, &bits, NULL) !=
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (GETMEMB(addr, struct spa, spa_dsl_pool, spa.spa_dsl_pool) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens GETMEMB(addr, struct spa, spa_root_vdev, spa.spa_root_vdev) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens GETMEMB(spa.spa_root_vdev, struct vdev, vdev_children, children) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens GETMEMB(spa.spa_root_vdev, struct vdev, vdev_child, childaddr) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens GETMEMB(dp_root_dir, struct dsl_dir, dd_phys, dd.dd_phys) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("dd_space_towrite = %llu%s %llu%s %llu%s %llu%s\n",
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mdb_printf("dd_phys.dd_uncompressed_bytes = %llu%s\n",
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens if (mdb_pwalk("metaslab", space_cb, &sd, addr) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("ms_allocmap = %llu%s %llu%s %llu%s %llu%s\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("ms_freemap = %llu%s %llu%s %llu%s %llu%s\n",
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mdb_printf("ms_map = %llu%s\n", sd.ms_map >> shift, suffix);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mdb_printf("last synced avail = %llu%s\n", sd.avail >> shift, suffix);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ::spa_verify
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Given a spa_t, verify that that the pool is self-consistent.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Currently, it only checks to make sure that the vdev tree exists.
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensspa_verify(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ::spa_vdevs
fa9e4066f08beec538e775443c5be79dd423fcabahrens * -e Include error stats
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out a summarized list of vdevs for the given spa_t.
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock * This is accomplished by invoking "::vdev -re" on the root vdev, as well as
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock * iterating over the cache devices.
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensspa_vdevs(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * Unitialized spa_t structures can have a NULL root vdev.
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock ret = mdb_call_dcmd("vdev", (uintptr_t)spa.spa_root_vdev,
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock * Iterate over cache devices and print those out as well. This is a
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock * little annoying because we don't have a root vdev to pass to ::vdev.
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock * Instead, we print a single 'cache' line and then call it for each
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock * child vdev.
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock len = spa.spa_l2cache.sav_count * sizeof (uintptr_t);
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock mdb_printf("%-?s %-9s %-12s cache\n", "-", "-", "-");
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * Print a summary of zio_t and all its children. This is intended to display a
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * zio tree, and hence we only pick the most important pieces of information for
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * the main summary. More detailed information can always be found by doing a
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * '::print zio' on the underlying zio_t. The columns we display are:
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * ADDRESS TYPE STAGE WAITER
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * The 'address' column is indented by one space for each depth level as we
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * descend down the tree.
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrockzio_print_cb(uintptr_t addr, const void *data, void *priv)
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock if (mdb_ctf_lookup_by_name("enum zio_type", &type_enum) == -1 ||
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock mdb_ctf_lookup_by_name("enum zio_stage", &stage_enum) == -1) {
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock if ((type = mdb_ctf_enum_name(type_enum, zio->io_type)) != NULL)
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock if ((stage = mdb_ctf_enum_name(stage_enum, zio->io_stage)) != NULL)
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock if (mdb_pwalk("zio_child", zio_print_cb, (void *)(depth + 1),
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock mdb_warn("failed to walk zio_t children at %p\n", addr);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock/*ARGSUSED*/
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrockzio_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fac3008cc3156093d29951128c236e1a6c4bc0e8eschrock mdb_printf("%<u>%-*s %-5s %-22s %-?s%</u>\n", maxdepth,
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * [addr]::zio_state
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * Print a summary of all zio_t structures on the system, or for a particular
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * pool. This is equivalent to '::walk zio_root | ::zio'.
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock/*ARGSUSED*/
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrockzio_state(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * MDB will remember the last address of the pipeline, so if we don't
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * zero this we'll end up trying to walk zio structures for a
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * non-existent spa_t.
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (mdb_pwalk_dcmd("zio_root", "zio", argc, argv, addr));
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct txg_list_walk_data {
fa9e4066f08beec538e775443c5be79dd423fcabahrenstxg_list_walk_init_common(mdb_walk_state_t *wsp, int txg, int maxoff)
fa9e4066f08beec538e775443c5be79dd423fcabahrens lwd = mdb_alloc(sizeof (txg_list_walk_data_t), UM_SLEEP | UM_GC);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_vread(&list, sizeof (txg_list_t), wsp->walk_addr) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("failed to read txg_list_t at %#lx", wsp->walk_addr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < TXG_SIZE; i++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens lwd->lw_obj = mdb_alloc(lwd->lw_offset + sizeof (txg_node_t),
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (txg_list_walk_init_common(wsp, 0, TXG_SIZE-1));
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (wsp->walk_addr == NULL && lwd->lw_txgoff < lwd->lw_maxoff) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("failed to read list element at %#lx", addr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens status = wsp->walk_callback(addr, lwd->lw_obj, wsp->walk_cbdata);
fa9e4066f08beec538e775443c5be79dd423fcabahrens node = (txg_node_t *)((uintptr_t)lwd->lw_obj + lwd->lw_offset);
fa9e4066f08beec538e775443c5be79dd423fcabahrens wsp->walk_addr = (uintptr_t)node->tn_next[lwd->lw_txgoff];
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ::walk spa
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Walk all named spa_t structures in the namespace. This is nothing more than
fa9e4066f08beec538e775443c5be79dd423fcabahrens * a layered avl walk.
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_lookup_by_obj(ZFS_OBJ_NAME, "spa_namespace_avl", &sym) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("failed to find symbol 'spa_namespace_avl'");
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_vread(&spa, sizeof (spa), wsp->walk_addr) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("failed to read spa_t at %p", wsp->walk_addr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (wsp->walk_callback(wsp->walk_addr, &spa, wsp->walk_cbdata));
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * [addr]::walk zio
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * Walk all active zio_t structures on the system. This is simply a layered
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * walk on top of ::walk zio_cache, with the optional ability to limit the
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * structures to a particular pool.
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock if (mdb_vread(&zio, sizeof (zio), wsp->walk_addr) == -1) {
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock mdb_warn("failed to read zio_t at %p", wsp->walk_addr);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock if (wsp->walk_data != NULL && wsp->walk_data != zio.io_spa)
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (wsp->walk_callback(wsp->walk_addr, &zio, wsp->walk_cbdata));
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * ::walk zio_child
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * Walk the children of a zio_t structure.
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock mdb_warn("::walk zio_child doesn't support global walks\n");
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock if (mdb_vread(&zio, sizeof (zio), wsp->walk_addr) == -1) {
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock mdb_warn("failed to read zio_t at %p", wsp->walk_addr);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock if (mdb_vread(&zio, sizeof (zio), wsp->walk_addr) == -1) {
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock mdb_warn("failed to read zio_t at %p", wsp->walk_addr);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock status = wsp->walk_callback(wsp->walk_addr, &zio, wsp->walk_cbdata);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * [addr]::walk zio_root
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * Walk only root zio_t structures, optionally for a particular spa_t.
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock if (mdb_vread(&zio, sizeof (zio), wsp->walk_addr) == -1) {
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock mdb_warn("failed to read zio_t at %p", wsp->walk_addr);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock if (wsp->walk_data != NULL && wsp->walk_data != zio.io_spa)
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (wsp->walk_callback(wsp->walk_addr, &zio, wsp->walk_cbdata));
ff64c0f7947882a0dbee45c31d69cb30bd003e5fMatthew Ahrens uint64_t numerator, uint64_t denom, int frac_digits)
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens for (i = frac_digits; i; i--)
ff64c0f7947882a0dbee45c31d69cb30bd003e5fMatthew Ahrens frac = mul * numerator / denom - mul * whole;
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens return (mdb_snprintf(buf, len, "%u.%0*u", whole, frac_digits, frac));
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens while (n >= 1024) {
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens n = (n + (1024 / 2)) / 1024; /* Round up or down */
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens (void) mdb_snprintf(buf, NICENUM_BUFLEN, "%llu",
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens } else if (n < 10 && (num & (num - 1)) != 0) {
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens } else if (n < 100 && (num & (num - 1)) != 0) {
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens (void) mdb_snprintf(buf, NICENUM_BUFLEN, "%llu%s",
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens * ::zfs_blkstats
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens * -v print verbose per-level information
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrenszfs_blkstats(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES + 10];
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens /* +10 in case it grew */
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens if (GETMEMB(addr, struct spa, spa_dsl_pool, addr) ||
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens GETMEMB(addr, struct dsl_pool, dp_blkstats, addr) ||
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens mdb_vread(&stats, sizeof (zfs_all_blkstats_t), addr) == -1) {
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens mdb_warn("failed to read data at %p;", addr);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens mdb_printf("maybe no stats? run \"zpool scrub\" first.");
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens tzb = &stats.zab_type[DN_MAX_LEVELS][DMU_OT_NUMTYPES];
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens ditto = tzb->zb_ditto_2_of_2_samevdev + tzb->zb_ditto_2_of_3_samevdev +
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens mdb_printf("Dittoed blocks on same vdev: %llu\n",
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens "\t avg\t comp\t%%Total\tType\n");
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens for (t = 0; t <= DMU_OT_NUMTYPES; t++) {
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens char csize[NICENUM_BUFLEN], lsize[NICENUM_BUFLEN];
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens char psize[NICENUM_BUFLEN], asize[NICENUM_BUFLEN];
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens char comp[NICENUM_BUFLEN], pct[NICENUM_BUFLEN];
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens else if (mdb_readstr(typename, sizeof (typename),
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens if (stats.zab_type[DN_MAX_LEVELS][t].zb_asize == 0)
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens zfs_blkstat_t *zb = &stats.zab_type[level][t];
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens * Don't print each level unless requested.
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens * If all the space is level 0, don't print the
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens * level 0 separately.
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens mdb_nicenum(zb->zb_asize / zb->zb_count, avg);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens "\t%5s\t%6s\t",
fa9e4066f08beec538e775443c5be79dd423fcabahrens * MDB module linkage information:
fa9e4066f08beec538e775443c5be79dd423fcabahrens * We declare a list of structures describing our dcmds, and a function
fa9e4066f08beec538e775443c5be79dd423fcabahrens * named _mdb_init to return a pointer to our module information.
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens { "arc", "[-bkmg]", "print ARC variables", arc_print },
3cb34c601f3ef3016f638574f5982e80c3735c71ahrens "\t[-O objset_impl_t*] [-n objset_name | \"mos\"] "
3cb34c601f3ef3016f638574f5982e80c3735c71ahrens "[-o object | \"mdn\"] \n"
fa9e4066f08beec538e775443c5be79dd423fcabahrens "\t[-l level] [-b blkid | \"bonus\"]",
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens "find dmu_buf_impl_t's that match specified criteria", dbufs },
fa9e4066f08beec538e775443c5be79dd423fcabahrens "find arc_buf_hdr_t of a specified DVA",
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "spa_config", ":", "print spa_t configuration", spa_print_config },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "spa_verify", ":", "verify spa_t consistency", spa_verify },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "spa_space", ":[-b]", "print spa_t on-disk space usage", spa_space },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "spa_vdevs", ":", "given a spa_t, print vdev summary", spa_vdevs },
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens "\t-r display recursively\n"
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens "\t-e print statistics\n",
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock { "zio_state", "?", "print out all zio_t structures on system or "
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "zio_pipeline", ":", "decode a zio pipeline", zio_pipeline },
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens "given a spa_t, print block type stats from last scrub",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens { "zfs_params", "", "print zfs tunable parameters", zfs_params },
fa9e4066f08beec538e775443c5be79dd423fcabahrens * In userland, there is no generic provider of list_t walkers, so we
fa9e4066f08beec538e775443c5be79dd423fcabahrens * need to add it.
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "txg_list", "given any txg_list_t *, walk all entries in all txgs",
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "txg_list0", "given any txg_list_t *, walk all entries in txg 0",
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "txg_list1", "given any txg_list_t *, walk all entries in txg 1",
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "txg_list2", "given any txg_list_t *, walk all entries in txg 2",
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "txg_list3", "given any txg_list_t *, walk all entries in txg 3",
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock { "zio", "walk all zio structures, optionally for a particular spa_t",
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock { "zio_child", "walk children of a zio_t structure",
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock zio_child_walk_init, zio_sibling_walk_step, NULL },
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock { "zio_root", "walk all root zio_t structures, optionally for a "
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock "particular spa_t",
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens { "metaslab", "given a spa_t *, walk all metaslab_t structures",