summaryrefslogtreecommitdiffstats
path: root/module/zfs
diff options
context:
space:
mode:
Diffstat (limited to 'module/zfs')
-rw-r--r--module/zfs/dsl_crypt.c7
-rw-r--r--module/zfs/zfeature.c13
2 files changed, 20 insertions, 0 deletions
diff --git a/module/zfs/dsl_crypt.c b/module/zfs/dsl_crypt.c
index a0e7fcce4..21db8e51f 100644
--- a/module/zfs/dsl_crypt.c
+++ b/module/zfs/dsl_crypt.c
@@ -1837,6 +1837,13 @@ dmu_objset_create_crypt_check(dsl_dir_t *parentdd, dsl_crypto_params_t *dcp,
return (SET_ERROR(EOPNOTSUPP));
}
+ /* Check for errata #4 (encryption enabled, bookmark_v2 disabled) */
+ if (parentdd != NULL &&
+ !spa_feature_is_enabled(parentdd->dd_pool->dp_spa,
+ SPA_FEATURE_BOOKMARK_V2)) {
+ return (SET_ERROR(EOPNOTSUPP));
+ }
+
/* handle inheritance */
if (dcp->cp_wkey == NULL) {
ASSERT3P(parentdd, !=, NULL);
diff --git a/module/zfs/zfeature.c b/module/zfs/zfeature.c
index a3ca367e0..e6c1a5355 100644
--- a/module/zfs/zfeature.c
+++ b/module/zfs/zfeature.c
@@ -376,6 +376,19 @@ feature_enable_sync(spa_t *spa, zfeature_info_t *feature, dmu_tx_t *tx)
spa->spa_feat_enabled_txg_obj, feature->fi_guid,
sizeof (uint64_t), 1, &enabling_txg, tx));
}
+
+ /*
+ * Errata #4 is mostly a problem with encrypted datasets, but it
+ * is also a problem where the old encryption feature did not
+ * depend on the bookmark_v2 feature. If the pool does not have
+ * any encrypted datasets we can resolve this issue simply by
+ * enabling this dependency.
+ */
+ if (spa->spa_errata == ZPOOL_ERRATA_ZOL_8308_ENCRYPTION &&
+ spa_feature_is_enabled(spa, SPA_FEATURE_ENCRYPTION) &&
+ !spa_feature_is_active(spa, SPA_FEATURE_ENCRYPTION) &&
+ feature->fi_feature == SPA_FEATURE_BOOKMARK_V2)
+ spa->spa_errata = 0;
}
static void