summaryrefslogtreecommitdiffstats
path: root/include/sys
diff options
context:
space:
mode:
authorMatthew Ahrens <[email protected]>2018-04-06 13:30:26 -0700
committerBrian Behlendorf <[email protected]>2018-04-06 13:30:26 -0700
commit5c27ec10889d3d8f12d59fb7e5068ed2d8697c85 (patch)
tree299ac1b7654029e6c3281baf560a1fcde4f60751 /include/sys
parent0ba106e75c6cda806cb5d2003b918e658f2ff86c (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.h15
-rw-r--r--include/sys/spa.h17
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)) { \