mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	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 <ezomori.nozomu@gmail.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Igor Kozhukhov <igor@dilos.org> Signed-off-by: Tom Caputi <tcaputi@datto.com> Closes #9494
This commit is contained in:
		
							parent
							
								
									28f7427ab1
								
							
						
					
					
						commit
						b4238327b4
					
				| @ -4257,11 +4257,21 @@ zfs_setup_cmdline_props(libzfs_handle_t *hdl, zfs_type_t type, | |||||||
| 
 | 
 | ||||||
| 		/* raw streams can't override encryption properties */ | 		/* raw streams can't override encryption properties */ | ||||||
| 		if ((zfs_prop_encryption_key_param(prop) || | 		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, | 			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, | ||||||
| 			    "encryption property '%s' cannot " | 			    "encryption property '%s' cannot " | ||||||
| 			    "be set or excluded for raw or incremental " | 			    "be set or excluded for raw streams."), name); | ||||||
| 			    "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); | 			ret = zfs_error(hdl, EZFS_BADPROP, errbuf); | ||||||
| 			goto error; | 			goto error; | ||||||
| 		} | 		} | ||||||
| @ -4279,10 +4289,12 @@ zfs_setup_cmdline_props(libzfs_handle_t *hdl, zfs_type_t type, | |||||||
| 			 */ | 			 */ | ||||||
| 			if (nvlist_exists(origprops, name)) { | 			if (nvlist_exists(origprops, name)) { | ||||||
| 				nvlist_t *attrs; | 				nvlist_t *attrs; | ||||||
|  | 				char *source = NULL; | ||||||
| 
 | 
 | ||||||
| 				attrs = fnvlist_lookup_nvlist(origprops, name); | 				attrs = fnvlist_lookup_nvlist(origprops, name); | ||||||
| 				if (strcmp(fnvlist_lookup_string(attrs, | 				if (nvlist_lookup_string(attrs, | ||||||
| 				    ZPROP_SOURCE), ZPROP_SOURCE_VAL_RECVD) != 0) | 				    ZPROP_SOURCE, &source) == 0 && | ||||||
|  | 				    strcmp(source, ZPROP_SOURCE_VAL_RECVD) != 0) | ||||||
| 					continue; | 					continue; | ||||||
| 			} | 			} | ||||||
| 			/*
 | 			/*
 | ||||||
|  | |||||||
| @ -58,7 +58,8 @@ log_assert "'zfs recv' must properly handle encryption properties" | |||||||
| 
 | 
 | ||||||
| typeset keyfile=/$TESTPOOL/pkey | typeset keyfile=/$TESTPOOL/pkey | ||||||
| typeset sendfile=/$TESTPOOL/sendfile | typeset sendfile=/$TESTPOOL/sendfile | ||||||
| typeset snap=$TESTPOOL/ds@snap | typeset snap=$TESTPOOL/ds@snap1 | ||||||
|  | typeset snap2=$TESTPOOL/ds@snap2 | ||||||
| typeset esnap=$TESTPOOL/crypt@snap1 | typeset esnap=$TESTPOOL/crypt@snap1 | ||||||
| typeset esnap2=$TESTPOOL/crypt@snap2 | typeset esnap2=$TESTPOOL/crypt@snap2 | ||||||
| 
 | 
 | ||||||
| @ -78,6 +79,7 @@ log_must cp /$TESTPOOL/ds/$TESTFILE0 /$TESTPOOL/crypt/$TESTFILE0 | |||||||
| typeset cksum=$(md5digest /$TESTPOOL/ds/$TESTFILE0) | typeset cksum=$(md5digest /$TESTPOOL/ds/$TESTFILE0) | ||||||
| 
 | 
 | ||||||
| log_must zfs snap -r $snap | log_must zfs snap -r $snap | ||||||
|  | log_must zfs snap -r $snap2 | ||||||
| log_must zfs snap -r $esnap | log_must zfs snap -r $esnap | ||||||
| log_must zfs snap -r $esnap2 | log_must zfs snap -r $esnap2 | ||||||
| 
 | 
 | ||||||
| @ -193,6 +195,20 @@ recv_cksum=$(md5digest /$ds/$TESTFILE0) | |||||||
| log_must test "$recv_cksum" == "$cksum" | log_must test "$recv_cksum" == "$cksum" | ||||||
| log_must zfs destroy -r $ds | log_must zfs destroy -r $ds | ||||||
| 
 | 
 | ||||||
|  | # Test that we can override an unencrypted, incremental, recursive stream's | ||||||
|  | # encryption settings, receiving all datasets as encrypted children. | ||||||
|  | log_note "Must be able to receive recursive stream to encrypted child" | ||||||
|  | ds=$TESTPOOL/crypt/recv | ||||||
|  | log_must eval "zfs send -R $snap2 > $sendfile" | ||||||
|  | log_must eval "zfs recv -x encryption $ds < $sendfile" | ||||||
|  | log_must test "$(get_prop 'encryptionroot' $ds)" == "$TESTPOOL/crypt" | ||||||
|  | log_must test "$(get_prop 'encryption' $ds)" == "aes-256-ccm" | ||||||
|  | log_must test "$(get_prop 'keyformat' $ds)" == "passphrase" | ||||||
|  | log_must test "$(get_prop 'mounted' $ds)" == "yes" | ||||||
|  | recv_cksum=$(md5digest /$ds/$TESTFILE0) | ||||||
|  | log_must test "$recv_cksum" == "$cksum" | ||||||
|  | log_must zfs destroy -r $ds | ||||||
|  | 
 | ||||||
| # Check that we haven't printed the key to the zpool history log | # Check that we haven't printed the key to the zpool history log | ||||||
| log_mustnot eval "zpool history -i | grep -q 'wkeydata'" | log_mustnot eval "zpool history -i | grep -q 'wkeydata'" | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Tom Caputi
						Tom Caputi