]> granicus.if.org Git - zfs/commitdiff
Allow inherited properties in zfs_check_settable()
authorLOLi <loli10K@users.noreply.github.com>
Fri, 3 Aug 2018 21:56:25 +0000 (23:56 +0200)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 3 Aug 2018 21:56:25 +0000 (14:56 -0700)
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 <behlendorf1@llnl.gov>
Reviewed-by: Tom Caputi <tcaputi@datto.com>
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
Closes #7755
Closes #7576
Closes #7757

module/zfs/zfs_ioctl.c
tests/zfs-tests/tests/functional/cli_root/zfs_receive/receive-o-x_props_override.ksh

index a0d2127fbbcba2bb42b9991bc33382c14809ba60..74a58fb8908ebcbac81a81bc1296f147bec2ac7b 100644 (file)
@@ -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;
        }
 
index 3b77664c35e8aaf761c04d8a38975669b221cf52..14d503c512d4ebb7cb9ce947b18653a0bf1c14d4 100755 (executable)
@@ -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"