diff options
author | Matthew Ahrens <[email protected]> | 2018-04-06 13:30:26 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2018-04-06 13:30:26 -0700 |
commit | 5c27ec10889d3d8f12d59fb7e5068ed2d8697c85 (patch) | |
tree | 299ac1b7654029e6c3281baf560a1fcde4f60751 /include/sys | |
parent | 0ba106e75c6cda806cb5d2003b918e658f2ff86c (diff) |
Fixes for SNPRINTF_BLKPTR with encrypted BP's
mdb doesn't have dmu_ot[], so we need a different mechanism for its
SNPRINTF_BLKPTR() to determine if the BP is encrypted vs authenticated.
Additionally, since it already relies on BP_IS_ENCRYPTED (etc),
SNPRINTF_BLKPTR might as well figure out the "crypt_type" on its own,
rather than making the caller do so.
Reviewed-by: Brian Behlendorf <[email protected]>
Reviewed-by: Tom Caputi <[email protected]>
Signed-off-by: Matthew Ahrens <[email protected]>
Closes #7390
Diffstat (limited to 'include/sys')
-rw-r--r-- | include/sys/dmu.h | 15 | ||||
-rw-r--r-- | include/sys/spa.h | 17 |
2 files changed, 26 insertions, 6 deletions
diff --git a/include/sys/dmu.h b/include/sys/dmu.h index 4d805b6d7..027d3d9fc 100644 --- a/include/sys/dmu.h +++ b/include/sys/dmu.h @@ -119,13 +119,22 @@ typedef enum dmu_object_byteswap { ((ot) & DMU_OT_BYTESWAP_MASK) < DMU_BSWAP_NUMFUNCS : \ (ot) < DMU_OT_NUMTYPES) +/* + * MDB doesn't have dmu_ot; it defines these macros itself. + */ +#ifndef ZFS_MDB +#define DMU_OT_IS_METADATA_IMPL(ot) (dmu_ot[ot].ot_metadata) +#define DMU_OT_IS_ENCRYPTED_IMPL(ot) (dmu_ot[ot].ot_encrypt) +#define DMU_OT_BYTESWAP_IMPL(ot) (dmu_ot[ot].ot_byteswap) +#endif + #define DMU_OT_IS_METADATA(ot) (((ot) & DMU_OT_NEWTYPE) ? \ ((ot) & DMU_OT_METADATA) : \ - dmu_ot[(int)(ot)].ot_metadata) + DMU_OT_IS_METADATA_IMPL(ot)) #define DMU_OT_IS_ENCRYPTED(ot) (((ot) & DMU_OT_NEWTYPE) ? \ ((ot) & DMU_OT_ENCRYPTED) : \ - dmu_ot[(int)(ot)].ot_encrypt) + DMU_OT_IS_ENCRYPTED_IMPL(ot)) /* * These object types use bp_fill != 1 for their L0 bp's. Therefore they can't @@ -137,7 +146,7 @@ typedef enum dmu_object_byteswap { #define DMU_OT_BYTESWAP(ot) (((ot) & DMU_OT_NEWTYPE) ? \ ((ot) & DMU_OT_BYTESWAP_MASK) : \ - dmu_ot[(int)(ot)].ot_byteswap) + DMU_OT_BYTESWAP_IMPL(ot)) typedef enum dmu_object_type { DMU_OT_NONE, diff --git a/include/sys/spa.h b/include/sys/spa.h index 4a1b1410f..f93354c78 100644 --- a/include/sys/spa.h +++ b/include/sys/spa.h @@ -631,14 +631,25 @@ _NOTE(CONSTCOND) } while (0) * 'func' is either snprintf() or mdb_snprintf(). * 'ws' (whitespace) can be ' ' for single-line format, '\n' for multi-line. */ -#define SNPRINTF_BLKPTR(func, ws, buf, size, bp, type, checksum, crypt_type, \ - compress) \ +#define SNPRINTF_BLKPTR(func, ws, buf, size, bp, type, checksum, compress) \ { \ static const char *copyname[] = \ { "zero", "single", "double", "triple" }; \ int len = 0; \ int copies = 0; \ - \ + const char *crypt_type; \ + if (bp != NULL) { \ + if (BP_IS_ENCRYPTED(bp)) { \ + crypt_type = "encrypted"; \ + /* LINTED E_SUSPICIOUS_COMPARISON */ \ + } else if (BP_IS_AUTHENTICATED(bp)) { \ + crypt_type = "authenticated"; \ + } else if (BP_HAS_INDIRECT_MAC_CKSUM(bp)) { \ + crypt_type = "indirect-MAC"; \ + } else { \ + crypt_type = "unencrypted"; \ + } \ + } \ if (bp == NULL) { \ len += func(buf + len, size - len, "<NULL>"); \ } else if (BP_IS_HOLE(bp)) { \ |