aboutsummaryrefslogtreecommitdiffstats
path: root/lib/libzfs
diff options
context:
space:
mode:
authorTom Caputi <[email protected]>2019-10-24 13:51:01 -0400
committerBrian Behlendorf <[email protected]>2019-10-24 10:51:01 -0700
commitb4238327b4ec84451fd2944cee7ccff37a065d27 (patch)
treebf980591b57ab87f778f47225df04faa4331a93f /lib/libzfs
parent28f7427ab163887e901708dec5e7e72a6ac2a269 (diff)
Fix incremental recursive encrypted receive
Currently, incremental recursive encrypted receives fail to work for any snapshot after the first. The reason for this is because the check in zfs_setup_cmdline_props() did not properly realize that when the user attempts to use '-x encryption' in this situation, they are not really overriding the existing encryption property and instead are attempting to prevent it from changing. This resulted in an error message stating: "encryption property 'encryption' cannot be set or excluded for raw or incremental streams". This problem is fixed by updating the logic to expect this use case. Reviewed-by: loli10K <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Reviewed-by: Igor Kozhukhov <[email protected]> Signed-off-by: Tom Caputi <[email protected]> Closes #9494
Diffstat (limited to 'lib/libzfs')
-rw-r--r--lib/libzfs/libzfs_sendrecv.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/lib/libzfs/libzfs_sendrecv.c b/lib/libzfs/libzfs_sendrecv.c
index 12ae8759a..20d29f48c 100644
--- a/lib/libzfs/libzfs_sendrecv.c
+++ b/lib/libzfs/libzfs_sendrecv.c
@@ -4257,11 +4257,21 @@ zfs_setup_cmdline_props(libzfs_handle_t *hdl, zfs_type_t type,
/* raw streams can't override encryption properties */
if ((zfs_prop_encryption_key_param(prop) ||
- prop == ZFS_PROP_ENCRYPTION) && (raw || !newfs)) {
+ prop == ZFS_PROP_ENCRYPTION) && raw) {
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
"encryption property '%s' cannot "
- "be set or excluded for raw or incremental "
- "streams."), name);
+ "be set or excluded for raw streams."), name);
+ ret = zfs_error(hdl, EZFS_BADPROP, errbuf);
+ goto error;
+ }
+
+ /* incremental streams can only exclude encryption properties */
+ if ((zfs_prop_encryption_key_param(prop) ||
+ prop == ZFS_PROP_ENCRYPTION) && !newfs &&
+ nvpair_type(nvp) != DATA_TYPE_BOOLEAN) {
+ zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
+ "encryption property '%s' cannot "
+ "be set for incremental streams."), name);
ret = zfs_error(hdl, EZFS_BADPROP, errbuf);
goto error;
}
@@ -4279,10 +4289,12 @@ zfs_setup_cmdline_props(libzfs_handle_t *hdl, zfs_type_t type,
*/
if (nvlist_exists(origprops, name)) {
nvlist_t *attrs;
+ char *source = NULL;
attrs = fnvlist_lookup_nvlist(origprops, name);
- if (strcmp(fnvlist_lookup_string(attrs,
- ZPROP_SOURCE), ZPROP_SOURCE_VAL_RECVD) != 0)
+ if (nvlist_lookup_string(attrs,
+ ZPROP_SOURCE, &source) == 0 &&
+ strcmp(source, ZPROP_SOURCE_VAL_RECVD) != 0)
continue;
}
/*