zcp: get_prop: fix encryptionroot and encryption

It was reported that channel programs' zfs.get_prop doesn't work for
dataset properties encryption and encryptionroot.

They are handled in get_special_prop due to the need to call
dsl_dataset_crypt_stats to load those dsl props.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Signed-off-by: Pavel Snajdr <snajpa@snajpa.net>
Co-authored-by: Graham Christensen <graham@grahamc.com>
Closes #17280
This commit is contained in:
Pavel Snajdr
2025-05-28 02:04:37 +02:00
committed by GitHub
parent 06fa8f3f69
commit 8487945034
7 changed files with 104 additions and 9 deletions
+29 -3
View File
@@ -378,14 +378,17 @@ get_special_prop(lua_State *state, dsl_dataset_t *ds, const char *dsname,
break;
}
case ZFS_PROP_ENCRYPTION:
case ZFS_PROP_KEYSTATUS:
case ZFS_PROP_KEYFORMAT: {
/* provide defaults in case no crypto obj exists */
setpoint[0] = '\0';
if (zfs_prop == ZFS_PROP_KEYSTATUS)
numval = ZFS_KEYSTATUS_NONE;
else
if (zfs_prop == ZFS_PROP_ENCRYPTION)
numval = ZIO_CRYPT_OFF;
else if (zfs_prop == ZFS_PROP_KEYFORMAT)
numval = ZFS_KEYFORMAT_NONE;
else if (zfs_prop == ZFS_PROP_KEYSTATUS)
numval = ZFS_KEYSTATUS_NONE;
nvlist_t *nvl, *propval;
nvl = fnvlist_alloc();
@@ -404,6 +407,29 @@ get_special_prop(lua_State *state, dsl_dataset_t *ds, const char *dsname,
break;
}
case ZFS_PROP_ENCRYPTION_ROOT: {
setpoint[0] = '\0';
strval[0] = '\0';
nvlist_t *nvl, *propval;
nvl = fnvlist_alloc();
dsl_dataset_crypt_stats(ds, nvl);
if (nvlist_lookup_nvlist(nvl, zfs_prop_to_name(zfs_prop),
&propval) == 0) {
const char *dsname;
const char *source;
if (nvlist_lookup_string(propval, ZPROP_VALUE,
&dsname) == 0)
strlcpy(strval, dsname, ZAP_MAXVALUELEN);
if (nvlist_lookup_string(propval, ZPROP_SOURCE,
&source) == 0)
strlcpy(setpoint, source, sizeof (setpoint));
}
nvlist_free(nvl);
break;
}
case ZFS_PROP_SNAPSHOTS_CHANGED:
numval = dsl_dir_snap_cmtime(ds->ds_dir).tv_sec;
break;