nvlist_t *zplprops = NULL;
dsl_crypto_params_t *dcp = NULL;
char *spa_name = zc->zc_name;
+ boolean_t unload_wkey = B_TRUE;
if ((error = get_nvlist(zc->zc_nvlist_conf, zc->zc_nvlist_conf_size,
zc->zc_iflags, &config)))
(void) nvlist_lookup_nvlist(props, ZPOOL_ROOTFS_PROPS, &nvl);
if (nvl) {
error = nvlist_dup(nvl, &rootprops, KM_SLEEP);
- if (error != 0) {
- nvlist_free(config);
- nvlist_free(props);
- return (error);
- }
+ if (error != 0)
+ goto pool_props_bad;
(void) nvlist_remove_all(props, ZPOOL_ROOTFS_PROPS);
}
&hidden_args);
error = dsl_crypto_params_create_nvlist(DCP_CMD_NONE,
rootprops, hidden_args, &dcp);
- if (error != 0) {
- nvlist_free(config);
- nvlist_free(props);
- return (error);
- }
+ if (error != 0)
+ goto pool_props_bad;
(void) nvlist_remove_all(props, ZPOOL_HIDDEN_ARGS);
VERIFY(nvlist_alloc(&zplprops, NV_UNIQUE_NAME, KM_SLEEP) == 0);
* Set the remaining root properties
*/
if (!error && (error = zfs_set_prop_nvlist(spa_name,
- ZPROP_SRC_LOCAL, rootprops, NULL)) != 0)
+ ZPROP_SRC_LOCAL, rootprops, NULL)) != 0) {
(void) spa_destroy(spa_name);
+ unload_wkey = B_FALSE; /* spa_destroy() unloads wrapping keys */
+ }
pool_props_bad:
nvlist_free(rootprops);
nvlist_free(zplprops);
nvlist_free(config);
nvlist_free(props);
- dsl_crypto_params_free(dcp, !!error);
+ dsl_crypto_params_free(dcp, unload_wkey && !!error);
return (error);
}
# N 1 1 no keyformat given, but crypt off
# Y 0 0 no no keyformat specified for new key
# Y 0 1 no no keyformat specified for new key
+# Y 1 1 no unsupported combination of non-encryption props
# Y 1 0 yes new encryption root
# Y 1 1 yes new encryption root
#
log_mustnot zpool create -O encryption=on -O keylocation=prompt \
$TESTPOOL $DISKS
+log_mustnot eval "echo $PASSPHRASE | zpool create -O encryption=on" \
+ "-O keyformat=passphrase -O keylocation=prompt" \
+ "-o feature@lz4_compress=disabled -O compression=lz4 $TESTPOOL $DISKS"
+
log_must eval "echo $PASSPHRASE | zpool create -O encryption=on" \
"-O keyformat=passphrase $TESTPOOL $DISKS"
log_must zpool destroy $TESTPOOL