|
35 | 35 | #include <sys/dsl_synctask.h> |
36 | 36 | #include <sys/spa.h> |
37 | 37 | #include <sys/zap.h> |
| 38 | +#include <sys/zio_checksum.h> |
| 39 | +#include <sys/zio_compress.h> |
38 | 40 | #include <sys/fs/zfs.h> |
39 | 41 |
|
40 | 42 | #include "zfs_prop.h" |
@@ -662,8 +664,11 @@ dsl_prop_set_sync_impl(dsl_dataset_t *ds, const char *propname, |
662 | 664 | char *tbuf = NULL; |
663 | 665 | int err; |
664 | 666 | uint64_t version = spa_version(ds->ds_dir->dd_pool->dp_spa); |
| 667 | + spa_feature_t f; |
| 668 | + zfs_prop_t prop; |
665 | 669 |
|
666 | | - isint = (dodefault(zfs_name_to_prop(propname), 8, 1, &intval) == 0); |
| 670 | + prop = zfs_name_to_prop(propname); |
| 671 | + isint = (dodefault(prop, 8, 1, &intval) == 0); |
667 | 672 |
|
668 | 673 | if (ds->ds_is_snapshot) { |
669 | 674 | ASSERT(version >= SPA_VERSION_SNAP_PROPS); |
@@ -813,6 +818,29 @@ dsl_prop_set_sync_impl(dsl_dataset_t *ds, const char *propname, |
813 | 818 | } |
814 | 819 | } |
815 | 820 |
|
| 821 | + switch (prop) { |
| 822 | + case ZFS_PROP_COMPRESSION: |
| 823 | + f = zio_compress_to_feature(ZIO_COMPRESS_ALGO(intval)); |
| 824 | + if (f != SPA_FEATURE_NONE) { |
| 825 | + ASSERT3S(spa_feature_table[f].fi_type, ==, |
| 826 | + ZFEATURE_TYPE_BOOLEAN); |
| 827 | + ds->ds_feature_activation[f] = (void *)B_TRUE; |
| 828 | + dsl_dataset_dirty(ds, tx); |
| 829 | + } |
| 830 | + break; |
| 831 | + case ZFS_PROP_CHECKSUM: |
| 832 | + f = zio_checksum_to_feature(intval); |
| 833 | + if (f != SPA_FEATURE_NONE) { |
| 834 | + ASSERT3S(spa_feature_table[f].fi_type, ==, |
| 835 | + ZFEATURE_TYPE_BOOLEAN); |
| 836 | + ds->ds_feature_activation[f] = (void *)B_TRUE; |
| 837 | + dsl_dataset_dirty(ds, tx); |
| 838 | + } |
| 839 | + break; |
| 840 | + default: |
| 841 | + break; |
| 842 | + } |
| 843 | + |
816 | 844 | spa_history_log_internal_ds(ds, (source == ZPROP_SRC_NONE || |
817 | 845 | source == ZPROP_SRC_INHERITED) ? "inherit" : "set", tx, |
818 | 846 | "%s=%s", propname, (valstr == NULL ? "" : valstr)); |
|
0 commit comments