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 /module | |
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
Diffstat (limited to 'module')
-rw-r--r-- | module/zfs/zfs_ioctl.c | 26 |
1 files changed, 13 insertions, 13 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; } |