Delay ZFS_PROP_SHARESMB property to handle it for encrypted raw receive

For encrypted raw receive, objset creation is delayed until a call to
dmu_recv_stream(). ZFS_PROP_SHARESMB property requires objset to be
populated when calling zpl_earlier_version(). To correctly handle the
ZFS_PROP_SHARESMB property for encrypted raw receive, this change
delays setting the property.

Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Reviewed-by: Ryan Moeller <ryan@iXsystems.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Ameer Hamza <ahamza@ixsystems.com>
Closes #13878
This commit is contained in:
Ameer Hamza 2022-09-21 03:19:05 +05:00 committed by GitHub
parent 3f400b0f58
commit c50b3f14d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 0 deletions

View File

@ -4875,6 +4875,11 @@ extract_delay_props(nvlist_t *props)
static const zfs_prop_t delayable[] = { static const zfs_prop_t delayable[] = {
ZFS_PROP_REFQUOTA, ZFS_PROP_REFQUOTA,
ZFS_PROP_KEYLOCATION, ZFS_PROP_KEYLOCATION,
/*
* Setting ZFS_PROP_SHARESMB requires the objset type to be
* known, which is not possible prior to receipt of raw sends.
*/
ZFS_PROP_SHARESMB,
0 0
}; };
int i; int i;
@ -4938,6 +4943,7 @@ zfs_ioc_recv_impl(char *tofs, char *tosnap, char *origin, nvlist_t *recvprops,
offset_t off, noff; offset_t off, noff;
nvlist_t *local_delayprops = NULL; nvlist_t *local_delayprops = NULL;
nvlist_t *recv_delayprops = NULL; nvlist_t *recv_delayprops = NULL;
nvlist_t *inherited_delayprops = NULL;
nvlist_t *origprops = NULL; /* existing properties */ nvlist_t *origprops = NULL; /* existing properties */
nvlist_t *origrecvd = NULL; /* existing received properties */ nvlist_t *origrecvd = NULL; /* existing received properties */
boolean_t first_recvd_props = B_FALSE; boolean_t first_recvd_props = B_FALSE;
@ -5052,6 +5058,7 @@ zfs_ioc_recv_impl(char *tofs, char *tosnap, char *origin, nvlist_t *recvprops,
local_delayprops = extract_delay_props(oprops); local_delayprops = extract_delay_props(oprops);
(void) zfs_set_prop_nvlist(tofs, ZPROP_SRC_LOCAL, (void) zfs_set_prop_nvlist(tofs, ZPROP_SRC_LOCAL,
oprops, *errors); oprops, *errors);
inherited_delayprops = extract_delay_props(xprops);
(void) zfs_set_prop_nvlist(tofs, ZPROP_SRC_INHERITED, (void) zfs_set_prop_nvlist(tofs, ZPROP_SRC_INHERITED,
xprops, *errors); xprops, *errors);
@ -5109,6 +5116,10 @@ zfs_ioc_recv_impl(char *tofs, char *tosnap, char *origin, nvlist_t *recvprops,
(void) zfs_set_prop_nvlist(tofs, ZPROP_SRC_LOCAL, (void) zfs_set_prop_nvlist(tofs, ZPROP_SRC_LOCAL,
local_delayprops, *errors); local_delayprops, *errors);
} }
if (inherited_delayprops != NULL && error == 0) {
(void) zfs_set_prop_nvlist(tofs, ZPROP_SRC_INHERITED,
inherited_delayprops, *errors);
}
} }
/* /*
@ -5128,6 +5139,10 @@ zfs_ioc_recv_impl(char *tofs, char *tosnap, char *origin, nvlist_t *recvprops,
ASSERT(nvlist_merge(localprops, local_delayprops, 0) == 0); ASSERT(nvlist_merge(localprops, local_delayprops, 0) == 0);
nvlist_free(local_delayprops); nvlist_free(local_delayprops);
} }
if (inherited_delayprops != NULL) {
ASSERT(nvlist_merge(localprops, inherited_delayprops, 0) == 0);
nvlist_free(inherited_delayprops);
}
*read_bytes = off - noff; *read_bytes = off - noff;
#ifdef ZFS_DEBUG #ifdef ZFS_DEBUG

View File

@ -133,6 +133,14 @@ 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 sharesmb property for encrypted raw stream.
log_note "Must be able to override sharesmb property for encrypted raw stream"
ds=$TESTPOOL/recv
log_must eval "zfs send -w $esnap > $sendfile"
log_must eval "zfs recv -o sharesmb=on $ds < $sendfile"
log_must test "$(get_prop 'sharesmb' $ds)" == "on"
log_must zfs destroy -r $ds
# Test that we can override encryption properties on a properties stream # Test that we can override encryption properties on a properties stream
# of an unencrypted dataset, turning it into an encryption root. # of an unencrypted dataset, turning it into an encryption root.
log_note "Must be able to receive stream with props as encryption root" log_note "Must be able to receive stream with props as encryption root"