Print this page
Integrated Edon-R hash function.
@@ -2389,10 +2389,44 @@
(void) zfs_ioc_userspace_upgrade(zc);
kmem_free(zc, sizeof (zfs_cmd_t));
}
break;
}
+ case ZFS_PROP_CHECKSUM:
+ {
+ if (intval == ZIO_CHECKSUM_EDONR512_256) {
+ zfeature_info_t *feature =
+ &spa_feature_table[SPA_FEATURE_EDONR_CKSUM];
+ spa_t *spa;
+ dsl_pool_t *dp;
+
+ if ((err = spa_open(dsname, &spa, FTAG)) != 0)
+ return (err);
+
+ dp = spa->spa_dsl_pool;
+
+ /*
+ * Setting the Edon-R checksum algorithm activates
+ * the feature.
+ */
+ if (!spa_feature_is_active(spa, feature)) {
+ if ((err = zfs_prop_activate_feature(dp,
+ feature)) != 0) {
+ spa_close(spa, FTAG);
+ return (err);
+ }
+ }
+
+ spa_close(spa, FTAG);
+ }
+ /*
+ * We still want the default set action to be performed in the
+ * caller, we only performed zfeature settings here.
+ */
+ err = -1;
+ break;
+ }
case ZFS_PROP_COMPRESSION:
{
if (intval == ZIO_COMPRESS_LZ4) {
zfeature_info_t *feature =
&spa_feature_table[SPA_FEATURE_LZ4_COMPRESS];
@@ -3647,10 +3681,29 @@
/*
* Check that this value is valid for this pool version
*/
switch (prop) {
+ case ZFS_PROP_CHECKSUM:
+ if (nvpair_type(pair) == DATA_TYPE_UINT64 &&
+ nvpair_value_uint64(pair, &intval) == 0) {
+ if (intval == ZIO_CHECKSUM_EDONR512_256) {
+ zfeature_info_t *feature =
+ &spa_feature_table[SPA_FEATURE_EDONR_CKSUM];
+ spa_t *spa;
+
+ if ((err = spa_open(dsname, &spa, FTAG)) != 0)
+ return (err);
+
+ if (!spa_feature_is_enabled(spa, feature)) {
+ spa_close(spa, FTAG);
+ return (ENOTSUP);
+ }
+ spa_close(spa, FTAG);
+ }
+ }
+ break;
case ZFS_PROP_COMPRESSION:
/*
* If the user specified gzip compression, make sure
* the SPA supports it. We ignore any errors here since
* we'll catch them later.