Mercurial > illumos > git > illumos-gate
changeset 19435:9c3e8d0fa5b3
12267 zfs '::abuf_find' dcmd is broken
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Kody Kantor <kody@kkantor.com>
Reviewed by: Igor Kozhukhov <igor@dilos.org>
Approved by: Dan McDonald <danmcd@joyent.com>
author | Jason King <jason.king@joyent.com> |
---|---|
date | Fri, 31 Jan 2020 13:21:59 -0600 |
parents | d591e9494f1f |
children | a2e6a0199a03 |
files | usr/src/cmd/mdb/common/modules/zfs/zfs.c |
diffstat | 1 files changed, 23 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/cmd/mdb/common/modules/zfs/zfs.c Thu Jan 30 12:57:07 2020 -0700 +++ b/usr/src/cmd/mdb/common/modules/zfs/zfs.c Fri Jan 31 13:21:59 2020 -0600 @@ -1006,13 +1006,17 @@ return (WALK_NEXT); } +typedef struct mdb_arc_state { + uintptr_t arcs_list[ARC_BUFC_NUMTYPES]; +} mdb_arc_state_t; + /* ARGSUSED */ static int abuf_find(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv) { abuf_find_data_t data; GElf_Sym sym; - int i; + int i, j; const char *syms[] = { "ARC_mru", "ARC_mru_ghost", @@ -1042,15 +1046,31 @@ } for (i = 0; i < sizeof (syms) / sizeof (syms[0]); i++) { + mdb_arc_state_t mas; + if (mdb_lookup_by_obj(ZFS_OBJ_NAME, syms[i], &sym)) { mdb_warn("can't find symbol %s", syms[i]); return (DCMD_ERR); } - if (mdb_pwalk("list", abuf_find_cb, &data, sym.st_value) != 0) { - mdb_warn("can't walk %s", syms[i]); + if (mdb_ctf_vread(&mas, "arc_state_t", "mdb_arc_state_t", + sym.st_value, 0) != 0) { + mdb_warn("can't read arcs_list of %s", syms[i]); return (DCMD_ERR); } + + for (j = 0; j < ARC_BUFC_NUMTYPES; j++) { + uintptr_t addr = mas.arcs_list[j]; + + if (addr == 0) + continue; + + if (mdb_pwalk("multilist", abuf_find_cb, &data, + addr) != 0) { + mdb_warn("can't walk %s", syms[i]); + return (DCMD_ERR); + } + } } return (DCMD_OK);