zfs.c revision 4076b1bf41cfd9f968a33ed54a7ae76d9e996fe8
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
55da60b91d96984f12de050ce428373ea25c7f35Mark J Musante * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
beb562835cfbfcc73ae96a39ad1ef3e0446d299cShampavman * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
3a5286a1cffceafcd8cf79c4156fad605129bf50Matthew Ahrens * Copyright (c) 2011, 2014 by Delphix. All rights reserved.
55da60b91d96984f12de050ce428373ea25c7f35Mark J Musante/* Portions Copyright 2010 Robert Milkowski */
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson (SPA_FLAG_VDEVS | SPA_FLAG_ERRORS | SPA_FLAG_METASLAB_GROUPS | \
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);
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens#define GETMEMB(addr, structname, member, dest) \
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens getmember(addr, ZFS_STRUCT structname, NULL, #member, \
fa9e4066f08beec538e775443c5be79dd423fcabahrens getmember(addr, NULL, ctfid, #member, sizeof (dest), &(dest))
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uint64_t numerator, uint64_t denom, int frac_digits)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson for (i = frac_digits; i; i--)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson return (mdb_snprintf(buf, len, "%u.%0*u", whole, frac_digits, frac));
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson while (n >= 1024) {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson n = (n + (1024 / 2)) / 1024; /* Round up or down */
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson (void) mdb_snprintf(buf, NICENUM_BUFLEN, "%llu",
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson } else if (n < 10 && (num & (num - 1)) != 0) {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson } else if (n < 100 && (num & (num - 1)) != 0) {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson (void) mdb_snprintf(buf, NICENUM_BUFLEN, "%llu%s",
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;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_lookup_by_name(ZFS_STRUCT "dsl_dir",
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens static int gotid;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_lookup_by_name(ZFS_STRUCT "objset",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_lookup_by_name(ZFS_STRUCT "dsl_dataset",
4223fc7cdcf5a51019f631eec2b4217ddf736451Mark Shellenbaum if (GETMEMBID(addr, &os_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;
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",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "arc_lotsfree_percent",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "zfs_dirty_data_max",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "zfs_dirty_data_sync",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "zfs_delay_max_ns",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "zfs_delay_min_dirty_percent",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "zfs_delay_scale",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "zfs_vdev_max_active",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "zfs_vdev_sync_read_min_active",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "zfs_vdev_sync_read_max_active",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "zfs_vdev_sync_write_min_active",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "zfs_vdev_sync_write_max_active",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "zfs_vdev_async_read_min_active",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "zfs_vdev_async_read_max_active",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "zfs_vdev_async_write_min_active",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "zfs_vdev_async_write_max_active",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "zfs_vdev_scrub_min_active",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "zfs_vdev_scrub_max_active",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "zfs_vdev_async_write_active_min_dirty_percent",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "zfs_vdev_async_write_active_max_dirty_percent",
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens "spa_asize_inflation",
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 "spa_max_replication_override",
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick "spa_mode_global",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_flags",
1ab7f2ded02e7a1bc3c73516eb27efa79bf2a2ffmaybee "zfs_txg_timeout",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_vdev_cache_max",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_vdev_cache_size",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_vdev_cache_bshift",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "vdev_mirror_shift",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_scrub_limit",
b16da2e29e074fb6eaeadc4fd7d17ae7340ba240George Wilson "zfs_no_scrub_io",
b16da2e29e074fb6eaeadc4fd7d17ae7340ba240George Wilson "zfs_no_scrub_prefetch",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_vdev_aggregation_limit",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "fzap_default_block_shift",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_immediate_write_sz",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_read_chunk_size",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zfs_nocacheflush",
55da60b91d96984f12de050ce428373ea25c7f35Mark J Musante "zil_replay_disable",
1ab7f2ded02e7a1bc3c73516eb27efa79bf2a2ffmaybee "metaslab_gang_bang",
d6e555bdd793b8bc8fe57d5f12c3d69c813d0661George Wilson "metaslab_df_alloc_threshold",
d6e555bdd793b8bc8fe57d5f12c3d69c813d0661George Wilson "metaslab_df_free_pct",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zio_injection_enabled",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens "zvol_immediate_write_sz",
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick for (int 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)
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick mdb_ctf_id_t type_enum, checksum_enum, compress_enum;
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick if (mdb_vread(&blk, sizeof (blkptr_t), addr) == -1) {
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick if (mdb_ctf_lookup_by_name("enum dmu_object_type", &type_enum) == -1 ||
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick mdb_ctf_lookup_by_name("enum zio_checksum", &checksum_enum) == -1 ||
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick mdb_ctf_lookup_by_name("enum zio_compress", &compress_enum) == -1) {
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick mdb_warn("Could not find blkptr enumerated types");
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick enum_lookup(checksum, sizeof (checksum), checksum_enum,
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick enum_lookup(compress, sizeof (compress), compress_enum,
43466aae47bfcd2ad9bf501faec8e75c08095e4fMax Grossman SNPRINTF_BLKPTR(mdb_snprintf, '\n', buf, sizeof (buf), bp, type,
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensdbuf(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_vread(&db, ZFS_STRUCT "dmu_buf_impl", "mdb_dmu_buf_impl_t",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (db.db.db_object == DMU_META_DNODE_OBJECT)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) mdb_snprintf(objectname, sizeof (objectname), "%llx",
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) mdb_snprintf(blkidname, sizeof (blkidname), "%llx",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens mdb_printf("%p %8s %1u %9s %2llu %s\n", addr,
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++)
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens * ::zap_leaf [-v]
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens * Print a zap_leaf_phys_t, assumed to be 16k
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens/* ARGSUSED */
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrenszap_leaf(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens if (mdb_vread(buf, sizeof (buf), addr) == -1) {
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_warn("failed to read zap_leaf_phys_t at %p", addr);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_warn("This does not appear to be a zap_leaf_phys_t");
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf("zap_leaf_phys_t at %p:\n", addr);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" lh_prefix_len = %u\n", zlp->l_hdr.lh_prefix_len);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" lh_prefix = %llx\n", zlp->l_hdr.lh_prefix);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" lh_nentries = %u\n", zlp->l_hdr.lh_nentries);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" lh_nfree = %u\n", zlp->l_hdr.lh_nfree,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens zlp->l_hdr.lh_nfree * 100 / (ZAP_LEAF_NUMCHUNKS(&l)));
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" lh_freelist = %u\n", zlp->l_hdr.lh_freelist);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" lh_flags = %x (%s)\n", zlp->l_hdr.lh_flags,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens for (i = 0; i < ZAP_LEAF_HASH_NUMENTRIES(&l); i++) {
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens for (i = 0; i < ZAP_LEAF_NUMCHUNKS(&l); i++) {
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens /* LINTED: alignment */
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens zap_leaf_chunk_t *zlc = &ZAP_LEAF_CHUNK(&l, i);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens for (j = 0; j < ZAP_LEAF_ARRAY_BYTES; j++) {
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;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_lookup_by_name(ZFS_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);
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_lookup_by_name(ZFS_STRUCT "arc_buf_hdr", &data.id) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < sizeof (syms) / sizeof (syms[0]); i++) {
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens if (mdb_lookup_by_obj(ZFS_OBJ_NAME, syms[i], &sym)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_pwalk("list", abuf_find_cb, &data, sym.st_value) != 0) {
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrenstypedef struct dbgmsg_arg {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling/* ARGSUSED */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingdbgmsg_cb(uintptr_t addr, const void *unknown, void *arg)
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_lookup_by_name(ZFS_STRUCT "zfs_dbgmsg", &id) ==
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (GETMEMBID(addr, &id, zdm_timestamp, timestamp)) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (mdb_readstr(buf, sizeof (buf), addr + off) == -1) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling mdb_warn("failed to read zdm_msg at %p\n", addr + off);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) mdb_call_dcmd("whatis", addr, DCMD_ADDRSPEC, 0, NULL);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling/* ARGSUSED */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingdbgmsg(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens 'v', MDB_OPT_SETBITS, B_TRUE, &da.da_verbose,
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens 'a', MDB_OPT_SETBITS, B_TRUE, &da.da_address,
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens if (mdb_lookup_by_obj(ZFS_OBJ_NAME, "zfs_dbgmsgs", &sym)) {
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_pwalk("list", dbgmsg_cb, &da, 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[] = {
9253d63df408bb48584e0b1abfcc24ef2472382eGeorge Wilson "p", "c", "c_min", "c_max", "size", "duplicate_buffers_size",
20128a0826f9c53167caa9215c12f08beee48e30George Wilson "arc_meta_used", "arc_meta_limit", "arc_meta_max",
4076b1bf41cfd9f968a33ed54a7ae76d9e996fe8Prakash Surya "arc_meta_min", "hdr_size", "data_size", "metadata_size",
4076b1bf41cfd9f968a33ed54a7ae76d9e996fe8Prakash Surya "other_size", "anon_size", "anon_evictable_data",
4076b1bf41cfd9f968a33ed54a7ae76d9e996fe8Prakash Surya "anon_evictable_metadata", "mru_size", "mru_evictable_data",
4076b1bf41cfd9f968a33ed54a7ae76d9e996fe8Prakash Surya "mru_ghost_evictable_data", "mru_ghost_evictable_metadata",
4076b1bf41cfd9f968a33ed54a7ae76d9e996fe8Prakash Surya "mfu_size", "mfu_evictable_data", "mfu_evictable_metadata",
4076b1bf41cfd9f968a33ed54a7ae76d9e996fe8Prakash Surya "mfu_ghost_evictable_metadata", "evict_l2_cached",
4076b1bf41cfd9f968a33ed54a7ae76d9e996fe8Prakash Surya "evict_l2_eligible", "evict_l2_ineligible", "l2_read_bytes",
4076b1bf41cfd9f968a33ed54a7ae76d9e996fe8Prakash Surya "l2_write_bytes", "l2_size", "l2_asize", "l2_hdr_size",
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens static const char *extras[] = {
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens if (mdb_lookup_by_obj(ZFS_OBJ_NAME, "arc_stats", &sym) == -1) {
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++) {
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens if (mdb_lookup_by_obj(ZFS_OBJ_NAME, extras[i], &sym) == -1) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens if (mdb_vread(&buf, sym.st_size, sym.st_value) == -1) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens /* NB: all the 64-bit extras happen to be byte counts */
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrenstypedef struct mdb_spa_print {
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens * -c Print configuration information as well
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens * -v Print vdev state
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens * -e Print vdev error stats
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson * -m Print vdev metaslab info
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson * -M print vdev metaslab group info
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson * -h Print histogram info (must be combined with -m or -M)
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;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson 'c', MDB_OPT_SETBITS, SPA_FLAG_CONFIG, &spa_flags,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson 'v', MDB_OPT_SETBITS, SPA_FLAG_VDEVS, &spa_flags,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson 'e', MDB_OPT_SETBITS, SPA_FLAG_ERRORS, &spa_flags,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson 'M', MDB_OPT_SETBITS, SPA_FLAG_METASLAB_GROUPS, &spa_flags,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson 'm', MDB_OPT_SETBITS, SPA_FLAG_METASLABS, &spa_flags,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson 'h', MDB_OPT_SETBITS, SPA_FLAG_HISTOGRAMS, &spa_flags,
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("%<u>%-?s %9s %-*s%</u>\n", "ADDR", "STATE",
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens if (mdb_ctf_vread(&spa, "spa_t", "mdb_spa_print_t", addr, 0) == -1)
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);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson (spa_flags | SPA_FLAG_VDEVS) == SPA_FLAG_VDEVS ? 0 : 1;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (mdb_call_dcmd("spa_vdevs", addr, flags, args,
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)
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_vread(&spa, ZFS_STRUCT "spa", "mdb_spa_config_spa_t",
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens return (mdb_call_dcmd("nvlist", spa.spa_config, flags,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsonconst char histo_stars[] = "****************************************";
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsonconst int histo_width = sizeof (histo_stars) - 1;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsondump_histogram(const uint64_t *histo, int size, int offset)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson for (i = 0; i < size; i++) {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson &histo_stars[(max - histo[i]) * histo_width / max]);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsontypedef struct mdb_range_tree {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uint64_t mg_histogram[RANGE_TREE_HISTOGRAM_SIZE];
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsontypedef struct mdb_metaslab {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uint64_t smp_histogram[SPACE_MAP_HISTOGRAM_SIZE];
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsontypedef struct mdb_space_map {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsontypedef struct mdb_vdev {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (mdb_ctf_vread(&vdev, "vdev_t", "mdb_vdev_t",
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_warn("failed to read vdev at %p\n", addr);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_printf("%<u>%-?s %6s %20s %10s %9s%</u>\n", "ADDR", "ID",
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson vdev_ms = mdb_alloc(vdev.vdev_ms_count * sizeof (void *),
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (mdb_vread(vdev_ms, vdev.vdev_ms_count * sizeof (void *),
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_warn("failed to read vdev_ms at %p\n", vdev.vdev_ms);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson for (int m = 0; m < vdev.vdev_ms_count; m++) {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (mdb_ctf_vread(&ms, "metaslab_t", "mdb_metaslab_t",
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_ctf_vread(&sm, "space_map_t", "mdb_space_map_t",
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_printf("%0?p %6llu %20llx %10s ", vdev_ms[m], ms.ms_id,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if ((spa_flags & SPA_FLAG_HISTOGRAMS) && ms.ms_sm != NULL) {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson (void) mdb_ctf_vread(&smp, "space_map_phys_t",
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsonmetaslab_group_stats(uintptr_t addr, int spa_flags)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (mdb_ctf_vread(&mg, "metaslab_group_t", "mdb_metaslab_group_t",
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_warn("failed to read vdev_mg at %p\n", addr);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_printf("%<u>%-?s %15s%</u>\n", "ADDR", "FRAGMENTATION");
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_printf("%0?p %15llu%%\n", addr, mg.mg_fragmentation);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson dump_histogram(mg.mg_histogram, RANGE_TREE_HISTOGRAM_SIZE, 0);
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.
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsondo_print_vdev(uintptr_t addr, int flags, int depth, boolean_t recursive,
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);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (spa_flags & SPA_FLAG_METASLABS && vdev.vdev_ms != NULL) {
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++) {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (do_print_vdev(child[c], flags, depth + 2, recursive,
fa9e4066f08beec538e775443c5be79dd423fcabahrensvdev_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson 'e', MDB_OPT_SETBITS, SPA_FLAG_ERRORS, &spa_flags,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson 'm', MDB_OPT_SETBITS, SPA_FLAG_METASLABS, &spa_flags,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson 'M', MDB_OPT_SETBITS, SPA_FLAG_METASLAB_GROUPS, &spa_flags,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson 'h', MDB_OPT_SETBITS, SPA_FLAG_HISTOGRAMS, &spa_flags,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson return (do_print_vdev(addr, flags, (int)depth, recursive, spa_flags));
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrenstypedef struct metaslab_walk_data {
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens GETMEMB(vdevp, "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);
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (GETMEMB(wsp->walk_addr, "spa", spa_root_vdev, root_vdevp) ||
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens GETMEMB(root_vdevp, "vdev", vdev_children, mw->mw_numvdevs) ||
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens GETMEMB(root_vdevp, "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 {
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrenstypedef struct space_data {
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens/* ARGSUSED */
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensspace_cb(uintptr_t addr, const void *unknown, void *arg)
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson if (mdb_ctf_vread(&ms, "metaslab_t", "mdb_metaslab_t",
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson for (i = 0; i < TXG_SIZE; i++) {
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson "mdb_range_tree_t", ms.ms_alloctree[i], 0) == -1)
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson "mdb_range_tree_t", ms.ms_freetree[i], 0) == -1)
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson (void) mdb_ctf_vread(&smp, "space_map_phys_t",
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)
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_getopts(argc, argv, 'b', MDB_OPT_SETBITS, TRUE, &bytes, NULL) !=
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (GETMEMB(addr, "spa", spa_dsl_pool, spa.spa_dsl_pool) ||
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens GETMEMB(addr, "spa", spa_root_vdev, spa.spa_root_vdev) ||
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens GETMEMB(spa.spa_root_vdev, "vdev", vdev_children, children) ||
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens GETMEMB(spa.spa_root_vdev, "vdev", vdev_child, childaddr) ||
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens GETMEMB(dp_root_dir, "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",
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson mdb_printf("ms_tree = %llu%s\n", sd.ms_tree >> shift, suffix);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mdb_printf("last synced avail = %llu%s\n", sd.avail >> shift, suffix);
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrenstypedef struct mdb_spa_vdevs {
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrensspa_print_aux(mdb_spa_aux_vdev_t *sav, uint_t flags, mdb_arg_t *v,
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock const char *name)
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock * Iterate over aux vdevs and print those out as well. This is a
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock * little annoying because we don't have a root vdev to pass to ::vdev.
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock * Instead, we print a single line and then call it for each child
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens if (mdb_vread(aux, len, sav->sav_vdevs) == -1) {
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock mdb_printf("%-?s %-9s %-12s %s\n", "-", "-", "-", name);
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock ret = mdb_call_dcmd("vdev", aux[i], flags, 3, v);
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ::spa_vdevs
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson * -e Include error stats
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson * -m Include metaslab information
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson * -M Include metaslab group information
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson * -h Include histogram information (requires -m or -M)
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)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson 'e', MDB_OPT_SETBITS, SPA_FLAG_ERRORS, &spa_flags,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson 'm', MDB_OPT_SETBITS, SPA_FLAG_METASLABS, &spa_flags,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson 'M', MDB_OPT_SETBITS, SPA_FLAG_METASLAB_GROUPS, &spa_flags,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson 'h', MDB_OPT_SETBITS, SPA_FLAG_HISTOGRAMS, &spa_flags,
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens if (mdb_ctf_vread(&spa, "spa_t", "mdb_spa_vdevs_t", addr, 0) == -1)
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * Unitialized spa_t structures can have a NULL root vdev.
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock ret = mdb_call_dcmd("vdev", (uintptr_t)spa.spa_root_vdev,
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock if (spa_print_aux(&spa.spa_l2cache, flags, v, "cache") != 0 ||
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock spa_print_aux(&spa.spa_spares, flags, v, "spares") != 0)
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:
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens * ADDRESS TYPE STAGE WAITER TIME_ELAPSED
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * The 'address' column is indented by one space for each depth level as we
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * descend down the tree.
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore#define ZIO_MAXWIDTH (sizeof (uintptr_t) * 2 + ZIO_MAXINDENT)
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Mooretypedef struct zio_print_args {
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrenstypedef struct mdb_zio {
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moorestatic int zio_child_cb(uintptr_t addr, const void *unknown, void *arg);
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrenszio_print_cb(uintptr_t addr, zio_print_args_t *zpa)
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens if (mdb_ctf_vread(&zio, ZFS_STRUCT "zio", "mdb_zio_t", addr, 0) == -1)
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens (void) mdb_ctf_vread(&zio_timestamp, ZFS_STRUCT "zio",
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens "mdb_zio_timestamp_t", addr, MDB_CTF_VREAD_QUIET);
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) {
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens if ((type = mdb_ctf_enum_name(type_enum, zio.io_type)) != NULL)
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens stage = mdb_ctf_enum_name(stage_enum, zio.io_stage);
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore if (zpa->zpa_current_depth >= zpa->zpa_min_depth) {
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore if (zpa->zpa_current_depth >= zpa->zpa_max_depth)
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens laddr = addr + mdb_ctf_offsetof_by_name(ZFS_STRUCT "zio",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens "io_parent_list");
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens laddr = addr + mdb_ctf_offsetof_by_name(ZFS_STRUCT "zio",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens "io_child_list");
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore if (mdb_pwalk("list", zio_child_cb, zpa, laddr) != 0) {
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore mdb_warn("failed to walk zio_t children at %p\n", laddr);
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore/* ARGSUSED */
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moorezio_child_cb(uintptr_t addr, const void *unknown, void *arg)
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore mdb_warn("failed to read zio_link_t at %p", addr);
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore/* ARGSUSED */
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moorezio_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore 'r', MDB_OPT_SETBITS, INT_MAX, &zpa.zpa_max_depth,
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore 'c', MDB_OPT_SETBITS, ZIO_WALK_CHILD, &zpa.zpa_type,
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore 'p', MDB_OPT_SETBITS, ZIO_WALK_PARENT, &zpa.zpa_type,
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens if (!(flags & DCMD_PIPE_OUT) && DCMD_HDRSPEC(flags)) {
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens mdb_printf("%<u>%-*s %-5s %-16s %-16s %-12s%</u>\n",
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens ZIO_MAXWIDTH, "ADDRESS", "TYPE", "STAGE", "WAITER",
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens "TIME_ELAPSED");
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'");
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens return (wsp->walk_callback(wsp->walk_addr, NULL, 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.
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_vread(&zio, ZFS_STRUCT "zio", "mdb_zio_t",
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (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.
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_vread(&zio, ZFS_STRUCT "zio", "mdb_zio_t",
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore /* If the parent list is not empty, ignore */
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (zio.io_parent_list.list_head.list_next !=
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens mdb_ctf_offsetof_by_name(ZFS_STRUCT "zio", "io_parent_list") +
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens mdb_ctf_offsetof_by_name("struct list", "list_head"))
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (wsp->walk_callback(wsp->walk_addr, &zio, wsp->walk_cbdata));
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens * ::zfs_blkstats
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson * -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 */
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (GETMEMB(addr, "spa", spa_dsl_pool, addr) ||
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens GETMEMB(addr, "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.");
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden tzb = &stats.zab_type[DN_MAX_LEVELS][DMU_OT_TOTAL];
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");
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden for (t = 0; t <= DMU_OT_TOTAL; 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",
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrenstypedef struct mdb_reference {
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens/* ARGSUSED */
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrensreference_cb(uintptr_t addr, const void *ignored, void *arg)
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (mdb_ctf_vread(&ref, "reference_t", "mdb_reference_t", addr,
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (mdb_readstr(holder_str, sizeof (holder_str),
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens mdb_printf("with count=%llu ", ref.ref_number);
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens (void) mdb_call_dcmd("whatis", addr, DCMD_ADDRSPEC, 0, NULL);
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens (void) mdb_call_dcmd("whatis", ref.ref_removed,
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrenstypedef struct mdb_refcount {
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens/* ARGSUSED */
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrensrefcount(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (mdb_ctf_vread(&rc, "refcount_t", "mdb_refcount_t", addr,
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (mdb_ctf_vread(&rcr, "refcount_t", "mdb_refcount_removed_t", addr,
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens mdb_printf("refcount_t at %p has %llu holds (untracked)\n",
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (mdb_ctf_vread(&rct, "refcount_t", "mdb_refcount_tracked_t", addr,
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens /* If this is an old target, it might be tracked. */
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens mdb_printf("refcount_t at %p has %llu current holds, "
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens "%llu recently released holds\n",
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens addr, (longlong_t)rc.rc_count, (longlong_t)rcr.rc_removed_count);
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens off = mdb_ctf_offsetof_by_name("refcount_t", "rc_list");
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens mdb_pwalk("list", reference_cb, (void*)B_FALSE, addr + off);
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens off = mdb_ctf_offsetof_by_name("refcount_t", "rc_removed");
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens mdb_pwalk("list", reference_cb, (void*)B_FALSE, addr + off);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumsa_attr_table(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_vread(&sa_os, sizeof (sa_os_t), addr) == -1) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("failed to read sa_os at %p", addr);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum table = mdb_alloc(sizeof (sa_attr_table_t) * sa_os.sa_num_attrs,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum name = mdb_alloc(MAXPATHLEN, UM_SLEEP | UM_GC);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_vread(table, sizeof (sa_attr_table_t) * sa_os.sa_num_attrs,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("failed to read sa_os at %p", addr);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("%<u>%-10s %-10s %-10s %-10s %s%</u>\n",
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum "ATTR ID", "REGISTERED", "LENGTH", "BSWAP", "NAME");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum for (i = 0; i != sa_os.sa_num_attrs; i++) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_readstr(name, MAXPATHLEN, (uintptr_t)table[i].sa_name);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum (int)table[i].sa_attr, (int)table[i].sa_registered,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum (int)table[i].sa_length, table[i].sa_byteswap, name);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumsa_get_off_table(uintptr_t addr, uint32_t **off_tab, int attr_count)
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (GETMEMB(addr, "sa_idx_tab", sa_idx_tab, idx_table)) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("can't find offset table in sa_idx_tab\n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum *off_tab = mdb_alloc(attr_count * sizeof (uint32_t),
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum attr_count * sizeof (uint32_t), idx_table) == -1) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("failed to attribute offset table %p", idx_table);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumsa_attr_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum attr_id = mdb_strtoull(argv[0].a_un.a_str);
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (GETMEMB(addr, "sa_handle", sa_bonus_tab, bonus_tab) ||
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens GETMEMB(addr, "sa_handle", sa_spill_tab, spill_tab) ||
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens GETMEMB(addr, "sa_handle", sa_bonus, db_bonus) ||
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens GETMEMB(addr, "sa_handle", sa_spill, db_spill)) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("Can't find necessary information in sa_handle "
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum "in sa_handle\n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("Can't find os_sa in objset\n");
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (GETMEMB(os_sa, "sa_os", sa_num_attrs, attr_count)) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("attribute id number is out of range\n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (sa_get_off_table(bonus_tab, &offset_tab,
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (GETMEMB(db_bonus, "dmu_buf", db_data, db_data)) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("can't find db_data in bonus dbuf\n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (bonus_tab && !TOC_ATTR_PRESENT(offset_tab[attr_id]) &&
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum } else if (!TOC_ATTR_PRESENT(offset_tab[attr_id]) && spill_tab) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (sa_get_off_table(spill_tab, &offset_tab,
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (GETMEMB(db_spill, "dmu_buf", db_data, db_data)) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("can't find db_data in spill dbuf\n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (!TOC_ATTR_PRESENT(offset_tab[attr_id])) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum attr_addr = db_data + TOC_OFF(offset_tab[attr_id]);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_ace_print_common(uintptr_t addr, uint_t flags,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum uint64_t id, uint32_t access_mask, uint16_t ace_flags,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("%<u>%-?s %-8s %-8s %-8s %s%</u>\n",
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("%0?p %-8x %-8x %-8x %-llx\n", addr,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("group:%llx:", (u_longlong_t)id);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case 0: /* User entry */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("user:%llx:", (u_longlong_t)id);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum /* print out permission mask */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum /* Print out inheritance flags */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (ace_flags & ACE_NO_PROPAGATE_INHERIT_ACE)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (ace_flags & ACE_SUCCESSFUL_ACCESS_ACE_FLAG)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (ace_flags & ACE_FAILED_ACCESS_ACE_FLAG)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_ace_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum 'v', MDB_OPT_SETBITS, TRUE, &verbose, TRUE, NULL) != argc)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_vread(&zace, sizeof (zfs_ace_t), addr) == -1) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if ((zace.z_hdr.z_flags & ACE_TYPE_FLAGS) == 0 ||
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum (zace.z_hdr.z_flags & ACE_TYPE_FLAGS) == ACE_IDENTIFIER_GROUP)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (zfs_ace_print_common(addr, flags, id, zace.z_hdr.z_access_mask,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum zace.z_hdr.z_flags, zace.z_hdr.z_type, verbose));
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_ace0_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum 'v', MDB_OPT_SETBITS, TRUE, &verbose, TRUE, NULL) != argc)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_vread(&ace, sizeof (ace_t), addr) == -1) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum (ace.a_flags & ACE_TYPE_FLAGS) == ACE_IDENTIFIER_GROUP)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (zfs_ace_print_common(addr, flags, id, ace.a_access_mask,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumacl_aces_cb(uintptr_t addr, const void *unknown, void *arg)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum acl_dump_args_t *acl_args = (acl_dump_args_t *)arg;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum DCMD_ADDRSPEC|acl_args->a_flags, acl_args->a_argc,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum DCMD_ADDRSPEC|acl_args->a_flags, acl_args->a_argc,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumacl_cb(uintptr_t addr, const void *unknown, void *arg)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum acl_dump_args_t *acl_args = (acl_dump_args_t *)arg;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_pwalk("zfs_acl_node_aces", acl_aces_cb,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_pwalk("zfs_acl_node_aces0", acl_aces_cb,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_acl_dump(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum 'v', MDB_OPT_SETBITS, TRUE, &verbose, TRUE, NULL) != argc)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_vread(&zacl, sizeof (zfs_acl_t), addr) == -1) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_pwalk("zfs_acl_node", acl_cb, &acl_args, addr) != 0) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_acl_node_walk_init(mdb_walk_state_t *wsp)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("must supply address of zfs_acl_node_t\n");
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens mdb_ctf_offsetof_by_name(ZFS_STRUCT "zfs_acl", "z_acl");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_acl_node_walk_step(mdb_walk_state_t *wsp)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_vread(&aclnode, sizeof (zfs_acl_node_t),
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("failed to read zfs_acl_node at %p", wsp->walk_addr);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (wsp->walk_callback(wsp->walk_addr, &aclnode, wsp->walk_cbdata));
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_aces_walk_init_common(mdb_walk_state_t *wsp, int version,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("must supply address of zfs_acl_node_t\n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum ace_walk_data = mdb_alloc(sizeof (ace_walk_data_t), UM_SLEEP | UM_GC);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_acl_node_aces_walk_init_common(mdb_walk_state_t *wsp, int version)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_ctf_lookup_by_name("struct zfs_acl_node",
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("couldn't find struct zfs_acl_node");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (GETMEMBID(wsp->walk_addr, &acl_id, z_ace_count, z_ace_count)) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (GETMEMBID(wsp->walk_addr, &acl_id, z_acldata, z_acldata)) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (zfs_aces_walk_init_common(wsp, version,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_acl_node_aces_walk_init(mdb_walk_state_t *wsp)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (zfs_acl_node_aces_walk_init_common(wsp, 1));
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_acl_node_aces0_walk_init(mdb_walk_state_t *wsp)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (zfs_acl_node_aces_walk_init_common(wsp, 0));
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum ace_walk_data_t *ace_data = wsp->walk_data;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_vread(&zace, sizeof (zfs_ace_t), wsp->walk_addr) == -1) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("failed to read zfs_ace_t at %#lx",
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum entry_type = acep->a_flags & ACE_TYPE_FLAGS;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum entry_type = zace.z_hdr.z_flags & ACE_TYPE_FLAGS;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum sizeof (ace_t) : sizeof (zfs_object_ace_t);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum status = wsp->walk_callback(wsp->walk_addr,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum (void *)(uintptr_t)&zace, wsp->walk_cbdata);
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens/* ARGSUSED */
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrensrrwlock(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_readsym(&rrw_key, "uint_t", "rrw_tsd_key", 0) == -1)
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_vread(&rrw, "rrwlock_t", "mdb_zfs_rrwlock_t", addr,
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens mdb_printf("write lock held by thread %lx\n", rrw.rr_writer);
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens mdb_ctf_offsetof_by_name(ZFS_STRUCT "rrwlock", "rr_anon_rcount"),
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens mdb_ctf_offsetof_by_name(ZFS_STRUCT "rrwlock", "rr_linked_rcount"),
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens * XXX This should find references from
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens * "::walk thread | ::tsd -v <rrw_key>", but there is no support
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens * for programmatic consumption of dcmds, so this would be
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens * difficult, potentially requiring reimplementing ::tsd (both
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens * user and kernel versions) in this MDB module.
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 },
4223fc7cdcf5a51019f631eec2b4217ddf736451Mark Shellenbaum "\t[-O objset_t*] [-n objset_name | \"mos\"] "
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore "[-o object | \"mdn\"] \n"
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore "\t[-l level] [-b blkid | \"bonus\"]",
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore "find dmu_buf_impl_t's that match specified criteria", dbufs },
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore "find arc_buf_hdr_t of a specified DVA",
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "\t-c display spa config\n"
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "\t-e display vdev statistics\n"
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "\t-v display vdev information\n"
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "\t-m display metaslab statistics\n"
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "\t-M display metaslab group statistics\n"
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "\t-h display histogram (requires -m or -M)\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "spa_config", ":", "print spa_t configuration", spa_print_config },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "spa_space", ":[-b]", "print spa_t on-disk space usage", spa_space },
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "\t-e display vdev statistics\n"
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "\t-m dispaly metaslab statistics\n"
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "\t-M display metaslab group statistic\n"
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "\t-h display histogram (requires -m or -M)\n",
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "given a spa_t, print vdev summary", spa_vdevs },
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore "\t-r display recursively\n"
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "\t-e display statistics\n"
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "\t-m display metaslab statistics\n"
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "\t-M display metaslab group statistics\n"
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "\t-h display histogram (requires -m or -M)\n",
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore "\t-c display children\n"
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore "\t-p display parents\n"
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore "\t-r display recursively",
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock { "zio_state", "?", "print out all zio_t structures on system or "
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens "given a spa_t, print block type stats from last scrub",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens { "zfs_params", "", "print zfs tunable parameters", zfs_params },
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens "\t-r display recently removed references",
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens { "zap_leaf", "", "print zap_leaf_phys_t", zap_leaf },
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum { "zfs_aces", ":[-v]", "print all ACEs from a zfs_acl_t",
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum { "zfs_ace", ":[-v]", "print zfs_ace", zfs_ace_print },
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum { "zfs_ace0", ":[-v]", "print zfs_ace0", zfs_ace0_print },
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum { "sa_attr_table", ":", "print SA attribute table from sa_os_t",
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum "print SA attribute address when given sa_handle_t", sa_attr_print},
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens "print rrwlock_t, including readers", rrwlock},
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens freelist_walk_init, freelist_walk_step, NULL },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "txg_list", "given any txg_list_t *, walk all entries in all txgs",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens txg_list_walk_init, txg_list_walk_step, NULL },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "txg_list0", "given any txg_list_t *, walk all entries in txg 0",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens txg_list0_walk_init, txg_list_walk_step, NULL },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "txg_list1", "given any txg_list_t *, walk all entries in txg 1",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens txg_list1_walk_init, txg_list_walk_step, NULL },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "txg_list2", "given any txg_list_t *, walk all entries in txg 2",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens txg_list2_walk_init, txg_list_walk_step, NULL },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "txg_list3", "given any txg_list_t *, walk all entries in txg 3",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens txg_list3_walk_init, txg_list_walk_step, NULL },
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock { "zio", "walk all zio structures, optionally for a particular spa_t",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens { "zio_root",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens "walk all root zio_t structures, optionally for a particular spa_t",
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens { "metaslab", "given a spa_t *, walk all metaslab_t structures",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens metaslab_walk_init, metaslab_walk_step, NULL },
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum { "zfs_acl_node", "given a zfs_acl_t, walk all zfs_acl_nodes",
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum zfs_acl_node_walk_init, zfs_acl_node_walk_step, NULL },
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum { "zfs_acl_node_aces", "given a zfs_acl_node_t, walk all ACEs",
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum zfs_acl_node_aces_walk_init, zfs_aces_walk_step, NULL },
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum { "zfs_acl_node_aces0",
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum "given a zfs_acl_node_t, walk all ACEs as ace_t",