fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER START
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
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 *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa9e4066f08beec538e775443c5be79dd423fcabahrens * or http://www.opensolaris.org/os/licensing.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * See the License for the specific language governing permissions
fa9e4066f08beec538e775443c5be79dd423fcabahrens * and limitations under the License.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
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 *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * CDDL HEADER END
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
55da60b91d96984f12de050ce428373ea25c7f35Mark J Musante * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
beb562835cfbfcc73ae96a39ad1ef3e0446d299cShampavman * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi * Copyright (c) 2011, 2016 by Delphix. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
55da60b91d96984f12de050ce428373ea25c7f35Mark J Musante/* Portions Copyright 2010 Robert Milkowski */
55da60b91d96984f12de050ce428373ea25c7f35Mark J Musante
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <mdb/mdb_ctf.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/zfs_context.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/mdb_modapi.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/dbuf.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/dmu_objset.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/dsl_dir.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/dsl_pool.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/metaslab_impl.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/space_map.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/list.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens#include <sys/vdev_impl.h>
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens#include <sys/zap_leaf.h>
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens#include <sys/zap_impl.h>
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens#include <ctype.h>
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum#include <sys/zfs_acl.h>
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum#include <sys/sa_impl.h>
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson#include <sys/multilist.h>
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#ifdef _KERNEL
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define ZFS_OBJ_NAME "zfs"
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrensextern int64_t mdb_gethrtime(void);
fa9e4066f08beec538e775443c5be79dd423fcabahrens#else
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define ZFS_OBJ_NAME "libzpool.so.1"
fa9e4066f08beec538e775443c5be79dd423fcabahrens#endif
fa9e4066f08beec538e775443c5be79dd423fcabahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens#define ZFS_STRUCT "struct " ZFS_OBJ_NAME "`"
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens
feef89cf5f5fee792c1a396bb0e48070935cf65aVictor Latushkin#ifndef _KERNEL
feef89cf5f5fee792c1a396bb0e48070935cf65aVictor Latushkinint aok;
feef89cf5f5fee792c1a396bb0e48070935cf65aVictor Latushkin#endif
feef89cf5f5fee792c1a396bb0e48070935cf65aVictor Latushkin
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsonenum spa_flags {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson SPA_FLAG_CONFIG = 1 << 0,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson SPA_FLAG_VDEVS = 1 << 1,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson SPA_FLAG_ERRORS = 1 << 2,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson SPA_FLAG_METASLAB_GROUPS = 1 << 3,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson SPA_FLAG_METASLABS = 1 << 4,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson SPA_FLAG_HISTOGRAMS = 1 << 5
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson};
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi/*
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi * If any of these flags are set, call spa_vdevs in spa_print
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi */
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson#define SPA_FLAG_ALL_VDEV \
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson (SPA_FLAG_VDEVS | SPA_FLAG_ERRORS | SPA_FLAG_METASLAB_GROUPS | \
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi SPA_FLAG_METASLABS)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensgetmember(uintptr_t addr, const char *type, mdb_ctf_id_t *idp,
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *member, int len, void *buf)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_ctf_id_t id;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ulong_t off;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char name[64];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (idp == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_ctf_lookup_by_name(type, &id) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("couldn't find type %s", type);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens idp = &id;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens type = name;
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_ctf_type_name(*idp, name, sizeof (name));
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_ctf_offsetof(*idp, member, &off) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("couldn't find member %s of type %s\n", member, type);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (off % 8 != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("member %s of type %s is unsupported bitfield",
fa9e4066f08beec538e775443c5be79dd423fcabahrens member, type);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens off /= 8;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_vread(buf, len, addr + off) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("failed to read %s from %s at %p",
fa9e4066f08beec538e775443c5be79dd423fcabahrens member, type, addr + off);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens /* mdb_warn("read %s from %s at %p+%llx\n", member, type, addr, off); */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens#define GETMEMB(addr, structname, member, dest) \
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens getmember(addr, ZFS_STRUCT structname, NULL, #member, \
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens sizeof (dest), &(dest))
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define GETMEMBID(addr, ctfid, member, dest) \
fa9e4066f08beec538e775443c5be79dd423fcabahrens getmember(addr, NULL, ctfid, #member, sizeof (dest), &(dest))
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingstatic boolean_t
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingstrisprint(const char *cp)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling{
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling for (; *cp; cp++) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (!isprint(*cp))
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling return (B_FALSE);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling return (B_TRUE);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling}
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson#define NICENUM_BUFLEN 6
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsonstatic int
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsonsnprintfrac(char *buf, int len,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uint64_t numerator, uint64_t denom, int frac_digits)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson{
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson int mul = 1;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson int whole, frac, i;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson for (i = frac_digits; i; i--)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mul *= 10;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson whole = numerator / denom;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson frac = mul * numerator / denom - mul * whole;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson return (mdb_snprintf(buf, len, "%u.%0*u", whole, frac_digits, frac));
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson}
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsonstatic void
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsonmdb_nicenum(uint64_t num, char *buf)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson{
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uint64_t n = num;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson int index = 0;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson char *u;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson while (n >= 1024) {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson n = (n + (1024 / 2)) / 1024; /* Round up or down */
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson index++;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson }
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson u = &" \0K\0M\0G\0T\0P\0E\0"[index*2];
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (index == 0) {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson (void) mdb_snprintf(buf, NICENUM_BUFLEN, "%llu",
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson (u_longlong_t)n);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson } else if (n < 10 && (num & (num - 1)) != 0) {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson (void) snprintfrac(buf, NICENUM_BUFLEN,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson num, 1ULL << 10 * index, 2);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson strcat(buf, u);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson } else if (n < 100 && (num & (num - 1)) != 0) {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson (void) snprintfrac(buf, NICENUM_BUFLEN,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson num, 1ULL << 10 * index, 1);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson strcat(buf, u);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson } else {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson (void) mdb_snprintf(buf, NICENUM_BUFLEN, "%llu%s",
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson (u_longlong_t)n, u);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson }
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson}
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int verbose;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensfreelist_walk_init(mdb_walk_state_t *wsp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (wsp->walk_addr == NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("must supply starting address\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (WALK_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens wsp->walk_data = 0; /* Index into the freelist */
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (WALK_NEXT);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensfreelist_walk_step(mdb_walk_state_t *wsp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t entry;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uintptr_t number = (uintptr_t)wsp->walk_data;
8053a26377fa80614ba5221e12b86aab4e8a675eck char *ddata[] = { "ALLOC", "FREE", "CONDENSE", "INVALID",
8053a26377fa80614ba5221e12b86aab4e8a675eck "INVALID", "INVALID", "INVALID", "INVALID" };
fa9e4066f08beec538e775443c5be79dd423fcabahrens int mapshift = SPA_MINBLOCKSHIFT;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_vread(&entry, sizeof (entry), wsp->walk_addr) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("failed to read freelist entry %p", wsp->walk_addr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (WALK_DONE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens wsp->walk_addr += sizeof (entry);
fa9e4066f08beec538e775443c5be79dd423fcabahrens wsp->walk_data = (void *)(number + 1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (SM_DEBUG_DECODE(entry)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("DEBUG: %3u %10s: txg=%llu pass=%llu\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens number,
fa9e4066f08beec538e775443c5be79dd423fcabahrens ddata[SM_DEBUG_ACTION_DECODE(entry)],
fa9e4066f08beec538e775443c5be79dd423fcabahrens SM_DEBUG_TXG_DECODE(entry),
fa9e4066f08beec538e775443c5be79dd423fcabahrens SM_DEBUG_SYNCPASS_DECODE(entry));
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("Entry: %3u offsets=%08llx-%08llx type=%c "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "size=%06llx", number,
fa9e4066f08beec538e775443c5be79dd423fcabahrens SM_OFFSET_DECODE(entry) << mapshift,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (SM_OFFSET_DECODE(entry) + SM_RUN_DECODE(entry)) <<
fa9e4066f08beec538e775443c5be79dd423fcabahrens mapshift,
fa9e4066f08beec538e775443c5be79dd423fcabahrens SM_TYPE_DECODE(entry) == SM_ALLOC ? 'A' : 'F',
fa9e4066f08beec538e775443c5be79dd423fcabahrens SM_RUN_DECODE(entry) << mapshift);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (verbose)
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf(" (raw=%012llx)\n", entry);
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (WALK_NEXT);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrensmdb_dsl_dir_name(uintptr_t addr, char *buf)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens static int gotid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens static mdb_ctf_id_t dd_id;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uintptr_t dd_parent;
9adfa60d484ce2435f5af77cc99dcd4e692b6660Matthew Ahrens char dd_myname[ZFS_MAX_DATASET_NAME_LEN];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!gotid) {
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_lookup_by_name(ZFS_STRUCT "dsl_dir",
fa9e4066f08beec538e775443c5be79dd423fcabahrens &dd_id) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("couldn't find struct dsl_dir");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens gotid = TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (GETMEMBID(addr, &dd_id, dd_parent, dd_parent) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens GETMEMBID(addr, &dd_id, dd_myname, dd_myname)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (dd_parent) {
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_dsl_dir_name(dd_parent, buf))
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens strcat(buf, "/");
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (dd_myname[0])
fa9e4066f08beec538e775443c5be79dd423fcabahrens strcat(buf, dd_myname);
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens strcat(buf, "???");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensobjset_name(uintptr_t addr, char *buf)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens static int gotid;
4223fc7cdcf5a51019f631eec2b4217ddf736451Mark Shellenbaum static mdb_ctf_id_t os_id, ds_id;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uintptr_t os_dsl_dataset;
9adfa60d484ce2435f5af77cc99dcd4e692b6660Matthew Ahrens char ds_snapname[ZFS_MAX_DATASET_NAME_LEN];
fa9e4066f08beec538e775443c5be79dd423fcabahrens uintptr_t ds_dir;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens buf[0] = '\0';
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!gotid) {
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_lookup_by_name(ZFS_STRUCT "objset",
4223fc7cdcf5a51019f631eec2b4217ddf736451Mark Shellenbaum &os_id) == -1) {
4223fc7cdcf5a51019f631eec2b4217ddf736451Mark Shellenbaum mdb_warn("couldn't find struct objset");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_lookup_by_name(ZFS_STRUCT "dsl_dataset",
fa9e4066f08beec538e775443c5be79dd423fcabahrens &ds_id) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("couldn't find struct dsl_dataset");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens gotid = TRUE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
4223fc7cdcf5a51019f631eec2b4217ddf736451Mark Shellenbaum if (GETMEMBID(addr, &os_id, os_dsl_dataset, os_dsl_dataset))
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (os_dsl_dataset == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens strcat(buf, "mos");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (GETMEMBID(os_dsl_dataset, &ds_id, ds_snapname, ds_snapname) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens GETMEMBID(os_dsl_dataset, &ds_id, ds_dir, ds_dir)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (ds_dir && mdb_dsl_dir_name(ds_dir, buf))
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (ds_snapname[0]) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens strcat(buf, "@");
fa9e4066f08beec538e775443c5be79dd423fcabahrens strcat(buf, ds_snapname);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilsonstatic int
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilsonenum_lookup(char *type, int val, const char *prefix, size_t size, char *out)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *cp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens size_t len = strlen(prefix);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_ctf_id_t enum_type;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if (mdb_ctf_lookup_by_name(type, &enum_type) != 0) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_warn("Could not find enum for %s", type);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson return (-1);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if ((cp = mdb_ctf_enum_name(enum_type, val)) != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strncmp(cp, prefix, len) == 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens cp += len;
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strncpy(out, cp, size);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_snprintf(out, size, "? (%d)", val);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson return (0);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens/* ARGSUSED */
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrensstatic int
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrenszfs_params(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens{
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens /*
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens * This table can be approximately generated by running:
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens * egrep "^[a-z0-9_]+ [a-z0-9_]+( =.*)?;" *.c | cut -d ' ' -f 2
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens */
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",
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens };
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick for (int i = 0; i < sizeof (params) / sizeof (params[0]); i++) {
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens int sz;
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens uint64_t val64;
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens uint32_t *val32p = (uint32_t *)&val64;
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens sz = mdb_readvar(&val64, params[i]);
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens if (sz == 4) {
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens mdb_printf("%s = 0x%x\n", params[i], *val32p);
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens } else if (sz == 8) {
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens mdb_printf("%s = 0x%llx\n", params[i], val64);
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens } else {
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens mdb_warn("variable %s not found", params[i]);
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens }
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens }
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens return (DCMD_OK);
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens}
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensblkptr(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick char type[80], checksum[80], compress[80];
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick blkptr_t blk, *bp = &blk;
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick char buf[BP_SPRINTF_LEN];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick if (mdb_vread(&blk, sizeof (blkptr_t), addr) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("failed to read blkptr_t");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if (enum_lookup("enum dmu_object_type", BP_GET_TYPE(bp), "DMU_OT_",
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson sizeof (type), type) == -1 ||
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson enum_lookup("enum zio_checksum", BP_GET_CHECKSUM(bp),
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson "ZIO_CHECKSUM_", sizeof (checksum), checksum) == -1 ||
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson enum_lookup("enum zio_compress", BP_GET_COMPRESS(bp),
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson "ZIO_COMPRESS_", sizeof (compress), compress) == -1) {
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick mdb_warn("Could not find blkptr enumerated types");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
43466aae47bfcd2ad9bf501faec8e75c08095e4fMax Grossman SNPRINTF_BLKPTR(mdb_snprintf, '\n', buf, sizeof (buf), bp, type,
43466aae47bfcd2ad9bf501faec8e75c08095e4fMax Grossman checksum, compress);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick mdb_printf("%s\n", buf);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_OK);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrenstypedef struct mdb_dmu_buf_impl {
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens struct {
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens uint64_t db_object;
2515f5d4dbff605ba645d47a6851d8d0bac5b994Justin T. Gibbs uintptr_t db_data;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens } db;
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens uintptr_t db_objset;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens uint64_t db_level;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens uint64_t db_blkid;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens struct {
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens uint64_t rc_count;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens } db_holds;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens} mdb_dmu_buf_impl_t;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensdbuf(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens mdb_dmu_buf_impl_t db;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char objectname[32];
fa9e4066f08beec538e775443c5be79dd423fcabahrens char blkidname[32];
9adfa60d484ce2435f5af77cc99dcd4e692b6660Matthew Ahrens char path[ZFS_MAX_DATASET_NAME_LEN];
ba3132cfb269da4118d7dc25a8c6c1a91f9f5303Joe Stein int ptr_width = (int)(sizeof (void *)) * 2;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (DCMD_HDRSPEC(flags))
ba3132cfb269da4118d7dc25a8c6c1a91f9f5303Joe Stein mdb_printf("%*s %8s %3s %9s %5s %s\n",
ba3132cfb269da4118d7dc25a8c6c1a91f9f5303Joe Stein ptr_width, "addr", "object", "lvl", "blkid", "holds", "os");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_vread(&db, ZFS_STRUCT "dmu_buf_impl", "mdb_dmu_buf_impl_t",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens addr, 0) == -1)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (db.db.db_object == DMU_META_DNODE_OBJECT)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strcpy(objectname, "mdn");
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) mdb_snprintf(objectname, sizeof (objectname), "%llx",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens (u_longlong_t)db.db.db_object);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (db.db_blkid == DMU_BONUS_BLKID)
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strcpy(blkidname, "bonus");
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) mdb_snprintf(blkidname, sizeof (blkidname), "%llx",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens (u_longlong_t)db.db_blkid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (objset_name(db.db_objset, path)) {
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ba3132cfb269da4118d7dc25a8c6c1a91f9f5303Joe Stein mdb_printf("%*p %8s %3u %9s %5llu %s\n", ptr_width, addr,
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens objectname, (int)db.db_level, blkidname,
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens db.db_holds.rc_count, path);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_OK);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensdbuf_stats(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define HISTOSZ 32
fa9e4066f08beec538e775443c5be79dd423fcabahrens uintptr_t dbp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens dmu_buf_impl_t db;
fa9e4066f08beec538e775443c5be79dd423fcabahrens dbuf_hash_table_t ht;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t bucket, ndbufs;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t histo[HISTOSZ];
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t histo2[HISTOSZ];
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i, maxidx;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_readvar(&ht, "dbuf_hash_table") == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("failed to read 'dbuf_hash_table'");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < HISTOSZ; i++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens histo[i] = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens histo2[i] = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens ndbufs = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (bucket = 0; bucket < ht.hash_table_mask+1; bucket++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens int len;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_vread(&dbp, sizeof (void *),
fa9e4066f08beec538e775443c5be79dd423fcabahrens (uintptr_t)(ht.hash_table+bucket)) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("failed to read hash bucket %u at %p",
fa9e4066f08beec538e775443c5be79dd423fcabahrens bucket, ht.hash_table+bucket);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens len = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (dbp != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_vread(&db, sizeof (dmu_buf_impl_t),
fa9e4066f08beec538e775443c5be79dd423fcabahrens dbp) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("failed to read dbuf at %p", dbp);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens dbp = (uintptr_t)db.db_hash_next;
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = MIN(len, HISTOSZ - 1); i >= 0; i--)
fa9e4066f08beec538e775443c5be79dd423fcabahrens histo2[i]++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens len++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens ndbufs++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (len >= HISTOSZ)
fa9e4066f08beec538e775443c5be79dd423fcabahrens len = HISTOSZ-1;
fa9e4066f08beec538e775443c5be79dd423fcabahrens histo[len]++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("hash table has %llu buckets, %llu dbufs "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "(avg %llu buckets/dbuf)\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens ht.hash_table_mask+1, ndbufs,
fa9e4066f08beec538e775443c5be79dd423fcabahrens (ht.hash_table_mask+1)/ndbufs);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens maxidx = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < HISTOSZ; i++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (histo[i] > 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens maxidx = i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("hash chain length number of buckets\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i <= maxidx; i++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("%u %llu\n", i, histo[i]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens maxidx = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < HISTOSZ; i++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (histo2[i] > 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens maxidx = i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("hash chain depth number of dbufs\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i <= maxidx; i++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("%u or more %llu %llu%%\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens i, histo2[i], histo2[i]*100/ndbufs);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_OK);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens#define CHAIN_END 0xffff
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens/*
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens * ::zap_leaf [-v]
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens *
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens * Print a zap_leaf_phys_t, assumed to be 16k
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens */
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens/* ARGSUSED */
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrensstatic int
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrenszap_leaf(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens{
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens char buf[16*1024];
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens int verbose = B_FALSE;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens int four = B_FALSE;
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs dmu_buf_t l_dbuf;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens zap_leaf_t l;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens zap_leaf_phys_t *zlp = (void *)buf;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens int i;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens if (mdb_getopts(argc, argv,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens 'v', MDB_OPT_SETBITS, TRUE, &verbose,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens '4', MDB_OPT_SETBITS, TRUE, &four,
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens NULL) != argc)
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens return (DCMD_USAGE);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs l_dbuf.db_data = zlp;
c1379625401dfbe1c39b79136dd384a571d47fdeJustin T. Gibbs l.l_dbuf = &l_dbuf;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens l.l_bs = 14; /* assume 16k blocks */
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens if (four)
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens l.l_bs = 12;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens if (!(flags & DCMD_ADDRSPEC)) {
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens return (DCMD_USAGE);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens }
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
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 return (DCMD_ERR);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens }
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens if (zlp->l_hdr.lh_block_type != ZBT_LEAF ||
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens zlp->l_hdr.lh_magic != ZAP_LEAF_MAGIC) {
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_warn("This does not appear to be a zap_leaf_phys_t");
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens return (DCMD_ERR);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens }
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
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 zlp->l_hdr.lh_flags & ZLF_ENTRIES_CDSORTED ?
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens "ENTRIES_CDSORTED" : "");
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens if (verbose) {
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" hash table:\n");
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens for (i = 0; i < ZAP_LEAF_HASH_NUMENTRIES(&l); i++) {
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens if (zlp->l_hash[i] != CHAIN_END)
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" %u: %u\n", i, zlp->l_hash[i]);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens }
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens }
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" chunks:\n");
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 switch (zlc->l_entry.le_type) {
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens case ZAP_CHUNK_FREE:
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens if (verbose) {
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" %u: free; lf_next = %u\n",
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens i, zlc->l_free.lf_next);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens }
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens break;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens case ZAP_CHUNK_ENTRY:
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" %u: entry\n", i);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens if (verbose) {
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" le_next = %u\n",
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens zlc->l_entry.le_next);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens }
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" le_name_chunk = %u\n",
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens zlc->l_entry.le_name_chunk);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" le_name_numints = %u\n",
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens zlc->l_entry.le_name_numints);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" le_value_chunk = %u\n",
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens zlc->l_entry.le_value_chunk);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" le_value_intlen = %u\n",
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens zlc->l_entry.le_value_intlen);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" le_value_numints = %u\n",
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens zlc->l_entry.le_value_numints);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" le_cd = %u\n",
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens zlc->l_entry.le_cd);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" le_hash = %llx\n",
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens zlc->l_entry.le_hash);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens break;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens case ZAP_CHUNK_ARRAY:
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling mdb_printf(" %u: array", i);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (strisprint((char *)zlc->l_array.la_array))
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling mdb_printf(" \"%s\"", zlc->l_array.la_array);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling mdb_printf("\n");
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens if (verbose) {
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens int j;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" ");
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens for (j = 0; j < ZAP_LEAF_ARRAY_BYTES; j++) {
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf("%02x ",
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens zlc->l_array.la_array[j]);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens }
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf("\n");
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens }
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens if (zlc->l_array.la_next != CHAIN_END) {
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" lf_next = %u\n",
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens zlc->l_array.la_next);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens }
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens break;
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens default:
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens mdb_printf(" %u: undefined type %u\n",
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens zlc->l_entry.le_type);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens }
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens }
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens return (DCMD_OK);
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens}
3f1f80124f2b2b91c4c06303305e5badae5228e8Matthew Ahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct dbufs_data {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_ctf_id_t id;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t objset;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t object;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t level;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t blkid;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *osname;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} dbufs_data_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens#define DBUFS_UNSET (0xbaddcafedeadbeefULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensdbufs_cb(uintptr_t addr, const void *unknown, void *arg)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens dbufs_data_t *data = arg;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uintptr_t objset;
fa9e4066f08beec538e775443c5be79dd423fcabahrens dmu_buf_t db;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint8_t level;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t blkid;
9adfa60d484ce2435f5af77cc99dcd4e692b6660Matthew Ahrens char osname[ZFS_MAX_DATASET_NAME_LEN];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (GETMEMBID(addr, &data->id, db_objset, objset) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens GETMEMBID(addr, &data->id, db, db) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens GETMEMBID(addr, &data->id, db_level, level) ||
fa9e4066f08beec538e775443c5be79dd423fcabahrens GETMEMBID(addr, &data->id, db_blkid, blkid)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (WALK_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if ((data->objset == DBUFS_UNSET || data->objset == objset) &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens (data->osname == NULL || (objset_name(objset, osname) == 0 &&
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock strcmp(data->osname, 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 mdb_printf("%#lr\n", addr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (WALK_NEXT);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensdbufs(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens dbufs_data_t data;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *object = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *blkid = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens data.objset = data.object = data.level = data.blkid = DBUFS_UNSET;
fa9e4066f08beec538e775443c5be79dd423fcabahrens data.osname = NULL;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_getopts(argc, argv,
fa9e4066f08beec538e775443c5be79dd423fcabahrens 'O', MDB_OPT_UINT64, &data.objset,
fa9e4066f08beec538e775443c5be79dd423fcabahrens 'n', MDB_OPT_STR, &data.osname,
fa9e4066f08beec538e775443c5be79dd423fcabahrens 'o', MDB_OPT_STR, &object,
fa9e4066f08beec538e775443c5be79dd423fcabahrens 'l', MDB_OPT_UINT64, &data.level,
fa9e4066f08beec538e775443c5be79dd423fcabahrens 'b', MDB_OPT_STR, &blkid) != argc) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_USAGE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (object) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strcmp(object, "mdn") == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens data.object = DMU_META_DNODE_OBJECT;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens data.object = mdb_strtoull(object);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (blkid) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (strcmp(blkid, "bonus") == 0) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum data.blkid = DMU_BONUS_BLKID;
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens data.blkid = mdb_strtoull(blkid);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_lookup_by_name(ZFS_STRUCT "dmu_buf_impl", &data.id) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("couldn't find struct dmu_buf_impl_t");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens if (mdb_walk("dmu_buf_impl_t", dbufs_cb, &data) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("can't walk dbufs");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_OK);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct abuf_find_data {
fa9e4066f08beec538e775443c5be79dd423fcabahrens dva_t dva;
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_ctf_id_t id;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} abuf_find_data_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensabuf_find_cb(uintptr_t addr, const void *unknown, void *arg)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens abuf_find_data_t *data = arg;
fa9e4066f08beec538e775443c5be79dd423fcabahrens dva_t dva;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (GETMEMBID(addr, &data->id, b_dva, dva)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (WALK_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (dva.dva_word[0] == data->dva.dva_word[0] &&
fa9e4066f08beec538e775443c5be79dd423fcabahrens dva.dva_word[1] == data->dva.dva_word[1]) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("%#lr\n", addr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (WALK_NEXT);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensabuf_find(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens abuf_find_data_t data;
fa9e4066f08beec538e775443c5be79dd423fcabahrens GElf_Sym sym;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *syms[] = {
a2eea2e101e6a163a537dcc6d4e3c4da2a0ea5b2ahrens "ARC_mru",
a2eea2e101e6a163a537dcc6d4e3c4da2a0ea5b2ahrens "ARC_mru_ghost",
a2eea2e101e6a163a537dcc6d4e3c4da2a0ea5b2ahrens "ARC_mfu",
a2eea2e101e6a163a537dcc6d4e3c4da2a0ea5b2ahrens "ARC_mfu_ghost",
fa9e4066f08beec538e775443c5be79dd423fcabahrens };
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc != 2)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_USAGE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < 2; i ++) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (argv[i].a_type) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case MDB_TYPE_STRING:
fa9e4066f08beec538e775443c5be79dd423fcabahrens data.dva.dva_word[i] = mdb_strtoull(argv[i].a_un.a_str);
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case MDB_TYPE_IMMEDIATE:
fa9e4066f08beec538e775443c5be79dd423fcabahrens data.dva.dva_word[i] = argv[i].a_un.a_val;
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens default:
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_USAGE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_lookup_by_name(ZFS_STRUCT "arc_buf_hdr", &data.id) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("couldn't find struct arc_buf_hdr");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
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 mdb_warn("can't find symbol %s", syms[i]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_pwalk("list", abuf_find_cb, &data, sym.st_value) != 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("can't walk %s", syms[i]);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_OK);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrenstypedef struct dbgmsg_arg {
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens boolean_t da_verbose;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens boolean_t da_address;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens} dbgmsg_arg_t;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling/* ARGSUSED */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingstatic int
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingdbgmsg_cb(uintptr_t addr, const void *unknown, void *arg)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling{
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling static mdb_ctf_id_t id;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling static boolean_t gotid;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling static ulong_t off;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens dbgmsg_arg_t *da = arg;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling time_t timestamp;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling char buf[1024];
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (!gotid) {
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_lookup_by_name(ZFS_STRUCT "zfs_dbgmsg", &id) ==
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens -1) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling mdb_warn("couldn't find struct zfs_dbgmsg");
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling return (WALK_ERR);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling gotid = TRUE;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (mdb_ctf_offsetof(id, "zdm_msg", &off) == -1) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling mdb_warn("couldn't find zdm_msg");
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling return (WALK_ERR);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling off /= 8;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (GETMEMBID(addr, &id, zdm_timestamp, timestamp)) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling return (WALK_ERR);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
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 return (DCMD_ERR);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (da->da_address)
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens mdb_printf("%p ", addr);
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (da->da_verbose)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling mdb_printf("%Y ", timestamp);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling mdb_printf("%s\n", buf);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (da->da_verbose)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling (void) mdb_call_dcmd("whatis", addr, DCMD_ADDRSPEC, 0, NULL);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling return (WALK_NEXT);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling}
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling/* ARGSUSED */
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingstatic int
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Lingdbgmsg(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling{
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling GElf_Sym sym;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens dbgmsg_arg_t da = { 0 };
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling if (mdb_getopts(argc, argv,
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens 'v', MDB_OPT_SETBITS, B_TRUE, &da.da_verbose,
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens 'a', MDB_OPT_SETBITS, B_TRUE, &da.da_address,
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling NULL) != argc)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling return (DCMD_USAGE);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3b2aab18808792cbd248a12f1edf139b89833c13Matthew Ahrens if (mdb_lookup_by_obj(ZFS_OBJ_NAME, "zfs_dbgmsgs", &sym)) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling mdb_warn("can't find zfs_dbgmsgs");
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling return (DCMD_ERR);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_pwalk("list", dbgmsg_cb, &da, sym.st_value) != 0) {
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling mdb_warn("can't walk zfs_dbgmsgs");
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling return (DCMD_ERR);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling }
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling return (DCMD_OK);
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling}
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling
44cb6abc89aa591c23f5e58296c6d2a29302344abmc/*ARGSUSED*/
44cb6abc89aa591c23f5e58296c6d2a29302344abmcstatic int
44cb6abc89aa591c23f5e58296c6d2a29302344abmcarc_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
44cb6abc89aa591c23f5e58296c6d2a29302344abmc{
44cb6abc89aa591c23f5e58296c6d2a29302344abmc kstat_named_t *stats;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc GElf_Sym sym;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens int nstats, i;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc uint_t opt_a = FALSE;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens uint_t opt_b = FALSE;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens uint_t shift = 0;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens const char *suffix;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
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_evictable_metadata", "mru_ghost_size",
4076b1bf41cfd9f968a33ed54a7ae76d9e996fe8Prakash Surya "mru_ghost_evictable_data", "mru_ghost_evictable_metadata",
4076b1bf41cfd9f968a33ed54a7ae76d9e996fe8Prakash Surya "mfu_size", "mfu_evictable_data", "mfu_evictable_metadata",
4076b1bf41cfd9f968a33ed54a7ae76d9e996fe8Prakash Surya "mfu_ghost_size", "mfu_ghost_evictable_data",
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",
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "compressed_size", "uncompressed_size", "overhead_size",
9253d63df408bb48584e0b1abfcc24ef2472382eGeorge Wilson NULL
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens };
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens static const char *extras[] = {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens "arc_no_grow", "arc_tempreserve",
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens NULL
44cb6abc89aa591c23f5e58296c6d2a29302344abmc };
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens if (mdb_lookup_by_obj(ZFS_OBJ_NAME, "arc_stats", &sym) == -1) {
44cb6abc89aa591c23f5e58296c6d2a29302344abmc mdb_warn("failed to find 'arc_stats'");
44cb6abc89aa591c23f5e58296c6d2a29302344abmc return (DCMD_ERR);
44cb6abc89aa591c23f5e58296c6d2a29302344abmc }
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
44cb6abc89aa591c23f5e58296c6d2a29302344abmc stats = mdb_zalloc(sym.st_size, UM_SLEEP | UM_GC);
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
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);
44cb6abc89aa591c23f5e58296c6d2a29302344abmc return (DCMD_ERR);
44cb6abc89aa591c23f5e58296c6d2a29302344abmc }
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
44cb6abc89aa591c23f5e58296c6d2a29302344abmc nstats = sym.st_size / sizeof (kstat_named_t);
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens /* NB: -a / opt_a are ignored for backwards compatability */
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens if (mdb_getopts(argc, argv,
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens 'a', MDB_OPT_SETBITS, TRUE, &opt_a,
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens 'b', MDB_OPT_SETBITS, TRUE, &opt_b,
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens 'k', MDB_OPT_SETBITS, 10, &shift,
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens 'm', MDB_OPT_SETBITS, 20, &shift,
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens 'g', MDB_OPT_SETBITS, 30, &shift,
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens NULL) != argc)
44cb6abc89aa591c23f5e58296c6d2a29302344abmc return (DCMD_USAGE);
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens if (!opt_b && !shift)
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens shift = 20;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens switch (shift) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens case 0:
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens suffix = "B";
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens break;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens case 10:
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens suffix = "KB";
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens break;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens case 20:
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens suffix = "MB";
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens break;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens case 30:
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens suffix = "GB";
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens break;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens default:
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens suffix = "XX";
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens }
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens for (i = 0; i < nstats; i++) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens int j;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens boolean_t bytes = B_FALSE;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens for (j = 0; bytestats[j]; j++) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens if (strcmp(stats[i].name, bytestats[j]) == 0) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens bytes = B_TRUE;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens break;
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens }
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens }
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens if (bytes) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens mdb_printf("%-25s = %9llu %s\n", stats[i].name,
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens stats[i].value.ui64 >> shift, suffix);
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens } else {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens mdb_printf("%-25s = %9llu\n", stats[i].name,
44cb6abc89aa591c23f5e58296c6d2a29302344abmc stats[i].value.ui64);
44cb6abc89aa591c23f5e58296c6d2a29302344abmc }
44cb6abc89aa591c23f5e58296c6d2a29302344abmc }
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens for (i = 0; extras[i]; i++) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens uint64_t buf;
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens if (mdb_lookup_by_obj(ZFS_OBJ_NAME, extras[i], &sym) == -1) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens mdb_warn("failed to find '%s'", extras[i]);
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens return (DCMD_ERR);
44cb6abc89aa591c23f5e58296c6d2a29302344abmc }
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens if (sym.st_size != sizeof (uint64_t) &&
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens sym.st_size != sizeof (uint32_t)) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens mdb_warn("expected scalar for variable '%s'\n",
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens extras[i]);
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens return (DCMD_ERR);
44cb6abc89aa591c23f5e58296c6d2a29302344abmc }
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens if (mdb_vread(&buf, sym.st_size, sym.st_value) == -1) {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens mdb_warn("couldn't read '%s'", extras[i]);
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens return (DCMD_ERR);
44cb6abc89aa591c23f5e58296c6d2a29302344abmc }
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens mdb_printf("%-25s = ", extras[i]);
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens /* NB: all the 64-bit extras happen to be byte counts */
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens if (sym.st_size == sizeof (uint64_t))
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens mdb_printf("%9llu %s\n", buf >> shift, suffix);
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens if (sym.st_size == sizeof (uint32_t))
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens mdb_printf("%9d\n", *((uint32_t *)&buf));
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens }
44cb6abc89aa591c23f5e58296c6d2a29302344abmc return (DCMD_OK);
44cb6abc89aa591c23f5e58296c6d2a29302344abmc}
44cb6abc89aa591c23f5e58296c6d2a29302344abmc
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrenstypedef struct mdb_spa_print {
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens pool_state_t spa_state;
9adfa60d484ce2435f5af77cc99dcd4e692b6660Matthew Ahrens char spa_name[ZFS_MAX_DATASET_NAME_LEN];
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi uintptr_t spa_normal_class;
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens} mdb_spa_print_t;
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Goncziconst char histo_stars[] = "****************************************";
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Goncziconst int histo_width = sizeof (histo_stars) - 1;
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczistatic void
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczidump_histogram(const uint64_t *histo, int size, int offset)
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi{
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi int i;
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi int minidx = size - 1;
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi int maxidx = 0;
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi uint64_t max = 0;
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi for (i = 0; i < size; i++) {
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi if (histo[i] > max)
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi max = histo[i];
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi if (histo[i] > 0 && i > maxidx)
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi maxidx = i;
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi if (histo[i] > 0 && i < minidx)
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi minidx = i;
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi }
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi if (max < histo_width)
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi max = histo_width;
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi for (i = minidx; i <= maxidx; i++) {
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi mdb_printf("%3u: %6llu %s\n",
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi i + offset, (u_longlong_t)histo[i],
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi &histo_stars[(max - histo[i]) * histo_width / max]);
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi }
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi}
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczitypedef struct mdb_metaslab_class {
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi uint64_t mc_histogram[RANGE_TREE_HISTOGRAM_SIZE];
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi} mdb_metaslab_class_t;
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi/*
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi * spa_class_histogram(uintptr_t class_addr)
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi *
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi * Prints free space histogram for a device class
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi *
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi * Returns DCMD_OK, or DCMD_ERR.
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi */
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczistatic int
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczispa_class_histogram(uintptr_t class_addr)
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi{
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi mdb_metaslab_class_t mc;
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi if (mdb_ctf_vread(&mc, "metaslab_class_t",
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi "mdb_metaslab_class_t", class_addr, 0) == -1)
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi return (DCMD_ERR);
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi mdb_inc_indent(4);
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi dump_histogram(mc.mc_histogram, RANGE_TREE_HISTOGRAM_SIZE, 0);
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi mdb_dec_indent(4);
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi return (DCMD_OK);
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi}
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ::spa
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
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 *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print a summarized spa_t. When given no arguments, prints out a table of all
fa9e4066f08beec538e775443c5be79dd423fcabahrens * active pools on the system.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensspa_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *statetab[] = { "ACTIVE", "EXPORTED", "DESTROYED",
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick "SPARE", "L2CACHE", "UNINIT", "UNAVAIL", "POTENTIAL" };
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *state;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson int spa_flags = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_getopts(argc, argv,
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 NULL) != argc)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_USAGE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!(flags & DCMD_ADDRSPEC)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_walk_dcmd("spa", "spa", argc, argv) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("can't walk spa");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_OK);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (flags & DCMD_PIPE_OUT) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("%#lr\n", addr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_OK);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (DCMD_HDRSPEC(flags))
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("%<u>%-?s %9s %-*s%</u>\n", "ADDR", "STATE",
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (uintptr_t) == 4 ? 60 : 52, "NAME");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens mdb_spa_print_t spa;
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens if (mdb_ctf_vread(&spa, "spa_t", "mdb_spa_print_t", addr, 0) == -1)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (spa.spa_state < 0 || spa.spa_state > POOL_STATE_UNAVAIL)
ea8dc4b6d2251b437950c0056bc626b311c73c27eschrock state = "UNKNOWN";
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens state = statetab[spa.spa_state];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
e14bb3258d05c1b1077e2db7cf77088924e56919Jeff Bonwick mdb_printf("%0?p %9s %s\n", addr, state, spa.spa_name);
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi if (spa_flags & SPA_FLAG_HISTOGRAMS)
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi spa_class_histogram(spa.spa_normal_class);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (spa_flags & SPA_FLAG_CONFIG) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_inc_indent(4);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_call_dcmd("spa_config", addr, flags, 0,
fa9e4066f08beec538e775443c5be79dd423fcabahrens NULL) != DCMD_OK)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_dec_indent(4);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (spa_flags & SPA_FLAG_ALL_VDEV) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_arg_t v;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson char opts[100] = "-";
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson int args =
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson (spa_flags | SPA_FLAG_VDEVS) == SPA_FLAG_VDEVS ? 0 : 1;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (spa_flags & SPA_FLAG_ERRORS)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson strcat(opts, "e");
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (spa_flags & SPA_FLAG_METASLABS)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson strcat(opts, "m");
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (spa_flags & SPA_FLAG_METASLAB_GROUPS)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson strcat(opts, "M");
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (spa_flags & SPA_FLAG_HISTOGRAMS)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson strcat(opts, "h");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens v.a_type = MDB_TYPE_STRING;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson v.a_un.a_str = opts;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_inc_indent(4);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (mdb_call_dcmd("spa_vdevs", addr, flags, args,
fa9e4066f08beec538e775443c5be79dd423fcabahrens &v) != DCMD_OK)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_dec_indent(4);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_OK);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrenstypedef struct mdb_spa_config_spa {
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens uintptr_t spa_config;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens} mdb_spa_config_spa_t;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ::spa_config
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
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 */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensspa_print_config(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens mdb_spa_config_spa_t spa;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (argc != 0 || !(flags & DCMD_ADDRSPEC))
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_USAGE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_vread(&spa, ZFS_STRUCT "spa", "mdb_spa_config_spa_t",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens addr, 0) == -1)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (spa.spa_config == 0) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("(none)\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_OK);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens return (mdb_call_dcmd("nvlist", spa.spa_config, flags,
fa9e4066f08beec538e775443c5be79dd423fcabahrens 0, NULL));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsontypedef struct mdb_range_tree {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uint64_t rt_space;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson} mdb_range_tree_t;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsontypedef struct mdb_metaslab_group {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uint64_t mg_fragmentation;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uint64_t mg_histogram[RANGE_TREE_HISTOGRAM_SIZE];
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson uintptr_t mg_vd;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson} mdb_metaslab_group_t;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsontypedef struct mdb_metaslab {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uint64_t ms_id;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uint64_t ms_start;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uint64_t ms_size;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson int64_t ms_deferspace;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uint64_t ms_fragmentation;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson uint64_t ms_weight;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uintptr_t ms_alloctree[TXG_SIZE];
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uintptr_t ms_freetree[TXG_SIZE];
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uintptr_t ms_tree;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uintptr_t ms_sm;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson} mdb_metaslab_t;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsontypedef struct mdb_space_map_phys_t {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uint64_t smp_alloc;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uint64_t smp_histogram[SPACE_MAP_HISTOGRAM_SIZE];
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson} mdb_space_map_phys_t;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsontypedef struct mdb_space_map {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uint64_t sm_size;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uint8_t sm_shift;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uint64_t sm_alloc;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uintptr_t sm_phys;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson} mdb_space_map_t;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsontypedef struct mdb_vdev {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson uintptr_t vdev_path;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uintptr_t vdev_ms;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson uintptr_t vdev_ops;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uint64_t vdev_ms_count;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson uint64_t vdev_id;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson vdev_stat_t vdev_stat;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson} mdb_vdev_t;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilsontypedef struct mdb_vdev_ops {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson char vdev_op_type[16];
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson} mdb_vdev_ops_t;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsonstatic int
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsonmetaslab_stats(uintptr_t addr, int spa_flags)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson{
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_vdev_t vdev;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson uintptr_t *vdev_ms;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (mdb_ctf_vread(&vdev, "vdev_t", "mdb_vdev_t",
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson (uintptr_t)addr, 0) == -1) {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_warn("failed to read vdev at %p\n", addr);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson return (DCMD_ERR);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson }
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_inc_indent(4);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_printf("%<u>%-?s %6s %20s %10s %9s%</u>\n", "ADDR", "ID",
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "OFFSET", "FREE", "FRAGMENTATION");
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson vdev_ms = mdb_alloc(vdev.vdev_ms_count * sizeof (void *),
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson UM_SLEEP | UM_GC);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (mdb_vread(vdev_ms, vdev.vdev_ms_count * sizeof (void *),
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson (uintptr_t)vdev.vdev_ms) == -1) {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_warn("failed to read vdev_ms at %p\n", vdev.vdev_ms);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson return (DCMD_ERR);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson }
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson for (int m = 0; m < vdev.vdev_ms_count; m++) {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_metaslab_t ms;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_space_map_t sm = { 0 };
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson char free[NICENUM_BUFLEN];
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (mdb_ctf_vread(&ms, "metaslab_t", "mdb_metaslab_t",
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson (uintptr_t)vdev_ms[m], 0) == -1)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson return (DCMD_ERR);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (ms.ms_sm != NULL &&
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_ctf_vread(&sm, "space_map_t", "mdb_space_map_t",
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson ms.ms_sm, 0) == -1)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson return (DCMD_ERR);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_nicenum(ms.ms_size - sm.sm_alloc, free);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_printf("%0?p %6llu %20llx %10s ", vdev_ms[m], ms.ms_id,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson ms.ms_start, free);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (ms.ms_fragmentation == ZFS_FRAG_INVALID)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_printf("%9s\n", "-");
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson else
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_printf("%9llu%%\n", ms.ms_fragmentation);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if ((spa_flags & SPA_FLAG_HISTOGRAMS) && ms.ms_sm != NULL) {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_space_map_phys_t smp;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (sm.sm_phys == NULL)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson continue;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson (void) mdb_ctf_vread(&smp, "space_map_phys_t",
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "mdb_space_map_phys_t", sm.sm_phys, 0);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson dump_histogram(smp.smp_histogram,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson SPACE_MAP_HISTOGRAM_SIZE, sm.sm_shift);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson }
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson }
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_dec_indent(4);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson return (DCMD_OK);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson}
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsonstatic int
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsonmetaslab_group_stats(uintptr_t addr, int spa_flags)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson{
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_metaslab_group_t mg;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (mdb_ctf_vread(&mg, "metaslab_group_t", "mdb_metaslab_group_t",
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson (uintptr_t)addr, 0) == -1) {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_warn("failed to read vdev_mg at %p\n", addr);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson return (DCMD_ERR);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson }
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_inc_indent(4);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_printf("%<u>%-?s %15s%</u>\n", "ADDR", "FRAGMENTATION");
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (mg.mg_fragmentation == ZFS_FRAG_INVALID)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_printf("%0?p %15s\n", addr, "-");
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson else
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_printf("%0?p %15llu%%\n", addr, mg.mg_fragmentation);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (spa_flags & SPA_FLAG_HISTOGRAMS)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson dump_histogram(mg.mg_histogram, RANGE_TREE_HISTOGRAM_SIZE, 0);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_dec_indent(4);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson return (DCMD_OK);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson}
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ::vdev
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Print out a summarized vdev_t, in the following form:
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ADDR STATE AUX DESC
fa9e4066f08beec538e775443c5be79dd423fcabahrens * fffffffbcde23df0 HEALTHY - /dev/dsk/c0t0d0
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * If '-r' is specified, recursively visit all children.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * With '-e', the statistics associated with the vdev are printed as well.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilsondo_print_vdev(uintptr_t addr, int flags, int depth, boolean_t recursive,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson int spa_flags)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens vdev_t vdev;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char desc[MAXNAMELEN];
fa9e4066f08beec538e775443c5be79dd423fcabahrens int c, children;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uintptr_t *child;
fa9e4066f08beec538e775443c5be79dd423fcabahrens const char *state, *aux;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
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 return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (flags & DCMD_PIPE_OUT) {
b4952e17e8858d3225793b28788278de9fe6038dGeorge Wilson mdb_printf("%#lr\n", addr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (vdev.vdev_path != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_readstr(desc, sizeof (desc),
fa9e4066f08beec538e775443c5be79dd423fcabahrens (uintptr_t)vdev.vdev_path) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("failed to read vdev_path at %p\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens vdev.vdev_path);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else if (vdev.vdev_ops != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens vdev_ops_t ops;
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_vread(&ops, sizeof (ops),
fa9e4066f08beec538e775443c5be79dd423fcabahrens (uintptr_t)vdev.vdev_ops) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("failed to read vdev_ops at %p\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens vdev.vdev_ops);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strcpy(desc, ops.vdev_op_type);
fa9e4066f08beec538e775443c5be79dd423fcabahrens } else {
fa9e4066f08beec538e775443c5be79dd423fcabahrens (void) strcpy(desc, "<unknown>");
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (depth == 0 && DCMD_HDRSPEC(flags))
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("%<u>%-?s %-9s %-12s %-*s%</u>\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens "ADDR", "STATE", "AUX",
fa9e4066f08beec538e775443c5be79dd423fcabahrens sizeof (uintptr_t) == 4 ? 43 : 35,
fa9e4066f08beec538e775443c5be79dd423fcabahrens "DESCRIPTION");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("%0?p ", addr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (vdev.vdev_state) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_STATE_CLOSED:
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock state = "CLOSED";
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_STATE_OFFLINE:
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock state = "OFFLINE";
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_STATE_CANT_OPEN:
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock state = "CANT_OPEN";
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_STATE_DEGRADED:
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock state = "DEGRADED";
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_STATE_HEALTHY:
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock state = "HEALTHY";
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock break;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case VDEV_STATE_REMOVED:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock state = "REMOVED";
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock break;
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock case VDEV_STATE_FAULTED:
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock state = "FAULTED";
3d7072f8bd27709dba14f6fe336f149d25d9e207eschrock break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens default:
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock state = "UNKNOWN";
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens switch (vdev.vdev_stat.vs_aux) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_AUX_NONE:
fa9e4066f08beec538e775443c5be79dd423fcabahrens aux = "-";
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_AUX_OPEN_FAILED:
fa9e4066f08beec538e775443c5be79dd423fcabahrens aux = "OPEN_FAILED";
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_AUX_CORRUPT_DATA:
fa9e4066f08beec538e775443c5be79dd423fcabahrens aux = "CORRUPT_DATA";
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_AUX_NO_REPLICAS:
fa9e4066f08beec538e775443c5be79dd423fcabahrens aux = "NO_REPLICAS";
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_AUX_BAD_GUID_SUM:
fa9e4066f08beec538e775443c5be79dd423fcabahrens aux = "BAD_GUID_SUM";
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_AUX_TOO_SMALL:
fa9e4066f08beec538e775443c5be79dd423fcabahrens aux = "TOO_SMALL";
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens case VDEV_AUX_BAD_LABEL:
fa9e4066f08beec538e775443c5be79dd423fcabahrens aux = "BAD_LABEL";
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
b87f3af36bb994656da117319f5129ddfd05ed21perrin case VDEV_AUX_VERSION_NEWER:
b87f3af36bb994656da117319f5129ddfd05ed21perrin aux = "VERS_NEWER";
b87f3af36bb994656da117319f5129ddfd05ed21perrin break;
b87f3af36bb994656da117319f5129ddfd05ed21perrin case VDEV_AUX_VERSION_OLDER:
b87f3af36bb994656da117319f5129ddfd05ed21perrin aux = "VERS_OLDER";
b87f3af36bb994656da117319f5129ddfd05ed21perrin break;
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden case VDEV_AUX_UNSUP_FEAT:
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden aux = "UNSUP_FEAT";
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden break;
b87f3af36bb994656da117319f5129ddfd05ed21perrin case VDEV_AUX_SPARED:
b87f3af36bb994656da117319f5129ddfd05ed21perrin aux = "SPARED";
b87f3af36bb994656da117319f5129ddfd05ed21perrin break;
b87f3af36bb994656da117319f5129ddfd05ed21perrin case VDEV_AUX_ERR_EXCEEDED:
b87f3af36bb994656da117319f5129ddfd05ed21perrin aux = "ERR_EXCEEDED";
b87f3af36bb994656da117319f5129ddfd05ed21perrin break;
b87f3af36bb994656da117319f5129ddfd05ed21perrin case VDEV_AUX_IO_FAILURE:
b87f3af36bb994656da117319f5129ddfd05ed21perrin aux = "IO_FAILURE";
b87f3af36bb994656da117319f5129ddfd05ed21perrin break;
b87f3af36bb994656da117319f5129ddfd05ed21perrin case VDEV_AUX_BAD_LOG:
b87f3af36bb994656da117319f5129ddfd05ed21perrin aux = "BAD_LOG";
b87f3af36bb994656da117319f5129ddfd05ed21perrin break;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante case VDEV_AUX_EXTERNAL:
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante aux = "EXTERNAL";
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante break;
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante case VDEV_AUX_SPLIT_POOL:
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante aux = "SPLIT_POOL";
1195e687f1c03c8d57417b5999578922e20a3554Mark J Musante break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens default:
fa9e4066f08beec538e775443c5be79dd423fcabahrens aux = "UNKNOWN";
fa9e4066f08beec538e775443c5be79dd423fcabahrens break;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("%-9s %-12s %*s%s\n", state, aux, depth, "", desc);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (spa_flags & SPA_FLAG_ERRORS) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens vdev_stat_t *vs = &vdev.vdev_stat;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_inc_indent(4);
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("%<u> %12s %12s %12s %12s "
fa9e4066f08beec538e775443c5be79dd423fcabahrens "%12s%</u>\n", "READ", "WRITE", "FREE", "CLAIM",
fa9e4066f08beec538e775443c5be79dd423fcabahrens "IOCTL");
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("OPS ");
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 1; i < ZIO_TYPES; i++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("%11#llx%s", vs->vs_ops[i],
fa9e4066f08beec538e775443c5be79dd423fcabahrens i == ZIO_TYPES - 1 ? "" : " ");
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("BYTES ");
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 1; i < ZIO_TYPES; i++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("%11#llx%s", vs->vs_bytes[i],
fa9e4066f08beec538e775443c5be79dd423fcabahrens i == ZIO_TYPES - 1 ? "" : " ");
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("EREAD %10#llx\n", vs->vs_read_errors);
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("EWRITE %10#llx\n", vs->vs_write_errors);
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("ECKSUM %10#llx\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens vs->vs_checksum_errors);
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_dec_indent(4);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_printf("\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (spa_flags & SPA_FLAG_METASLAB_GROUPS &&
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson vdev.vdev_mg != NULL) {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson metaslab_group_stats((uintptr_t)vdev.vdev_mg,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson spa_flags);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson }
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (spa_flags & SPA_FLAG_METASLABS && vdev.vdev_ms != NULL) {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson metaslab_stats((uintptr_t)addr, spa_flags);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens children = vdev.vdev_children;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (children == 0 || !recursive)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_OK);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens child = mdb_alloc(children * sizeof (void *), UM_SLEEP | UM_GC);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_vread(child, children * sizeof (void *),
fa9e4066f08beec538e775443c5be79dd423fcabahrens (uintptr_t)vdev.vdev_child) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("failed to read vdev children at %p", vdev.vdev_child);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (c = 0; c < children; c++) {
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (do_print_vdev(child[c], flags, depth + 2, recursive,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson spa_flags)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_OK);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensvdev_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock uint64_t depth = 0;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson boolean_t recursive = B_FALSE;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson int spa_flags = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_getopts(argc, 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,
fa9e4066f08beec538e775443c5be79dd423fcabahrens 'r', MDB_OPT_SETBITS, TRUE, &recursive,
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson 'd', MDB_OPT_UINT64, &depth, NULL) != argc)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_USAGE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!(flags & DCMD_ADDRSPEC)) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("no vdev_t address given\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson return (do_print_vdev(addr, flags, (int)depth, recursive, spa_flags));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilsontypedef struct mdb_metaslab_alloc_trace {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson uintptr_t mat_mg;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson uintptr_t mat_msp;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson uint64_t mat_size;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson uint64_t mat_weight;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson uint64_t mat_offset;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson uint32_t mat_dva_id;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson} mdb_metaslab_alloc_trace_t;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilsonstatic void
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilsonmetaslab_print_weight(uint64_t weight)
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson{
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson char buf[100];
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if (WEIGHT_IS_SPACEBASED(weight)) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_nicenum(
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson weight & ~(METASLAB_ACTIVE_MASK | METASLAB_WEIGHT_TYPE),
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson buf);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson } else {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson char size[NICENUM_BUFLEN];
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_nicenum(1ULL << WEIGHT_GET_INDEX(weight), size);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson (void) mdb_snprintf(buf, sizeof (buf), "%llu x %s",
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson WEIGHT_GET_COUNT(weight), size);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson }
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_printf("%11s ", buf);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson}
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson/* ARGSUSED */
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilsonstatic int
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilsonmetaslab_weight(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson{
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson uint64_t weight = 0;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson char active;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if (argc == 0 && (flags & DCMD_ADDRSPEC)) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if (mdb_vread(&weight, sizeof (uint64_t), addr) == -1) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_warn("failed to read weight at %p\n", addr);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson return (DCMD_ERR);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson }
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson } else if (argc == 1 && !(flags & DCMD_ADDRSPEC)) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson weight = (argv[0].a_type == MDB_TYPE_IMMEDIATE) ?
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson argv[0].a_un.a_val : mdb_strtoull(argv[0].a_un.a_str);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson } else {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson return (DCMD_USAGE);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson }
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if (DCMD_HDRSPEC(flags)) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_printf("%<u>%-6s %9s %9s%</u>\n",
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson "ACTIVE", "ALGORITHM", "WEIGHT");
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson }
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if (weight & METASLAB_WEIGHT_PRIMARY)
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson active = 'P';
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson else if (weight & METASLAB_WEIGHT_SECONDARY)
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson active = 'S';
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson else
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson active = '-';
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_printf("%6c %8s ", active,
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson WEIGHT_IS_SPACEBASED(weight) ? "SPACE" : "SEGMENT");
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson metaslab_print_weight(weight);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_printf("\n");
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson return (DCMD_OK);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson}
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson/* ARGSUSED */
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilsonstatic int
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilsonmetaslab_trace(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson{
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_metaslab_alloc_trace_t mat;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_metaslab_group_t mg = { 0 };
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson char result_type[100];
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if (mdb_ctf_vread(&mat, "metaslab_alloc_trace_t",
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson "mdb_metaslab_alloc_trace_t", addr, 0) == -1) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson return (DCMD_ERR);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson }
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if (!(flags & DCMD_PIPE_OUT) && DCMD_HDRSPEC(flags)) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_printf("%<u>%6s %6s %8s %11s %18s %18s%</u>\n",
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson "MSID", "DVA", "ASIZE", "WEIGHT", "RESULT", "VDEV");
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson }
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if (mat.mat_msp != NULL) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_metaslab_t ms;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if (mdb_ctf_vread(&ms, "metaslab_t", "mdb_metaslab_t",
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mat.mat_msp, 0) == -1) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson return (DCMD_ERR);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson }
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_printf("%6llu ", ms.ms_id);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson } else {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_printf("%6s ", "-");
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson }
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_printf("%6d %8llx ", mat.mat_dva_id, mat.mat_size);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson metaslab_print_weight(mat.mat_weight);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if ((int64_t)mat.mat_offset < 0) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if (enum_lookup("enum trace_alloc_type", mat.mat_offset,
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson "TRACE_", sizeof (result_type), result_type) == -1) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_warn("Could not find enum for trace_alloc_type");
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson return (DCMD_ERR);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson }
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_printf("%18s ", result_type);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson } else {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_printf("%<b>%18llx%</b> ", mat.mat_offset);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson }
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if (mat.mat_mg != NULL &&
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_ctf_vread(&mg, "metaslab_group_t", "mdb_metaslab_group_t",
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mat.mat_mg, 0) == -1) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson return (DCMD_ERR);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson }
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if (mg.mg_vd != NULL) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_vdev_t vdev;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson char desc[MAXNAMELEN];
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if (mdb_ctf_vread(&vdev, "vdev_t", "mdb_vdev_t",
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mg.mg_vd, 0) == -1) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson return (DCMD_ERR);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson }
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if (vdev.vdev_path != NULL) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson char path[MAXNAMELEN];
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if (mdb_readstr(path, sizeof (path),
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson vdev.vdev_path) == -1) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_warn("failed to read vdev_path at %p\n",
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson vdev.vdev_path);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson return (DCMD_ERR);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson }
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson char *slash;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if ((slash = strrchr(path, '/')) != NULL) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson strcpy(desc, slash + 1);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson } else {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson strcpy(desc, path);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson }
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson } else if (vdev.vdev_ops != NULL) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_vdev_ops_t ops;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson if (mdb_ctf_vread(&ops, "vdev_ops_t", "mdb_vdev_ops_t",
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson vdev.vdev_ops, 0) == -1) {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_warn("failed to read vdev_ops at %p\n",
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson vdev.vdev_ops);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson return (DCMD_ERR);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson }
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson (void) mdb_snprintf(desc, sizeof (desc),
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson "%s-%llu", ops.vdev_op_type, vdev.vdev_id);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson } else {
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson (void) strcpy(desc, "<unknown>");
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson }
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_printf("%18s\n", desc);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson }
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson return (DCMD_OK);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson}
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrenstypedef struct metaslab_walk_data {
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens uint64_t mw_numvdevs;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens uintptr_t *mw_vdevs;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens int mw_curvdev;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens uint64_t mw_nummss;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens uintptr_t *mw_mss;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens int mw_curms;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens} metaslab_walk_data_t;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensstatic int
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensmetaslab_walk_step(mdb_walk_state_t *wsp)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens metaslab_walk_data_t *mw = wsp->walk_data;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens metaslab_t ms;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens uintptr_t msp;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens if (mw->mw_curvdev >= mw->mw_numvdevs)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens return (WALK_DONE);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens if (mw->mw_mss == NULL) {
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens uintptr_t mssp;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens uintptr_t vdevp;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens ASSERT(mw->mw_curms == 0);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens ASSERT(mw->mw_nummss == 0);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens vdevp = mw->mw_vdevs[mw->mw_curvdev];
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (GETMEMB(vdevp, "vdev", vdev_ms, mssp) ||
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens GETMEMB(vdevp, "vdev", vdev_ms_count, mw->mw_nummss)) {
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens return (WALK_ERR);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens }
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mw->mw_mss = mdb_alloc(mw->mw_nummss * sizeof (void*),
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens UM_SLEEP | UM_GC);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens if (mdb_vread(mw->mw_mss, mw->mw_nummss * sizeof (void*),
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mssp) == -1) {
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mdb_warn("failed to read vdev_ms at %p", mssp);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens return (WALK_ERR);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens }
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens }
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens if (mw->mw_curms >= mw->mw_nummss) {
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mw->mw_mss = NULL;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mw->mw_curms = 0;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mw->mw_nummss = 0;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mw->mw_curvdev++;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens return (WALK_NEXT);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens }
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens msp = mw->mw_mss[mw->mw_curms];
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens if (mdb_vread(&ms, sizeof (metaslab_t), msp) == -1) {
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mdb_warn("failed to read metaslab_t at %p", msp);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens return (WALK_ERR);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens }
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mw->mw_curms++;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens return (wsp->walk_callback(msp, &ms, wsp->walk_cbdata));
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensstatic int
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensmetaslab_walk_init(mdb_walk_state_t *wsp)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens metaslab_walk_data_t *mw;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens uintptr_t root_vdevp;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens uintptr_t childp;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens if (wsp->walk_addr == NULL) {
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mdb_warn("must supply address of spa_t\n");
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens return (WALK_ERR);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens }
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mw = mdb_zalloc(sizeof (metaslab_walk_data_t), UM_SLEEP | UM_GC);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
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 return (DCMD_ERR);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens }
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mw->mw_vdevs = mdb_alloc(mw->mw_numvdevs * sizeof (void *),
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens UM_SLEEP | UM_GC);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens if (mdb_vread(mw->mw_vdevs, mw->mw_numvdevs * sizeof (void *),
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens childp) == -1) {
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mdb_warn("failed to read root vdev children at %p", childp);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens return (DCMD_ERR);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens }
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens wsp->walk_data = mw;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens return (WALK_NEXT);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct mdb_spa {
fa9e4066f08beec538e775443c5be79dd423fcabahrens uintptr_t spa_dsl_pool;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uintptr_t spa_root_vdev;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} mdb_spa_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
2515f5d4dbff605ba645d47a6851d8d0bac5b994Justin T. Gibbstypedef struct mdb_dsl_pool {
2515f5d4dbff605ba645d47a6851d8d0bac5b994Justin T. Gibbs uintptr_t dp_root_dir;
2515f5d4dbff605ba645d47a6851d8d0bac5b994Justin T. Gibbs} mdb_dsl_pool_t;
2515f5d4dbff605ba645d47a6851d8d0bac5b994Justin T. Gibbs
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct mdb_dsl_dir {
2515f5d4dbff605ba645d47a6851d8d0bac5b994Justin T. Gibbs uintptr_t dd_dbuf;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int64_t dd_space_towrite[TXG_SIZE];
fa9e4066f08beec538e775443c5be79dd423fcabahrens} mdb_dsl_dir_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct mdb_dsl_dir_phys {
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t dd_used_bytes;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t dd_compressed_bytes;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uint64_t dd_uncompressed_bytes;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} mdb_dsl_dir_phys_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrenstypedef struct space_data {
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson uint64_t ms_alloctree[TXG_SIZE];
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson uint64_t ms_freetree[TXG_SIZE];
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson uint64_t ms_tree;
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson int64_t ms_deferspace;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens uint64_t avail;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens uint64_t nowavail;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens} space_data_t;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens/* ARGSUSED */
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensstatic int
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrensspace_cb(uintptr_t addr, const void *unknown, void *arg)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens{
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens space_data_t *sd = arg;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mdb_metaslab_t ms;
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson mdb_range_tree_t rt;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson mdb_space_map_t sm = { 0 };
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson mdb_space_map_phys_t smp = { 0 };
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson int i;
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson if (mdb_ctf_vread(&ms, "metaslab_t", "mdb_metaslab_t",
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson addr, 0) == -1)
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson return (WALK_ERR);
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson for (i = 0; i < TXG_SIZE; i++) {
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson if (mdb_ctf_vread(&rt, "range_tree_t",
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson "mdb_range_tree_t", ms.ms_alloctree[i], 0) == -1)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson return (WALK_ERR);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson sd->ms_alloctree[i] += rt.rt_space;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson if (mdb_ctf_vread(&rt, "range_tree_t",
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson "mdb_range_tree_t", ms.ms_freetree[i], 0) == -1)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson return (WALK_ERR);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson sd->ms_freetree[i] += rt.rt_space;
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson }
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson if (mdb_ctf_vread(&rt, "range_tree_t",
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "mdb_range_tree_t", ms.ms_tree, 0) == -1)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson return (WALK_ERR);
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (ms.ms_sm != NULL &&
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson mdb_ctf_vread(&sm, "space_map_t",
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson "mdb_space_map_t", ms.ms_sm, 0) == -1)
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens return (WALK_ERR);
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson if (sm.sm_phys != NULL) {
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson (void) mdb_ctf_vread(&smp, "space_map_phys_t",
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson "mdb_space_map_phys_t", sm.sm_phys, 0);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens }
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson sd->ms_deferspace += ms.ms_deferspace;
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson sd->ms_tree += rt.rt_space;
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson sd->avail += sm.sm_size - sm.sm_alloc;
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson sd->nowavail += sm.sm_size - smp.smp_alloc;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens return (WALK_NEXT);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens}
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ::spa_space [-b]
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
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 */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensspa_space(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_spa_t spa;
2515f5d4dbff605ba645d47a6851d8d0bac5b994Justin T. Gibbs mdb_dsl_pool_t dp;
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_dsl_dir_t dd;
2515f5d4dbff605ba645d47a6851d8d0bac5b994Justin T. Gibbs mdb_dmu_buf_impl_t db;
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_dsl_dir_phys_t dsp;
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens space_data_t sd;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int shift = 20;
fa9e4066f08beec538e775443c5be79dd423fcabahrens char *suffix = "M";
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens int bytes = B_FALSE;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_getopts(argc, argv, 'b', MDB_OPT_SETBITS, TRUE, &bytes, NULL) !=
fa9e4066f08beec538e775443c5be79dd423fcabahrens argc)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_USAGE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!(flags & DCMD_ADDRSPEC))
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_USAGE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (bytes) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens shift = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens suffix = "";
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
2515f5d4dbff605ba645d47a6851d8d0bac5b994Justin T. Gibbs if (mdb_ctf_vread(&spa, ZFS_STRUCT "spa", "mdb_spa_t",
2515f5d4dbff605ba645d47a6851d8d0bac5b994Justin T. Gibbs addr, 0) == -1 ||
2515f5d4dbff605ba645d47a6851d8d0bac5b994Justin T. Gibbs mdb_ctf_vread(&dp, ZFS_STRUCT "dsl_pool", "mdb_dsl_pool_t",
2515f5d4dbff605ba645d47a6851d8d0bac5b994Justin T. Gibbs spa.spa_dsl_pool, 0) == -1 ||
2515f5d4dbff605ba645d47a6851d8d0bac5b994Justin T. Gibbs mdb_ctf_vread(&dd, ZFS_STRUCT "dsl_dir", "mdb_dsl_dir_t",
2515f5d4dbff605ba645d47a6851d8d0bac5b994Justin T. Gibbs dp.dp_root_dir, 0) == -1 ||
2515f5d4dbff605ba645d47a6851d8d0bac5b994Justin T. Gibbs mdb_ctf_vread(&db, ZFS_STRUCT "dmu_buf_impl", "mdb_dmu_buf_impl_t",
2515f5d4dbff605ba645d47a6851d8d0bac5b994Justin T. Gibbs dd.dd_dbuf, 0) == -1 ||
2515f5d4dbff605ba645d47a6851d8d0bac5b994Justin T. Gibbs mdb_ctf_vread(&dsp, ZFS_STRUCT "dsl_dir_phys",
2515f5d4dbff605ba645d47a6851d8d0bac5b994Justin T. Gibbs "mdb_dsl_dir_phys_t", db.db.db_data, 0) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("dd_space_towrite = %llu%s %llu%s %llu%s %llu%s\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens dd.dd_space_towrite[0] >> shift, suffix,
fa9e4066f08beec538e775443c5be79dd423fcabahrens dd.dd_space_towrite[1] >> shift, suffix,
fa9e4066f08beec538e775443c5be79dd423fcabahrens dd.dd_space_towrite[2] >> shift, suffix,
fa9e4066f08beec538e775443c5be79dd423fcabahrens dd.dd_space_towrite[3] >> shift, suffix);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("dd_phys.dd_used_bytes = %llu%s\n",
fa9e4066f08beec538e775443c5be79dd423fcabahrens dsp.dd_used_bytes >> shift, suffix);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mdb_printf("dd_phys.dd_compressed_bytes = %llu%s\n",
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens dsp.dd_compressed_bytes >> shift, suffix);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mdb_printf("dd_phys.dd_uncompressed_bytes = %llu%s\n",
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens dsp.dd_uncompressed_bytes >> shift, suffix);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens bzero(&sd, sizeof (sd));
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens if (mdb_pwalk("metaslab", space_cb, &sd, addr) != 0) {
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mdb_warn("can't walk metaslabs");
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("ms_allocmap = %llu%s %llu%s %llu%s %llu%s\n",
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson sd.ms_alloctree[0] >> shift, suffix,
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson sd.ms_alloctree[1] >> shift, suffix,
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson sd.ms_alloctree[2] >> shift, suffix,
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson sd.ms_alloctree[3] >> shift, suffix);
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_printf("ms_freemap = %llu%s %llu%s %llu%s %llu%s\n",
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson sd.ms_freetree[0] >> shift, suffix,
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson sd.ms_freetree[1] >> shift, suffix,
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson sd.ms_freetree[2] >> shift, suffix,
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson sd.ms_freetree[3] >> shift, suffix);
0713e232b7712cd27d99e1e935ebb8d5de61c57dGeorge Wilson mdb_printf("ms_tree = %llu%s\n", sd.ms_tree >> shift, suffix);
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson mdb_printf("ms_deferspace = %llu%s\n",
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson sd.ms_deferspace >> shift, suffix);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mdb_printf("last synced avail = %llu%s\n", sd.avail >> shift, suffix);
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens mdb_printf("current syncing avail = %llu%s\n",
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens sd.nowavail >> shift, suffix);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_OK);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrenstypedef struct mdb_spa_aux_vdev {
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens int sav_count;
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens uintptr_t sav_vdevs;
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens} mdb_spa_aux_vdev_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrenstypedef struct mdb_spa_vdevs {
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens uintptr_t spa_root_vdev;
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens mdb_spa_aux_vdev_t spa_l2cache;
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens mdb_spa_aux_vdev_t spa_spares;
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens} mdb_spa_vdevs_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrockstatic int
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrensspa_print_aux(mdb_spa_aux_vdev_t *sav, uint_t flags, mdb_arg_t *v,
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock const char *name)
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock{
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock uintptr_t *aux;
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock size_t len;
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock int ret, i;
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock /*
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
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock * vdev.
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock */
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock if (sav->sav_count != 0) {
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock v[1].a_type = MDB_TYPE_STRING;
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock v[1].a_un.a_str = "-d";
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock v[2].a_type = MDB_TYPE_IMMEDIATE;
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock v[2].a_un.a_val = 2;
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock len = sav->sav_count * sizeof (uintptr_t);
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock aux = mdb_alloc(len, UM_SLEEP);
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens if (mdb_vread(aux, len, sav->sav_vdevs) == -1) {
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock mdb_free(aux, len);
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock mdb_warn("failed to read l2cache vdevs at %p",
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock sav->sav_vdevs);
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock return (DCMD_ERR);
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock }
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock mdb_printf("%-?s %-9s %-12s %s\n", "-", "-", "-", name);
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock for (i = 0; i < sav->sav_count; i++) {
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock ret = mdb_call_dcmd("vdev", aux[i], flags, 3, v);
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock if (ret != DCMD_OK) {
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock mdb_free(aux, len);
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock return (ret);
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock }
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock }
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock mdb_free(aux, len);
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock }
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock return (0);
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock}
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ::spa_vdevs
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
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 *
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 */
fa9e4066f08beec538e775443c5be79dd423fcabahrens/* ARGSUSED */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensspa_vdevs(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock mdb_arg_t v[3];
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock int ret;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson char opts[100] = "-r";
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson int spa_flags = 0;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_getopts(argc, 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,
fa9e4066f08beec538e775443c5be79dd423fcabahrens NULL) != argc)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_USAGE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (!(flags & DCMD_ADDRSPEC))
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_USAGE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens mdb_spa_vdevs_t spa;
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens if (mdb_ctf_vread(&spa, "spa_t", "mdb_spa_vdevs_t", addr, 0) == -1)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (DCMD_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock /*
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock * Unitialized spa_t structures can have a NULL root vdev.
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock */
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock if (spa.spa_root_vdev == NULL) {
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock mdb_printf("no associated vdevs\n");
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock return (DCMD_OK);
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock }
088e9d477eee66081e407fbc5a33c4da25f66f6aeschrock
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (spa_flags & SPA_FLAG_ERRORS)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson strcat(opts, "e");
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (spa_flags & SPA_FLAG_METASLABS)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson strcat(opts, "m");
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (spa_flags & SPA_FLAG_METASLAB_GROUPS)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson strcat(opts, "M");
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson if (spa_flags & SPA_FLAG_HISTOGRAMS)
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson strcat(opts, "h");
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock v[0].a_type = MDB_TYPE_STRING;
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson v[0].a_un.a_str = opts;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock ret = mdb_call_dcmd("vdev", (uintptr_t)spa.spa_root_vdev,
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock flags, 1, v);
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock if (ret != DCMD_OK)
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock return (ret);
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock
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)
ec9f632e53cc822267588170e45d89b9dc72153fEric Schrock return (DCMD_ERR);
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock
c5904d138f3bdf0762dbf452a43d5a5c387ea6a8eschrock return (DCMD_OK);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock/*
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * ::zio
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock *
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 *
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens * ADDRESS TYPE STAGE WAITER TIME_ELAPSED
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock *
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * The 'address' column is indented by one space for each depth level as we
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * descend down the tree.
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock */
fac3008cc3156093d29951128c236e1a6c4bc0e8eschrock
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens#define ZIO_MAXINDENT 7
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore#define ZIO_MAXWIDTH (sizeof (uintptr_t) * 2 + ZIO_MAXINDENT)
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore#define ZIO_WALK_SELF 0
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore#define ZIO_WALK_CHILD 1
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore#define ZIO_WALK_PARENT 2
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Mooretypedef struct zio_print_args {
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore int zpa_current_depth;
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore int zpa_min_depth;
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore int zpa_max_depth;
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore int zpa_type;
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore uint_t zpa_flags;
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore} zio_print_args_t;
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrenstypedef struct mdb_zio {
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens enum zio_type io_type;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens enum zio_stage io_stage;
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens uintptr_t io_waiter;
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens uintptr_t io_spa;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens struct {
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens struct {
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens uintptr_t list_next;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens } list_head;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens } io_parent_list;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens int io_error;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens} mdb_zio_t;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrenstypedef struct mdb_zio_timestamp {
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens hrtime_t io_timestamp;
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens} mdb_zio_timestamp_t;
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moorestatic int zio_child_cb(uintptr_t addr, const void *unknown, void *arg);
fac3008cc3156093d29951128c236e1a6c4bc0e8eschrock
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrockstatic int
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrenszio_print_cb(uintptr_t addr, zio_print_args_t *zpa)
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock{
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock mdb_ctf_id_t type_enum, stage_enum;
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore int indent = zpa->zpa_current_depth;
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock const char *type, *stage;
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore uintptr_t laddr;
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens mdb_zio_t zio;
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens mdb_zio_timestamp_t zio_timestamp = { 0 };
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens if (mdb_ctf_vread(&zio, ZFS_STRUCT "zio", "mdb_zio_t", addr, 0) == -1)
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens return (WALK_ERR);
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens (void) mdb_ctf_vread(&zio_timestamp, ZFS_STRUCT "zio",
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens "mdb_zio_timestamp_t", addr, MDB_CTF_VREAD_QUIET);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore if (indent > ZIO_MAXINDENT)
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore indent = ZIO_MAXINDENT;
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
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 mdb_warn("failed to lookup zio enums");
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (WALK_ERR);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock }
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens if ((type = mdb_ctf_enum_name(type_enum, zio.io_type)) != NULL)
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock type += sizeof ("ZIO_TYPE_") - 1;
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock else
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock type = "?";
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens if (zio.io_error == 0) {
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens stage = mdb_ctf_enum_name(stage_enum, zio.io_stage);
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (stage != NULL)
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens stage += sizeof ("ZIO_STAGE_") - 1;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens else
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens stage = "?";
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens } else {
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens stage = "FAILED";
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens }
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore if (zpa->zpa_current_depth >= zpa->zpa_min_depth) {
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore if (zpa->zpa_flags & DCMD_PIPE_OUT) {
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore mdb_printf("%?p\n", addr);
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore } else {
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore mdb_printf("%*s%-*p %-5s %-16s ", indent, "",
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore ZIO_MAXWIDTH - indent, addr, type, stage);
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (zio.io_waiter != 0)
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens mdb_printf("%-16lx ", zio.io_waiter);
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore else
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens mdb_printf("%-16s ", "-");
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens#ifdef _KERNEL
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens if (zio_timestamp.io_timestamp != 0) {
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens mdb_printf("%llums", (mdb_gethrtime() -
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens zio_timestamp.io_timestamp) /
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens 1000000);
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens } else {
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens mdb_printf("%-12s ", "-");
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens }
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens#else
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens mdb_printf("%-12s ", "-");
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens#endif
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens mdb_printf("\n");
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore }
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore }
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore if (zpa->zpa_current_depth >= zpa->zpa_max_depth)
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore return (WALK_NEXT);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore if (zpa->zpa_type == ZIO_WALK_PARENT)
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens laddr = addr + mdb_ctf_offsetof_by_name(ZFS_STRUCT "zio",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens "io_parent_list");
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock else
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens laddr = addr + mdb_ctf_offsetof_by_name(ZFS_STRUCT "zio",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens "io_child_list");
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore zpa->zpa_current_depth++;
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);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (WALK_ERR);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock }
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore zpa->zpa_current_depth--;
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (WALK_NEXT);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock}
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore/* ARGSUSED */
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrockstatic int
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moorezio_child_cb(uintptr_t addr, const void *unknown, void *arg)
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock{
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore zio_link_t zl;
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore uintptr_t ziop;
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore zio_print_args_t *zpa = arg;
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore if (mdb_vread(&zl, sizeof (zl), addr) == -1) {
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore mdb_warn("failed to read zio_link_t at %p", addr);
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore return (WALK_ERR);
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore }
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore if (zpa->zpa_type == ZIO_WALK_PARENT)
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore ziop = (uintptr_t)zl.zl_parent;
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore else
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore ziop = (uintptr_t)zl.zl_child;
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore
69962b5647e4a8b9b14998733b765925381b727eMatthew Ahrens return (zio_print_cb(ziop, zpa));
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore}
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore/* ARGSUSED */
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moorestatic int
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moorezio_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore{
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore zio_print_args_t zpa = { 0 };
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock if (!(flags & DCMD_ADDRSPEC))
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (DCMD_USAGE);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore if (mdb_getopts(argc, 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,
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore NULL) != argc)
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore return (DCMD_USAGE);
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore zpa.zpa_flags = flags;
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore if (zpa.zpa_max_depth != 0) {
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore if (zpa.zpa_type == ZIO_WALK_SELF)
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore zpa.zpa_type = ZIO_WALK_CHILD;
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore } else if (zpa.zpa_type != ZIO_WALK_SELF) {
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore zpa.zpa_min_depth = 1;
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore zpa.zpa_max_depth = 1;
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore }
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore
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");
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens }
fac3008cc3156093d29951128c236e1a6c4bc0e8eschrock
c55e05cb35da47582b7afd38734d2f0d9c6deb40Matthew Ahrens if (zio_print_cb(addr, &zpa) != WALK_NEXT)
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (DCMD_ERR);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (DCMD_OK);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock}
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock/*
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * [addr]::zio_state
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock *
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 */
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock/*ARGSUSED*/
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrockstatic int
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrockzio_state(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock{
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock /*
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 */
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock if (!(flags & DCMD_ADDRSPEC))
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock addr = 0;
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (mdb_pwalk_dcmd("zio_root", "zio", argc, argv, addr));
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock}
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsontypedef struct mdb_multilist {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uint64_t ml_num_sublists;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uintptr_t ml_sublists;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson} mdb_multilist_t;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsontypedef struct multilist_walk_data {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uint64_t mwd_idx;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_multilist_t mwd_ml;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson} multilist_walk_data_t;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson/* ARGSUSED */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsonstatic int
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsonmultilist_print_cb(uintptr_t addr, const void *unknown, void *arg)
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson{
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("%#lr\n", addr);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson return (WALK_NEXT);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson}
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsonstatic int
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsonmultilist_walk_step(mdb_walk_state_t *wsp)
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson{
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson multilist_walk_data_t *mwd = wsp->walk_data;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (mwd->mwd_idx >= mwd->mwd_ml.ml_num_sublists)
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson return (WALK_DONE);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson wsp->walk_addr = mwd->mwd_ml.ml_sublists +
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_ctf_sizeof_by_name("multilist_sublist_t") * mwd->mwd_idx +
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_ctf_offsetof_by_name("multilist_sublist_t", "mls_list");
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_pwalk("list", multilist_print_cb, (void*)NULL, wsp->walk_addr);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mwd->mwd_idx++;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson return (WALK_NEXT);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson}
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsonstatic int
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsonmultilist_walk_init(mdb_walk_state_t *wsp)
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson{
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson multilist_walk_data_t *mwd;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (wsp->walk_addr == NULL) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_warn("must supply address of multilist_t\n");
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson return (WALK_ERR);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mwd = mdb_zalloc(sizeof (multilist_walk_data_t), UM_SLEEP | UM_GC);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (mdb_ctf_vread(&mwd->mwd_ml, "multilist_t", "mdb_multilist_t",
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson wsp->walk_addr, 0) == -1) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson return (WALK_ERR);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (mwd->mwd_ml.ml_num_sublists == 0 ||
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mwd->mwd_ml.ml_sublists == NULL) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_warn("invalid or uninitialized multilist at %#lx\n",
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson wsp->walk_addr);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson return (WALK_ERR);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson wsp->walk_data = mwd;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson return (WALK_NEXT);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson}
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
fa9e4066f08beec538e775443c5be79dd423fcabahrenstypedef struct txg_list_walk_data {
fa9e4066f08beec538e775443c5be79dd423fcabahrens uintptr_t lw_head[TXG_SIZE];
fa9e4066f08beec538e775443c5be79dd423fcabahrens int lw_txgoff;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int lw_maxoff;
fa9e4066f08beec538e775443c5be79dd423fcabahrens size_t lw_offset;
fa9e4066f08beec538e775443c5be79dd423fcabahrens void *lw_obj;
fa9e4066f08beec538e775443c5be79dd423fcabahrens} txg_list_walk_data_t;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrenstxg_list_walk_init_common(mdb_walk_state_t *wsp, int txg, int maxoff)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens txg_list_walk_data_t *lwd;
fa9e4066f08beec538e775443c5be79dd423fcabahrens txg_list_t list;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int i;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
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 return (WALK_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (i = 0; i < TXG_SIZE; i++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens lwd->lw_head[i] = (uintptr_t)list.tl_head[i];
fa9e4066f08beec538e775443c5be79dd423fcabahrens lwd->lw_offset = list.tl_offset;
fa9e4066f08beec538e775443c5be79dd423fcabahrens lwd->lw_obj = mdb_alloc(lwd->lw_offset + sizeof (txg_node_t),
fa9e4066f08beec538e775443c5be79dd423fcabahrens UM_SLEEP | UM_GC);
fa9e4066f08beec538e775443c5be79dd423fcabahrens lwd->lw_txgoff = txg;
fa9e4066f08beec538e775443c5be79dd423fcabahrens lwd->lw_maxoff = maxoff;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens wsp->walk_addr = lwd->lw_head[lwd->lw_txgoff];
fa9e4066f08beec538e775443c5be79dd423fcabahrens wsp->walk_data = lwd;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (WALK_NEXT);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrenstxg_list_walk_init(mdb_walk_state_t *wsp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (txg_list_walk_init_common(wsp, 0, TXG_SIZE-1));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrenstxg_list0_walk_init(mdb_walk_state_t *wsp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (txg_list_walk_init_common(wsp, 0, 0));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrenstxg_list1_walk_init(mdb_walk_state_t *wsp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (txg_list_walk_init_common(wsp, 1, 1));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrenstxg_list2_walk_init(mdb_walk_state_t *wsp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (txg_list_walk_init_common(wsp, 2, 2));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrenstxg_list3_walk_init(mdb_walk_state_t *wsp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (txg_list_walk_init_common(wsp, 3, 3));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrenstxg_list_walk_step(mdb_walk_state_t *wsp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens txg_list_walk_data_t *lwd = wsp->walk_data;
fa9e4066f08beec538e775443c5be79dd423fcabahrens uintptr_t addr;
fa9e4066f08beec538e775443c5be79dd423fcabahrens txg_node_t *node;
fa9e4066f08beec538e775443c5be79dd423fcabahrens int status;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens while (wsp->walk_addr == NULL && lwd->lw_txgoff < lwd->lw_maxoff) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens lwd->lw_txgoff++;
fa9e4066f08beec538e775443c5be79dd423fcabahrens wsp->walk_addr = lwd->lw_head[lwd->lw_txgoff];
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (wsp->walk_addr == NULL)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (WALK_DONE);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens addr = wsp->walk_addr - lwd->lw_offset;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_vread(lwd->lw_obj,
fa9e4066f08beec538e775443c5be79dd423fcabahrens lwd->lw_offset + sizeof (txg_node_t), addr) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("failed to read list element at %#lx", addr);
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (WALK_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
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
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (status);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ::walk spa
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Walk all named spa_t structures in the namespace. This is nothing more than
fa9e4066f08beec538e775443c5be79dd423fcabahrens * a layered avl walk.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensspa_walk_init(mdb_walk_state_t *wsp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens GElf_Sym sym;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (wsp->walk_addr != NULL) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("spa walk only supports global walks\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (WALK_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
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 return (WALK_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens wsp->walk_addr = (uintptr_t)sym.st_value;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens if (mdb_layered_walk("avl", wsp) == -1) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens mdb_warn("failed to walk 'avl'\n");
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (WALK_ERR);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (WALK_NEXT);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic int
fa9e4066f08beec538e775443c5be79dd423fcabahrensspa_walk_step(mdb_walk_state_t *wsp)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
22ce014825a14b6ce90123db2834a13e343d6cafMatthew Ahrens return (wsp->walk_callback(wsp->walk_addr, NULL, wsp->walk_cbdata));
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock/*
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * [addr]::walk zio
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock *
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 */
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrockstatic int
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrockzio_walk_init(mdb_walk_state_t *wsp)
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock{
dee140df5444b21d7034d3c528e68f193f96244cMatthew Ahrens wsp->walk_data = (void *)wsp->walk_addr;
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock if (mdb_layered_walk("zio_cache", wsp) == -1) {
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock mdb_warn("failed to walk 'zio_cache'\n");
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (WALK_ERR);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock }
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (WALK_NEXT);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock}
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrockstatic int
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrockzio_walk_step(mdb_walk_state_t *wsp)
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock{
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens mdb_zio_t zio;
dee140df5444b21d7034d3c528e68f193f96244cMatthew Ahrens uintptr_t spa = (uintptr_t)wsp->walk_data;
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_vread(&zio, ZFS_STRUCT "zio", "mdb_zio_t",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens wsp->walk_addr, 0) == -1)
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (WALK_ERR);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
dee140df5444b21d7034d3c528e68f193f96244cMatthew Ahrens if (spa != 0 && spa != zio.io_spa)
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (WALK_NEXT);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (wsp->walk_callback(wsp->walk_addr, &zio, wsp->walk_cbdata));
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock}
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock/*
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * [addr]::walk zio_root
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock *
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock * Walk only root zio_t structures, optionally for a particular spa_t.
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock */
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrockstatic int
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrockzio_walk_root_step(mdb_walk_state_t *wsp)
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock{
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens mdb_zio_t zio;
dee140df5444b21d7034d3c528e68f193f96244cMatthew Ahrens uintptr_t spa = (uintptr_t)wsp->walk_data;
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_vread(&zio, ZFS_STRUCT "zio", "mdb_zio_t",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens wsp->walk_addr, 0) == -1)
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (WALK_ERR);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
dee140df5444b21d7034d3c528e68f193f96244cMatthew Ahrens if (spa != 0 && spa != zio.io_spa)
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (WALK_NEXT);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore /* If the parent list is not empty, ignore */
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (zio.io_parent_list.list_head.list_next !=
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens wsp->walk_addr +
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 (WALK_NEXT);
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock return (wsp->walk_callback(wsp->walk_addr, &zio, wsp->walk_cbdata));
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock}
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens/*
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens * ::zfs_blkstats
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens *
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson * -v print verbose per-level information
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens *
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens */
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrensstatic int
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrenszfs_blkstats(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens{
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens boolean_t verbose = B_FALSE;
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens zfs_all_blkstats_t stats;
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens dmu_object_type_t t;
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens zfs_blkstat_t *tzb;
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens uint64_t ditto;
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES + 10];
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens /* +10 in case it grew */
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens if (mdb_readvar(&dmu_ot, "dmu_ot") == -1) {
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens mdb_warn("failed to read 'dmu_ot'");
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens return (DCMD_ERR);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens }
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens if (mdb_getopts(argc, argv,
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens 'v', MDB_OPT_SETBITS, TRUE, &verbose,
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens NULL) != argc)
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens return (DCMD_USAGE);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens if (!(flags & DCMD_ADDRSPEC))
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens return (DCMD_USAGE);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
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.");
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens return (DCMD_ERR);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens }
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden tzb = &stats.zab_type[DN_MAX_LEVELS][DMU_OT_TOTAL];
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens if (tzb->zb_gangs != 0) {
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens mdb_printf("Ganged blocks: %llu\n",
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens (longlong_t)tzb->zb_gangs);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens }
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens ditto = tzb->zb_ditto_2_of_2_samevdev + tzb->zb_ditto_2_of_3_samevdev +
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens tzb->zb_ditto_3_of_3_samevdev;
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens if (ditto != 0) {
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens mdb_printf("Dittoed blocks on same vdev: %llu\n",
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens (longlong_t)ditto);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens }
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens mdb_printf("\nBlocks\tLSIZE\tPSIZE\tASIZE"
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens "\t avg\t comp\t%%Total\tType\n");
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
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 avg[NICENUM_BUFLEN];
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens char comp[NICENUM_BUFLEN], pct[NICENUM_BUFLEN];
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens char typename[64];
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens int l;
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens if (t == DMU_OT_DEFERRED)
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens strcpy(typename, "deferred free");
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden else if (t == DMU_OT_OTHER)
ad135b5d644628e791c3188a6ecbd9c257961ef8Christopher Siden strcpy(typename, "other");
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens else if (t == DMU_OT_TOTAL)
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens strcpy(typename, "Total");
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens else if (mdb_readstr(typename, sizeof (typename),
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens (uintptr_t)dmu_ot[t].ot_name) == -1) {
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens mdb_warn("failed to read type name");
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens return (DCMD_ERR);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens }
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens if (stats.zab_type[DN_MAX_LEVELS][t].zb_asize == 0)
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens continue;
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens for (l = -1; l < DN_MAX_LEVELS; l++) {
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens int level = (l == -1 ? DN_MAX_LEVELS : l);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens zfs_blkstat_t *zb = &stats.zab_type[level][t];
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens if (zb->zb_asize == 0)
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens continue;
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens /*
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens * Don't print each level unless requested.
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens */
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens if (!verbose && level != DN_MAX_LEVELS)
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens continue;
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens /*
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens * If all the space is level 0, don't print the
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens * level 0 separately.
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens */
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens if (level == 0 && zb->zb_asize ==
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens stats.zab_type[DN_MAX_LEVELS][t].zb_asize)
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens continue;
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens mdb_nicenum(zb->zb_count, csize);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens mdb_nicenum(zb->zb_lsize, lsize);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens mdb_nicenum(zb->zb_psize, psize);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens mdb_nicenum(zb->zb_asize, asize);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens mdb_nicenum(zb->zb_asize / zb->zb_count, avg);
ff64c0f7947882a0dbee45c31d69cb30bd003e5fMatthew Ahrens (void) snprintfrac(comp, NICENUM_BUFLEN,
ff64c0f7947882a0dbee45c31d69cb30bd003e5fMatthew Ahrens zb->zb_lsize, zb->zb_psize, 2);
ff64c0f7947882a0dbee45c31d69cb30bd003e5fMatthew Ahrens (void) snprintfrac(pct, NICENUM_BUFLEN,
ff64c0f7947882a0dbee45c31d69cb30bd003e5fMatthew Ahrens 100 * zb->zb_asize, tzb->zb_asize, 2);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens mdb_printf("%6s\t%5s\t%5s\t%5s\t%5s"
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens "\t%5s\t%6s\t",
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens csize, lsize, psize, asize, avg, comp, pct);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens if (level == DN_MAX_LEVELS)
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens mdb_printf("%s\n", typename);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens else
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens mdb_printf(" L%d %s\n",
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens level, typename);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens }
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens }
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens return (DCMD_OK);
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens}
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrenstypedef struct mdb_reference {
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens uintptr_t ref_holder;
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens uintptr_t ref_removed;
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens uint64_t ref_number;
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens} mdb_reference_t;
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens/* ARGSUSED */
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrensstatic int
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrensreference_cb(uintptr_t addr, const void *ignored, void *arg)
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens{
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens mdb_reference_t ref;
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling boolean_t holder_is_str = B_FALSE;
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens char holder_str[128];
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens boolean_t removed = (boolean_t)arg;
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (mdb_ctf_vread(&ref, "reference_t", "mdb_reference_t", addr,
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens 0) == -1)
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens return (DCMD_ERR);
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (mdb_readstr(holder_str, sizeof (holder_str),
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens ref.ref_holder) != -1)
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling holder_is_str = strisprint(holder_str);
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens if (removed)
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens mdb_printf("removed ");
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens mdb_printf("reference ");
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (ref.ref_number != 1)
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens mdb_printf("with count=%llu ", ref.ref_number);
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens mdb_printf("with tag %lx", ref.ref_holder);
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens if (holder_is_str)
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens mdb_printf(" \"%s\"", holder_str);
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens mdb_printf(", held at:\n");
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens (void) mdb_call_dcmd("whatis", addr, DCMD_ADDRSPEC, 0, NULL);
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens if (removed) {
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens mdb_printf("removed at:\n");
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens (void) mdb_call_dcmd("whatis", ref.ref_removed,
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens DCMD_ADDRSPEC, 0, NULL);
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens }
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens mdb_printf("\n");
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens return (WALK_NEXT);
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens}
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrenstypedef struct mdb_refcount {
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens uint64_t rc_count;
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens} mdb_refcount_t;
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrenstypedef struct mdb_refcount_removed {
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens uint64_t rc_removed_count;
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens} mdb_refcount_removed_t;
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrenstypedef struct mdb_refcount_tracked {
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens boolean_t rc_tracked;
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens} mdb_refcount_tracked_t;
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens/* ARGSUSED */
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrensstatic int
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrensrefcount(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens{
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens mdb_refcount_t rc;
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens mdb_refcount_removed_t rcr;
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens mdb_refcount_tracked_t rct;
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens int off;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens boolean_t released = B_FALSE;
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens if (!(flags & DCMD_ADDRSPEC))
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens return (DCMD_USAGE);
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_getopts(argc, argv,
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens 'r', MDB_OPT_SETBITS, B_TRUE, &released,
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens NULL) != argc)
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens return (DCMD_USAGE);
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (mdb_ctf_vread(&rc, "refcount_t", "mdb_refcount_t", addr,
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens 0) == -1)
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens return (DCMD_ERR);
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (mdb_ctf_vread(&rcr, "refcount_t", "mdb_refcount_removed_t", addr,
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens MDB_CTF_VREAD_QUIET) == -1) {
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens mdb_printf("refcount_t at %p has %llu holds (untracked)\n",
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens addr, (longlong_t)rc.rc_count);
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens return (DCMD_OK);
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens }
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (mdb_ctf_vread(&rct, "refcount_t", "mdb_refcount_tracked_t", addr,
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens MDB_CTF_VREAD_QUIET) == -1) {
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens /* If this is an old target, it might be tracked. */
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens rct.rc_tracked = B_TRUE;
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens }
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens
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);
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (rct.rc_tracked && rc.rc_count > 0)
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens mdb_printf("current holds:\n");
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens off = mdb_ctf_offsetof_by_name("refcount_t", "rc_list");
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (off == -1)
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens return (DCMD_ERR);
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens mdb_pwalk("list", reference_cb, (void*)B_FALSE, addr + off);
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (released && rcr.rc_removed_count > 0) {
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens mdb_printf("released holds:\n");
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens off = mdb_ctf_offsetof_by_name("refcount_t", "rc_removed");
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (off == -1)
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens return (DCMD_ERR);
421ff02063e68ff03db7d5169c62e3f94927000fPrakash Surya mdb_pwalk("list", reference_cb, (void*)B_TRUE, addr + off);
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens }
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens return (DCMD_OK);
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens}
9966ca11f4a1481acce85f690fa59e4084050627Matthew Ahrens
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumstatic int
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumsa_attr_table(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum{
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum sa_attr_table_t *table;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum sa_os_t sa_os;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum char *name;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum int i;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
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 return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum table = mdb_alloc(sizeof (sa_attr_table_t) * sa_os.sa_num_attrs,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum UM_SLEEP | UM_GC);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum name = mdb_alloc(MAXPATHLEN, UM_SLEEP | UM_GC);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_vread(table, sizeof (sa_attr_table_t) * sa_os.sa_num_attrs,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum (uintptr_t)sa_os.sa_attr_table) == -1) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("failed to read sa_os at %p", addr);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
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 mdb_printf("%5x %8x %8x %8x %-s\n",
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 Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_OK);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum}
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumstatic int
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumsa_get_off_table(uintptr_t addr, uint32_t **off_tab, int attr_count)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum{
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum uintptr_t idx_table;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
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 return (-1);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum *off_tab = mdb_alloc(attr_count * sizeof (uint32_t),
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum UM_SLEEP | UM_GC);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_vread(*off_tab,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum attr_count * sizeof (uint32_t), idx_table) == -1) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("failed to attribute offset table %p", idx_table);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (-1);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_OK);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum}
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/*ARGSUSED*/
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumstatic int
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumsa_attr_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum{
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum uint32_t *offset_tab;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum int attr_count;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum uint64_t attr_id;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum uintptr_t attr_addr;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum uintptr_t bonus_tab, spill_tab;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum uintptr_t db_bonus, db_spill;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum uintptr_t os, os_sa;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum uintptr_t db_data;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (argc != 1)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_USAGE);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (argv[0].a_type == MDB_TYPE_STRING)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum attr_id = mdb_strtoull(argv[0].a_un.a_str);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_USAGE);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
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_os, os) ||
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 return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (GETMEMB(os, "objset", os_sa, os_sa)) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("Can't find os_sa in objset\n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (GETMEMB(os_sa, "sa_os", sa_num_attrs, attr_count)) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("Can't find sa_num_attrs\n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (attr_id > attr_count) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("attribute id number is out of range\n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (bonus_tab) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (sa_get_off_table(bonus_tab, &offset_tab,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum attr_count) == -1) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
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 return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (bonus_tab && !TOC_ATTR_PRESENT(offset_tab[attr_id]) &&
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum spill_tab == NULL) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("Attribute does not exist\n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum } else if (!TOC_ATTR_PRESENT(offset_tab[attr_id]) && spill_tab) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (sa_get_off_table(spill_tab, &offset_tab,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum attr_count) == -1) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
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 return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (!TOC_ATTR_PRESENT(offset_tab[attr_id])) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("Attribute does not exist\n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum attr_addr = db_data + TOC_OFF(offset_tab[attr_id]);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("%p\n", attr_addr);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_OK);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum}
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumstatic int
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 uint16_t ace_type, int verbose)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum{
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (DCMD_HDRSPEC(flags) && !verbose)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("%<u>%-?s %-8s %-8s %-8s %s%</u>\n",
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum "ADDR", "FLAGS", "MASK", "TYPE", "ID");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (!verbose) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("%0?p %-8x %-8x %-8x %-llx\n", addr,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum ace_flags, access_mask, ace_type, id);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_OK);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum switch (ace_flags & ACE_TYPE_FLAGS) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case ACE_OWNER:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("owner@:");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum break;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case (ACE_IDENTIFIER_GROUP | ACE_GROUP):
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("group@:");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum break;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case ACE_EVERYONE:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("everyone@:");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum break;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case ACE_IDENTIFIER_GROUP:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("group:%llx:", (u_longlong_t)id);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum break;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case 0: /* User entry */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("user:%llx:", (u_longlong_t)id);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum break;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum /* print out permission mask */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (access_mask & ACE_READ_DATA)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("r");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (access_mask & ACE_WRITE_DATA)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("w");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (access_mask & ACE_EXECUTE)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("x");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (access_mask & ACE_APPEND_DATA)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("p");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (access_mask & ACE_DELETE)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("d");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (access_mask & ACE_DELETE_CHILD)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("D");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (access_mask & ACE_READ_ATTRIBUTES)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("a");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (access_mask & ACE_WRITE_ATTRIBUTES)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("A");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (access_mask & ACE_READ_NAMED_ATTRS)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("R");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (access_mask & ACE_WRITE_NAMED_ATTRS)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("W");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (access_mask & ACE_READ_ACL)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("c");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (access_mask & ACE_WRITE_ACL)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("C");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (access_mask & ACE_WRITE_OWNER)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("o");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (access_mask & ACE_SYNCHRONIZE)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("s");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf(":");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum /* Print out inheritance flags */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (ace_flags & ACE_FILE_INHERIT_ACE)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("f");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (ace_flags & ACE_DIRECTORY_INHERIT_ACE)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("d");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (ace_flags & ACE_INHERIT_ONLY_ACE)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("i");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (ace_flags & ACE_NO_PROPAGATE_INHERIT_ACE)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (ace_flags & ACE_SUCCESSFUL_ACCESS_ACE_FLAG)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("S");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (ace_flags & ACE_FAILED_ACCESS_ACE_FLAG)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("F");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (ace_flags & ACE_INHERITED_ACE)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("I");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf("-");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum switch (ace_type) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case ACE_ACCESS_ALLOWED_ACE_TYPE:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf(":allow\n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum break;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case ACE_ACCESS_DENIED_ACE_TYPE:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf(":deny\n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum break;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case ACE_SYSTEM_AUDIT_ACE_TYPE:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf(":audit\n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum break;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case ACE_SYSTEM_ALARM_ACE_TYPE:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf(":alarm\n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum break;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum default:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_printf(":?\n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_OK);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum}
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumstatic int
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_ace_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum{
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum zfs_ace_t zace;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum int verbose = FALSE;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum uint64_t id;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (!(flags & DCMD_ADDRSPEC))
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_USAGE);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_getopts(argc, argv,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum 'v', MDB_OPT_SETBITS, TRUE, &verbose, TRUE, NULL) != argc)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_USAGE);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_vread(&zace, sizeof (zfs_ace_t), addr) == -1) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("failed to read zfs_ace_t");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
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 id = zace.z_fuid;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum id = -1;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
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}
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumstatic int
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_ace0_print(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum{
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum ace_t ace;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum uint64_t id;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum int verbose = FALSE;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (!(flags & DCMD_ADDRSPEC))
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_USAGE);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_getopts(argc, argv,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum 'v', MDB_OPT_SETBITS, TRUE, &verbose, TRUE, NULL) != argc)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_USAGE);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_vread(&ace, sizeof (ace_t), addr) == -1) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("failed to read ace_t");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if ((ace.a_flags & ACE_TYPE_FLAGS) == 0 ||
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum (ace.a_flags & ACE_TYPE_FLAGS) == ACE_IDENTIFIER_GROUP)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum id = ace.a_who;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum else
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum id = -1;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (zfs_ace_print_common(addr, flags, id, ace.a_access_mask,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum ace.a_flags, ace.a_type, verbose));
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum}
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumtypedef struct acl_dump_args {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum int a_argc;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum const mdb_arg_t *a_argv;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum uint16_t a_version;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum int a_flags;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum} acl_dump_args_t;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumstatic int
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumacl_aces_cb(uintptr_t addr, const void *unknown, void *arg)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum{
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum acl_dump_args_t *acl_args = (acl_dump_args_t *)arg;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (acl_args->a_version == 1) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_call_dcmd("zfs_ace", addr,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum DCMD_ADDRSPEC|acl_args->a_flags, acl_args->a_argc,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum acl_args->a_argv) != DCMD_OK) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (WALK_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum } else {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_call_dcmd("zfs_ace0", addr,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum DCMD_ADDRSPEC|acl_args->a_flags, acl_args->a_argc,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum acl_args->a_argv) != DCMD_OK) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (WALK_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum acl_args->a_flags = DCMD_LOOP;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (WALK_NEXT);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum}
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumstatic int
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumacl_cb(uintptr_t addr, const void *unknown, void *arg)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum{
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum acl_dump_args_t *acl_args = (acl_dump_args_t *)arg;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (acl_args->a_version == 1) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_pwalk("zfs_acl_node_aces", acl_aces_cb,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum arg, addr) != 0) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("can't walk ACEs");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum } else {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_pwalk("zfs_acl_node_aces0", acl_aces_cb,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum arg, addr) != 0) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("can't walk ACEs");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (WALK_NEXT);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum}
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumstatic int
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_acl_dump(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum{
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum zfs_acl_t zacl;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum int verbose = FALSE;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum acl_dump_args_t acl_args;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (!(flags & DCMD_ADDRSPEC))
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_USAGE);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_getopts(argc, argv,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum 'v', MDB_OPT_SETBITS, TRUE, &verbose, TRUE, NULL) != argc)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_USAGE);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_vread(&zacl, sizeof (zfs_acl_t), addr) == -1) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("failed to read zfs_acl_t");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum acl_args.a_argc = argc;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum acl_args.a_argv = argv;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum acl_args.a_version = zacl.z_version;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum acl_args.a_flags = DCMD_LOOPFIRST;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_pwalk("zfs_acl_node", acl_cb, &acl_args, addr) != 0) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("can't walk ACL");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_OK);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum}
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumstatic int
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_acl_node_walk_init(mdb_walk_state_t *wsp)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum{
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (wsp->walk_addr == NULL) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("must supply address of zfs_acl_node_t\n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (WALK_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens wsp->walk_addr +=
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens mdb_ctf_offsetof_by_name(ZFS_STRUCT "zfs_acl", "z_acl");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_layered_walk("list", wsp) == -1) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("failed to walk 'list'\n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (WALK_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (WALK_NEXT);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum}
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumstatic int
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_acl_node_walk_step(mdb_walk_state_t *wsp)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum{
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum zfs_acl_node_t aclnode;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_vread(&aclnode, sizeof (zfs_acl_node_t),
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum wsp->walk_addr) == -1) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("failed to read zfs_acl_node at %p", wsp->walk_addr);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (WALK_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (wsp->walk_callback(wsp->walk_addr, &aclnode, wsp->walk_cbdata));
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum}
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumtypedef struct ace_walk_data {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum int ace_count;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum int ace_version;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum} ace_walk_data_t;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumstatic int
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_aces_walk_init_common(mdb_walk_state_t *wsp, int version,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum int ace_count, uintptr_t ace_data)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum{
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum ace_walk_data_t *ace_walk_data;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (wsp->walk_addr == NULL) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("must supply address of zfs_acl_node_t\n");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (WALK_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum ace_walk_data = mdb_alloc(sizeof (ace_walk_data_t), UM_SLEEP | UM_GC);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum ace_walk_data->ace_count = ace_count;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum ace_walk_data->ace_version = version;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum wsp->walk_addr = ace_data;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum wsp->walk_data = ace_walk_data;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (WALK_NEXT);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum}
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumstatic int
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_acl_node_aces_walk_init_common(mdb_walk_state_t *wsp, int version)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum{
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum static int gotid;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum static mdb_ctf_id_t acl_id;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum int z_ace_count;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum uintptr_t z_acldata;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (!gotid) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (mdb_ctf_lookup_by_name("struct zfs_acl_node",
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum &acl_id) == -1) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum mdb_warn("couldn't find struct zfs_acl_node");
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum gotid = TRUE;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (GETMEMBID(wsp->walk_addr, &acl_id, z_ace_count, z_ace_count)) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (GETMEMBID(wsp->walk_addr, &acl_id, z_acldata, z_acldata)) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (DCMD_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (zfs_aces_walk_init_common(wsp, version,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum z_ace_count, z_acldata));
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum}
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumstatic int
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_acl_node_aces_walk_init(mdb_walk_state_t *wsp)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum{
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (zfs_acl_node_aces_walk_init_common(wsp, 1));
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum}
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum/* ARGSUSED */
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumstatic int
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_acl_node_aces0_walk_init(mdb_walk_state_t *wsp)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum{
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (zfs_acl_node_aces_walk_init_common(wsp, 0));
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum}
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumstatic int
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaumzfs_aces_walk_step(mdb_walk_state_t *wsp)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum{
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum ace_walk_data_t *ace_data = wsp->walk_data;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum zfs_ace_t zace;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum ace_t *acep;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum int status;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum int entry_type;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum int allow_type;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum uintptr_t ptr;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum if (ace_data->ace_count == 0)
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (WALK_DONE);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
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 wsp->walk_addr);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (WALK_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum switch (ace_data->ace_version) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case 0:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum acep = (ace_t *)&zace;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum entry_type = acep->a_flags & ACE_TYPE_FLAGS;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum allow_type = acep->a_type;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum break;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case 1:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum entry_type = zace.z_hdr.z_flags & ACE_TYPE_FLAGS;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum allow_type = zace.z_hdr.z_type;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum break;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum default:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (WALK_ERR);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum ptr = (uintptr_t)wsp->walk_addr;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum switch (entry_type) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case ACE_OWNER:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case ACE_EVERYONE:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case (ACE_IDENTIFIER_GROUP | ACE_GROUP):
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum ptr += ace_data->ace_version == 0 ?
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum sizeof (ace_t) : sizeof (zfs_ace_hdr_t);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum break;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case ACE_IDENTIFIER_GROUP:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum default:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum switch (allow_type) {
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case ACE_ACCESS_ALLOWED_OBJECT_ACE_TYPE:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case ACE_ACCESS_DENIED_OBJECT_ACE_TYPE:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case ACE_SYSTEM_AUDIT_OBJECT_ACE_TYPE:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum case ACE_SYSTEM_ALARM_OBJECT_ACE_TYPE:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum ptr += ace_data->ace_version == 0 ?
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum sizeof (ace_t) : sizeof (zfs_object_ace_t);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum break;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum default:
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum ptr += ace_data->ace_version == 0 ?
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum sizeof (ace_t) : sizeof (zfs_ace_t);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum break;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum }
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum ace_data->ace_count--;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum status = wsp->walk_callback(wsp->walk_addr,
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum (void *)(uintptr_t)&zace, wsp->walk_cbdata);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum wsp->walk_addr = ptr;
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum return (status);
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum}
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrenstypedef struct mdb_zfs_rrwlock {
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens uintptr_t rr_writer;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens boolean_t rr_writer_wanted;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens} mdb_zfs_rrwlock_t;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrensstatic uint_t rrw_key;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens/* ARGSUSED */
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrensstatic int
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrensrrwlock(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens{
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens mdb_zfs_rrwlock_t rrw;
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (rrw_key == 0) {
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_readsym(&rrw_key, "uint_t", "rrw_tsd_key", 0) == -1)
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens return (DCMD_ERR);
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens }
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (mdb_ctf_vread(&rrw, "rrwlock_t", "mdb_zfs_rrwlock_t", addr,
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens 0) == -1)
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens return (DCMD_ERR);
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens if (rrw.rr_writer != 0) {
d5ee8a1311accef11ec2057f70da38d1dd687088Matthew Ahrens mdb_printf("write lock held by thread %lx\n", rrw.rr_writer);
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens return (DCMD_OK);
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens }
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens if (rrw.rr_writer_wanted) {
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens mdb_printf("writer wanted\n");
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens }
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens mdb_printf("anonymous references:\n");
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens (void) mdb_call_dcmd("refcount", addr +
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens mdb_ctf_offsetof_by_name(ZFS_STRUCT "rrwlock", "rr_anon_rcount"),
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens DCMD_ADDRSPEC, 0, NULL);
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens mdb_printf("linked references:\n");
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens (void) mdb_call_dcmd("refcount", addr +
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens mdb_ctf_offsetof_by_name(ZFS_STRUCT "rrwlock", "rr_linked_rcount"),
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens DCMD_ADDRSPEC, 0, NULL);
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens /*
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.
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens */
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens return (DCMD_OK);
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens}
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsontypedef struct mdb_arc_buf_hdr_t {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uint16_t b_psize;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uint16_t b_lsize;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson struct {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uint32_t b_bufcnt;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uintptr_t b_state;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uintptr_t b_pdata;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson } b_l1hdr;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson} mdb_arc_buf_hdr_t;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsonenum arc_cflags {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson ARC_CFLAG_VERBOSE = 1 << 0,
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson ARC_CFLAG_ANON = 1 << 1,
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson ARC_CFLAG_MRU = 1 << 2,
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson ARC_CFLAG_MFU = 1 << 3,
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson ARC_CFLAG_BUFS = 1 << 4,
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson};
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsontypedef struct arc_compression_stats_data {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson GElf_Sym anon_sym; /* ARC_anon symbol */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson GElf_Sym mru_sym; /* ARC_mru symbol */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson GElf_Sym mrug_sym; /* ARC_mru_ghost symbol */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson GElf_Sym mfu_sym; /* ARC_mfu symbol */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson GElf_Sym mfug_sym; /* ARC_mfu_ghost symbol */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson GElf_Sym l2c_sym; /* ARC_l2c_only symbol */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uint64_t *anon_c_hist; /* histogram of compressed sizes in anon */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uint64_t *anon_u_hist; /* histogram of uncompressed sizes in anon */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uint64_t *anon_bufs; /* histogram of buffer counts in anon state */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uint64_t *mru_c_hist; /* histogram of compressed sizes in mru */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uint64_t *mru_u_hist; /* histogram of uncompressed sizes in mru */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uint64_t *mru_bufs; /* histogram of buffer counts in mru */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uint64_t *mfu_c_hist; /* histogram of compressed sizes in mfu */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uint64_t *mfu_u_hist; /* histogram of uncompressed sizes in mfu */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uint64_t *mfu_bufs; /* histogram of buffer counts in mfu */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uint64_t *all_c_hist; /* histogram of compressed anon + mru + mfu */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uint64_t *all_u_hist; /* histogram of uncompressed anon + mru + mfu */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson uint64_t *all_bufs; /* histogram of buffer counts in all states */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson int arc_cflags; /* arc compression flags, specified by user */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson int hist_nbuckets; /* number of buckets in each histogram */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson} arc_compression_stats_data_t;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsonint
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsonhighbit64(uint64_t i)
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson{
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson int h = 1;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (i == 0)
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson return (0);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (i & 0xffffffff00000000ULL) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson h += 32; i >>= 32;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (i & 0xffff0000) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson h += 16; i >>= 16;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (i & 0xff00) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson h += 8; i >>= 8;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (i & 0xf0) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson h += 4; i >>= 4;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (i & 0xc) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson h += 2; i >>= 2;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (i & 0x2) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson h += 1;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson return (h);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson}
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson/* ARGSUSED */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsonstatic int
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsonarc_compression_stats_cb(uintptr_t addr, const void *unknown, void *arg)
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson{
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson arc_compression_stats_data_t *data = arg;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_arc_buf_hdr_t hdr;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson int cbucket, ubucket, bufcnt;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (mdb_ctf_vread(&hdr, "arc_buf_hdr_t", "mdb_arc_buf_hdr_t",
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson addr, 0) == -1) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson return (WALK_ERR);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson /*
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * Headers in the ghost states, or the l2c_only state don't have
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * arc buffers linked off of them. Thus, their compressed size
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * is meaningless, so we skip these from the stats.
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (hdr.b_l1hdr.b_state == data->mrug_sym.st_value ||
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson hdr.b_l1hdr.b_state == data->mfug_sym.st_value ||
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson hdr.b_l1hdr.b_state == data->l2c_sym.st_value) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson return (WALK_NEXT);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson /*
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * The physical size (compressed) and logical size
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * (uncompressed) are in units of SPA_MINBLOCKSIZE. By default,
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * we use the log2 of this value (rounded down to the nearest
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * integer) to determine the bucket to assign this header to.
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * Thus, the histogram is logarithmic with respect to the size
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * of the header. For example, the following is a mapping of the
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * bucket numbers and the range of header sizes they correspond to:
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson *
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * 0: 0 byte headers
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * 1: 512 byte headers
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * 2: [1024 - 2048) byte headers
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * 3: [2048 - 4096) byte headers
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * 4: [4096 - 8192) byte headers
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * 5: [8192 - 16394) byte headers
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * 6: [16384 - 32768) byte headers
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * 7: [32768 - 65536) byte headers
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * 8: [65536 - 131072) byte headers
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * 9: 131072 byte headers
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson *
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * If the ARC_CFLAG_VERBOSE flag was specified, we use the
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * physical and logical sizes directly. Thus, the histogram will
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * no longer be logarithmic; instead it will be linear with
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * respect to the size of the header. The following is a mapping
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * of the first many bucket numbers and the header size they
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * correspond to:
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson *
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * 0: 0 byte headers
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * 1: 512 byte headers
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * 2: 1024 byte headers
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * 3: 1536 byte headers
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * 4: 2048 byte headers
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * 5: 2560 byte headers
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * 6: 3072 byte headers
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson *
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * And so on. Keep in mind that a range of sizes isn't used in
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * the case of linear scale because the headers can only
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * increment or decrement in sizes of 512 bytes. So, it's not
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * possible for a header to be sized in between whats listed
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * above.
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson *
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * Also, the above mapping values were calculated assuming a
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * SPA_MINBLOCKSHIFT of 512 bytes and a SPA_MAXBLOCKSIZE of 128K.
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (data->arc_cflags & ARC_CFLAG_VERBOSE) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson cbucket = hdr.b_psize;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson ubucket = hdr.b_lsize;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson } else {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson cbucket = highbit64(hdr.b_psize);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson ubucket = highbit64(hdr.b_lsize);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson bufcnt = hdr.b_l1hdr.b_bufcnt;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (bufcnt >= data->hist_nbuckets)
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson bufcnt = data->hist_nbuckets - 1;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson /* Ensure we stay within the bounds of the histogram array */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson ASSERT3U(cbucket, <, data->hist_nbuckets);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson ASSERT3U(ubucket, <, data->hist_nbuckets);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (hdr.b_l1hdr.b_state == data->anon_sym.st_value) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data->anon_c_hist[cbucket]++;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data->anon_u_hist[ubucket]++;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data->anon_bufs[bufcnt]++;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson } else if (hdr.b_l1hdr.b_state == data->mru_sym.st_value) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data->mru_c_hist[cbucket]++;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data->mru_u_hist[ubucket]++;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data->mru_bufs[bufcnt]++;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson } else if (hdr.b_l1hdr.b_state == data->mfu_sym.st_value) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data->mfu_c_hist[cbucket]++;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data->mfu_u_hist[ubucket]++;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data->mfu_bufs[bufcnt]++;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data->all_c_hist[cbucket]++;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data->all_u_hist[ubucket]++;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data->all_bufs[bufcnt]++;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson return (WALK_NEXT);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson}
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson/* ARGSUSED */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsonstatic int
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsonarc_compression_stats(uintptr_t addr, uint_t flags, int argc,
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson const mdb_arg_t *argv)
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson{
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson arc_compression_stats_data_t data = { 0 };
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson unsigned int max_shifted = SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson unsigned int hist_size;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson char range[32];
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson int rc = DCMD_OK;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (mdb_getopts(argc, argv,
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson 'v', MDB_OPT_SETBITS, ARC_CFLAG_VERBOSE, &data.arc_cflags,
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson 'a', MDB_OPT_SETBITS, ARC_CFLAG_ANON, &data.arc_cflags,
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson 'b', MDB_OPT_SETBITS, ARC_CFLAG_BUFS, &data.arc_cflags,
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson 'r', MDB_OPT_SETBITS, ARC_CFLAG_MRU, &data.arc_cflags,
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson 'f', MDB_OPT_SETBITS, ARC_CFLAG_MFU, &data.arc_cflags) != argc)
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson return (DCMD_USAGE);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (mdb_lookup_by_obj(ZFS_OBJ_NAME, "ARC_anon", &data.anon_sym) ||
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_lookup_by_obj(ZFS_OBJ_NAME, "ARC_mru", &data.mru_sym) ||
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_lookup_by_obj(ZFS_OBJ_NAME, "ARC_mru_ghost", &data.mrug_sym) ||
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_lookup_by_obj(ZFS_OBJ_NAME, "ARC_mfu", &data.mfu_sym) ||
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_lookup_by_obj(ZFS_OBJ_NAME, "ARC_mfu_ghost", &data.mfug_sym) ||
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_lookup_by_obj(ZFS_OBJ_NAME, "ARC_l2c_only", &data.l2c_sym)) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_warn("can't find arc state symbol");
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson return (DCMD_ERR);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson /*
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * Determine the maximum expected size for any header, and use
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * this to determine the number of buckets needed for each
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * histogram. If ARC_CFLAG_VERBOSE is specified, this value is
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * used directly; otherwise the log2 of the maximum size is
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * used. Thus, if using a log2 scale there's a maximum of 10
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * possible buckets, while the linear scale (when using
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson * ARC_CFLAG_VERBOSE) has a maximum of 257 buckets.
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (data.arc_cflags & ARC_CFLAG_VERBOSE)
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data.hist_nbuckets = max_shifted + 1;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson else
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data.hist_nbuckets = highbit64(max_shifted) + 1;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson hist_size = sizeof (uint64_t) * data.hist_nbuckets;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data.anon_c_hist = mdb_zalloc(hist_size, UM_SLEEP);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data.anon_u_hist = mdb_zalloc(hist_size, UM_SLEEP);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data.anon_bufs = mdb_zalloc(hist_size, UM_SLEEP);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data.mru_c_hist = mdb_zalloc(hist_size, UM_SLEEP);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data.mru_u_hist = mdb_zalloc(hist_size, UM_SLEEP);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data.mru_bufs = mdb_zalloc(hist_size, UM_SLEEP);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data.mfu_c_hist = mdb_zalloc(hist_size, UM_SLEEP);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data.mfu_u_hist = mdb_zalloc(hist_size, UM_SLEEP);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data.mfu_bufs = mdb_zalloc(hist_size, UM_SLEEP);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data.all_c_hist = mdb_zalloc(hist_size, UM_SLEEP);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data.all_u_hist = mdb_zalloc(hist_size, UM_SLEEP);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson data.all_bufs = mdb_zalloc(hist_size, UM_SLEEP);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (mdb_walk("arc_buf_hdr_t_full", arc_compression_stats_cb,
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson &data) != 0) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_warn("can't walk arc_buf_hdr's");
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson rc = DCMD_ERR;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson goto out;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (data.arc_cflags & ARC_CFLAG_VERBOSE) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson rc = mdb_snprintf(range, sizeof (range),
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "[n*%llu, (n+1)*%llu)", SPA_MINBLOCKSIZE,
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson SPA_MINBLOCKSIZE);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson } else {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson rc = mdb_snprintf(range, sizeof (range),
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "[2^(n-1)*%llu, 2^n*%llu)", SPA_MINBLOCKSIZE,
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson SPA_MINBLOCKSIZE);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (rc < 0) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson /* snprintf failed, abort the dcmd */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson rc = DCMD_ERR;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson goto out;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson } else {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson /* snprintf succeeded above, reset return code */
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson rc = DCMD_OK;
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (data.arc_cflags & ARC_CFLAG_ANON) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (data.arc_cflags & ARC_CFLAG_BUFS) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("Histogram of the number of anon buffers "
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "that are associated with an arc hdr.\n");
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson dump_histogram(data.anon_bufs, data.hist_nbuckets, 0);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("\n");
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("Histogram of compressed anon buffers.\n"
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "Each bucket represents buffers of size: %s.\n", range);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson dump_histogram(data.anon_c_hist, data.hist_nbuckets, 0);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("\n");
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("Histogram of uncompressed anon buffers.\n"
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "Each bucket represents buffers of size: %s.\n", range);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson dump_histogram(data.anon_u_hist, data.hist_nbuckets, 0);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("\n");
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (data.arc_cflags & ARC_CFLAG_MRU) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (data.arc_cflags & ARC_CFLAG_BUFS) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("Histogram of the number of mru buffers "
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "that are associated with an arc hdr.\n");
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson dump_histogram(data.mru_bufs, data.hist_nbuckets, 0);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("\n");
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("Histogram of compressed mru buffers.\n"
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "Each bucket represents buffers of size: %s.\n", range);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson dump_histogram(data.mru_c_hist, data.hist_nbuckets, 0);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("\n");
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("Histogram of uncompressed mru buffers.\n"
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "Each bucket represents buffers of size: %s.\n", range);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson dump_histogram(data.mru_u_hist, data.hist_nbuckets, 0);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("\n");
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (data.arc_cflags & ARC_CFLAG_MFU) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (data.arc_cflags & ARC_CFLAG_BUFS) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("Histogram of the number of mfu buffers "
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "that are associated with an arc hdr.\n");
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson dump_histogram(data.mfu_bufs, data.hist_nbuckets, 0);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("\n");
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("Histogram of compressed mfu buffers.\n"
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "Each bucket represents buffers of size: %s.\n", range);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson dump_histogram(data.mfu_c_hist, data.hist_nbuckets, 0);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("\n");
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("Histogram of uncompressed mfu buffers.\n"
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "Each bucket represents buffers of size: %s.\n", range);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson dump_histogram(data.mfu_u_hist, data.hist_nbuckets, 0);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("\n");
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson if (data.arc_cflags & ARC_CFLAG_BUFS) {
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("Histogram of all buffers that "
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "are associated with an arc hdr.\n");
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson dump_histogram(data.all_bufs, data.hist_nbuckets, 0);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("\n");
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson }
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("Histogram of all compressed buffers.\n"
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "Each bucket represents buffers of size: %s.\n", range);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson dump_histogram(data.all_c_hist, data.hist_nbuckets, 0);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("\n");
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_printf("Histogram of all uncompressed buffers.\n"
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "Each bucket represents buffers of size: %s.\n", range);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson dump_histogram(data.all_u_hist, data.hist_nbuckets, 0);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilsonout:
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_free(data.anon_c_hist, hist_size);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_free(data.anon_u_hist, hist_size);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_free(data.anon_bufs, hist_size);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_free(data.mru_c_hist, hist_size);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_free(data.mru_u_hist, hist_size);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_free(data.mru_bufs, hist_size);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_free(data.mfu_c_hist, hist_size);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_free(data.mfu_u_hist, hist_size);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_free(data.mfu_bufs, hist_size);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_free(data.all_c_hist, hist_size);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_free(data.all_u_hist, hist_size);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson mdb_free(data.all_bufs, hist_size);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson return (rc);
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson}
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson
fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * MDB module linkage information:
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
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.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic const mdb_dcmd_t dcmds[] = {
91ebeef555ce7f899b6270a3c2df47b51f7ad59aahrens { "arc", "[-bkmg]", "print ARC variables", arc_print },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "blkptr", ":", "print blkptr_t", blkptr },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "dbuf", ":", "print dmu_buf_impl_t", dbuf },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "dbuf_stats", ":", "dbuf stats", dbuf_stats },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "dbufs",
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 },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "abuf_find", "dva_word[0] dva_word[1]",
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore "find arc_buf_hdr_t of a specified DVA",
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore abuf_find },
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson { "spa", "?[-cevmMh]\n"
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",
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "spa_t summary", spa_print },
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 { "spa_vdevs", ":[-emMh]\n"
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 },
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi { "vdev", ":[-remMh]\n"
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore "\t-r display recursively\n"
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "\t-e display statistics\n"
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi "\t-m display metaslab statistics (top level vdev only)\n"
91e2a09f39b7b47ff919323f4118fab26e6641d8Steve Gonczi "\t-M display metaslab group statistics (top level vdev only)\n"
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson "\t-h display histogram (requires -m or -M)\n",
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore "vdev_t summary", vdev_print },
2e4c998613148111f2fc5371085331ffb39122ffGeorge Wilson { "zio", ":[-cpr]\n"
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore "\t-c display children\n"
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore "\t-p display parents\n"
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore "\t-r display recursively",
a3f829ae41ece20e7f5f63604e177aeeb8b24628Bill Moore "zio_t summary", zio_print },
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock { "zio_state", "?", "print out all zio_t structures on system or "
ccae0b50330edda9b094cee1ec6a0ad35443e8b0eschrock "for a particular pool", zio_state },
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens { "zfs_blkstats", ":[-v]",
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens "given a spa_t, print block type stats from last scrub",
88b7b0f29b20b808b9e06071885b1d6a3ddb6328Matthew Ahrens zfs_blkstats },
614409b5be5411058e7e9b6cc93dddaff9fb13f7ahrens { "zfs_params", "", "print zfs tunable parameters", zfs_params },
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens { "refcount", ":[-r]\n"
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens "\t-r display recently removed references",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens "print refcount_t holders", refcount },
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_acl_dump },
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 sa_attr_table},
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum { "sa_attr", ": attr_id",
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum "print SA attribute address when given sa_handle_t", sa_attr_print},
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens { "zfs_dbgmsg", ":[-va]",
3f9d6ad73e45c6823b409f93b0c8d4f62861d2d5Lin Ling "print zfs debug log", dbgmsg},
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens { "rrwlock", ":",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens "print rrwlock_t, including readers", rrwlock},
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson { "metaslab_weight", "weight",
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson "print metaslab weight", metaslab_weight},
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson { "metaslab_trace", ":",
8363e80ae72609660f6090766ca8c2c18aa53f0cGeorge Wilson "print metaslab allocation trace records", metaslab_trace},
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson { "arc_compression_stats", ":[-vabrf]\n"
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "\t-v verbose, display a linearly scaled histogram\n"
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "\t-a display ARC_anon state statistics individually\n"
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "\t-r display ARC_mru state statistics individually\n"
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "\t-f display ARC_mfu state statistics individually\n"
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "\t-b display histogram of buffer counts\n",
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson "print a histogram of compressed arc buffer sizes",
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson arc_compression_stats},
fa9e4066f08beec538e775443c5be79dd423fcabahrens { NULL }
fa9e4066f08beec538e775443c5be79dd423fcabahrens};
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic const mdb_walker_t walkers[] = {
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "zms_freelist", "walk ZFS metaslab freelist",
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_walk_init, zio_walk_step, NULL },
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens { "zio_root",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens "walk all root zio_t structures, optionally for a particular spa_t",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens zio_walk_init, zio_walk_root_step, NULL },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { "spa", "walk all spa_t entries in the namespace",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens spa_walk_init, spa_walk_step, NULL },
5f5f7a6f9c8e9c1587a54e690556d756ec67558cahrens { "metaslab", "given a spa_t *, walk all metaslab_t structures",
28e4da25922bdfc5cba7ab29f47de911bbd78009Matthew Ahrens metaslab_walk_init, metaslab_walk_step, NULL },
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson { "multilist", "given a multilist_t *, walk all list_t structures",
dcbf3bd6a1f1360fc1afcee9e22c6dcff7844bf2George Wilson multilist_walk_init, multilist_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",
0a586cea3ceec7e5e50e7e54c745082a7a333ac2Mark Shellenbaum zfs_acl_node_aces0_walk_init, zfs_aces_walk_step, NULL },
fa9e4066f08beec538e775443c5be79dd423fcabahrens { NULL }
fa9e4066f08beec538e775443c5be79dd423fcabahrens};
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensstatic const mdb_modinfo_t modinfo = {
fa9e4066f08beec538e775443c5be79dd423fcabahrens MDB_API_VERSION, dcmds, walkers
fa9e4066f08beec538e775443c5be79dd423fcabahrens};
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensconst mdb_modinfo_t *
fa9e4066f08beec538e775443c5be79dd423fcabahrens_mdb_init(void)
fa9e4066f08beec538e775443c5be79dd423fcabahrens{
fa9e4066f08beec538e775443c5be79dd423fcabahrens return (&modinfo);
fa9e4066f08beec538e775443c5be79dd423fcabahrens}