From db1e59a63dbc24d58890d9a7a15cadf8e86aa702 Mon Sep 17 00:00:00 2001 From: Rob Norris Date: Thu, 29 Feb 2024 13:23:56 +1100 Subject: [PATCH] pretty: ABD flags Sponsored-by: Klara, Inc. Sponsored-by: Wasabi Technology, Inc. --- include/zfs_pretty.h | 7 +++ module/zcommon/zfs_pretty.c | 86 +++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) diff --git a/include/zfs_pretty.h b/include/zfs_pretty.h index 084ce93e33..d30419ac10 100644 --- a/include/zfs_pretty.h +++ b/include/zfs_pretty.h @@ -40,6 +40,13 @@ _ZFS_PRETTY_H size_t zfs_pretty_zio_flag_pairs( _ZFS_PRETTY_H size_t zfs_pretty_zio_flag_str( uint64_t bits, char *out, size_t outlen); +_ZFS_PRETTY_H size_t zfs_pretty_abd_flag_bits( + uint64_t bits, char *out, size_t outlen); +_ZFS_PRETTY_H size_t zfs_pretty_abd_flag_pairs( + uint64_t bits, char *out, size_t outlen); +_ZFS_PRETTY_H size_t zfs_pretty_abd_flag_str( + uint64_t bits, char *out, size_t outlen); + #ifdef __cplusplus } #endif diff --git a/module/zcommon/zfs_pretty.c b/module/zcommon/zfs_pretty.c index 98fb256478..a54dfea56f 100644 --- a/module/zcommon/zfs_pretty.c +++ b/module/zcommon/zfs_pretty.c @@ -140,3 +140,89 @@ zfs_pretty_zio_flag_str(uint64_t bits, char *out, size_t outlen) out[n++] = '\0'; return (n); } + +static const pretty_bit_t pretty_abd_flag_table[] = { + { 'L', "LN", "LINEAR" }, + { 'O', "OW", "OWNER" }, + { 'M', "MT", "META" }, + { 'Z', "MZ", "MULTI_ZONE" }, + { 'C', "MC", "MULTI_CHUNK" }, + { 'P', "LP", "LINEAR_PAGE" }, + { 'G', "GG", "GANG" }, + { 'F', "GF", "GANG_FREE" }, + { 'Z', "ZR", "ZEROS" }, + { 'A', "AL", "ALLOCD" }, +}; +static const size_t pretty_abd_flag_table_elems = + sizeof (pretty_abd_flag_table) / sizeof (pretty_bit_t); + +size_t +zfs_pretty_abd_flag_bits(uint64_t bits, char *out, size_t outlen) +{ + ASSERT(out); + size_t n = 0; + for (int b = pretty_abd_flag_table_elems; b >= 0; b--) { + if (n == outlen) + break; + uint64_t mask = (1ULL << b); + out[n++] = + (bits & mask) ? pretty_abd_flag_table[b].pb_bit : ' '; + } + if (n < outlen) + out[n++] = '\0'; + return (n); +} + +size_t +zfs_pretty_abd_flag_pairs(uint64_t bits, char *out, size_t outlen) +{ + ASSERT(out); + size_t n = 0; + for (int b = pretty_abd_flag_table_elems; b >= 0; b--) { + ASSERT3U(n, <=, outlen); + if (n == outlen) + break; + uint64_t mask = (1ULL << b); + if (bits & mask) { + size_t len = (n > 0) ? 3 : 2; + if (n > outlen-len) + break; + if (n > 0) + out[n++] = '|'; + out[n++] = pretty_abd_flag_table[b].pb_pair[0]; + out[n++] = pretty_abd_flag_table[b].pb_pair[1]; + } + } + if (n < outlen) + out[n++] = '\0'; + return (n); +} + +size_t +zfs_pretty_abd_flag_str(uint64_t bits, char *out, size_t outlen) +{ + ASSERT(out); + size_t n = 0; + for (int b = 0; b <= pretty_abd_flag_table_elems; b++) { + ASSERT3U(n, <=, outlen); + if (n == outlen) + break; + uint64_t mask = (1ULL << b); + if (bits & mask) { + size_t len = strlen(pretty_abd_flag_table[b].pb_name); + if (n > 0) + len++; + if (n > outlen-len) + break; + if (n > 0) { + out[n++] = ' '; + len--; + } + memcpy(&out[n], pretty_abd_flag_table[b].pb_name, len); + n += len; + } + } + if (n < outlen) + out[n++] = '\0'; + return (n); +}