diff options
author | LOLi <[email protected]> | 2018-08-03 23:56:25 +0200 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2018-08-03 14:56:25 -0700 |
commit | c8c308362c2f0a43adbe21a44b3443a27d2c7ca9 (patch) | |
tree | e9329953e9b85389caaddf05743684448c74623d | |
parent | fc1ecd16d735eb35939a5cae9488b00b1539e383 (diff) |
Allow inherited properties in zfs_check_settable()
This change modifies how 'checksum' and 'dedup' properties are verified
in zfs_check_settable() handling the case where they are explicitly
inherited in the dataset hierarchy when receiving a recursive send
stream.
Reviewed-by: Brian Behlendorf <[email protected]>
Reviewed-by: Tom Caputi <[email protected]>
Signed-off-by: loli10K <[email protected]>
Closes #7755
Closes #7576
Closes #7757
-rw-r--r-- | module/zfs/zfs_ioctl.c | 26 | ||||
-rwxr-xr-x | tests/zfs-tests/tests/functional/cli_root/zfs_receive/receive-o-x_props_override.ksh | 6 |
2 files changed, 17 insertions, 15 deletions
diff --git a/module/zfs/zfs_ioctl.c b/module/zfs/zfs_ioctl.c index a0d2127fb..74a58fb89 100644 --- a/module/zfs/zfs_ioctl.c +++ b/module/zfs/zfs_ioctl.c @@ -4112,7 +4112,6 @@ zfs_check_settable(const char *dsname, nvpair_t *pair, cred_t *cr) { spa_feature_t feature; spa_t *spa; - uint64_t intval; int err; /* dedup feature version checks */ @@ -4120,22 +4119,23 @@ zfs_check_settable(const char *dsname, nvpair_t *pair, cred_t *cr) zfs_earlier_version(dsname, SPA_VERSION_DEDUP)) return (SET_ERROR(ENOTSUP)); - if (nvpair_value_uint64(pair, &intval) != 0) - return (SET_ERROR(EINVAL)); - - /* check prop value is enabled in features */ - feature = zio_checksum_to_feature(intval & ZIO_CHECKSUM_MASK); - if (feature == SPA_FEATURE_NONE) - break; + if (nvpair_type(pair) == DATA_TYPE_UINT64 && + nvpair_value_uint64(pair, &intval) == 0) { + /* check prop value is enabled in features */ + feature = zio_checksum_to_feature( + intval & ZIO_CHECKSUM_MASK); + if (feature == SPA_FEATURE_NONE) + break; - if ((err = spa_open(dsname, &spa, FTAG)) != 0) - return (err); + if ((err = spa_open(dsname, &spa, FTAG)) != 0) + return (err); - if (!spa_feature_is_enabled(spa, feature)) { + if (!spa_feature_is_enabled(spa, feature)) { + spa_close(spa, FTAG); + return (SET_ERROR(ENOTSUP)); + } spa_close(spa, FTAG); - return (SET_ERROR(ENOTSUP)); } - spa_close(spa, FTAG); break; } diff --git a/tests/zfs-tests/tests/functional/cli_root/zfs_receive/receive-o-x_props_override.ksh b/tests/zfs-tests/tests/functional/cli_root/zfs_receive/receive-o-x_props_override.ksh index 3b77664c3..14d503c51 100755 --- a/tests/zfs-tests/tests/functional/cli_root/zfs_receive/receive-o-x_props_override.ksh +++ b/tests/zfs-tests/tests/functional/cli_root/zfs_receive/receive-o-x_props_override.ksh @@ -122,15 +122,17 @@ log_must eval "zfs set '$userprop:snap'='$userval' $origsub@snap3" log_must eval "zfs send -R -I $orig@snap1 $orig@snap3 > $streamfile_incr" # Sets various combination of override and exclude options log_must eval "zfs recv -F -o atime=off -o '$userprop:dest2'='$userval' "\ - "-o quota=123456789 -x compression -x '$userprop:orig' " \ - "-x '$userprop:snap3' $dest < $streamfile_incr" + "-o quota=123456789 -o checksum=sha512 -x compression "\ + "-x '$userprop:orig' -x '$userprop:snap3' $dest < $streamfile_incr" # Verify we can correctly override and exclude properties log_must eval "check_prop_source $dest copies 2 received" log_must eval "check_prop_source $dest atime off local" log_must eval "check_prop_source $dest '$userprop:dest2' '$userval' local" log_must eval "check_prop_source $dest quota 123456789 local" +log_must eval "check_prop_source $dest checksum sha512 local" log_must eval "check_prop_inherit $destsub copies $dest" log_must eval "check_prop_inherit $destsub atime $dest" +log_must eval "check_prop_inherit $destsub checksum $dest" log_must eval "check_prop_inherit $destsub '$userprop:dest2' $dest" log_must eval "check_prop_source $destsub quota 0 default" log_must eval "check_prop_source $destsub compression off default" |