mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
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:
@@ -4875,6 +4875,11 @@ extract_delay_props(nvlist_t *props)
|
||||
static const zfs_prop_t delayable[] = {
|
||||
ZFS_PROP_REFQUOTA,
|
||||
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
|
||||
};
|
||||
int i;
|
||||
@@ -4938,6 +4943,7 @@ zfs_ioc_recv_impl(char *tofs, char *tosnap, char *origin, nvlist_t *recvprops,
|
||||
offset_t off, noff;
|
||||
nvlist_t *local_delayprops = NULL;
|
||||
nvlist_t *recv_delayprops = NULL;
|
||||
nvlist_t *inherited_delayprops = NULL;
|
||||
nvlist_t *origprops = NULL; /* existing properties */
|
||||
nvlist_t *origrecvd = NULL; /* existing received properties */
|
||||
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);
|
||||
(void) zfs_set_prop_nvlist(tofs, ZPROP_SRC_LOCAL,
|
||||
oprops, *errors);
|
||||
inherited_delayprops = extract_delay_props(xprops);
|
||||
(void) zfs_set_prop_nvlist(tofs, ZPROP_SRC_INHERITED,
|
||||
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,
|
||||
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);
|
||||
nvlist_free(local_delayprops);
|
||||
}
|
||||
if (inherited_delayprops != NULL) {
|
||||
ASSERT(nvlist_merge(localprops, inherited_delayprops, 0) == 0);
|
||||
nvlist_free(inherited_delayprops);
|
||||
}
|
||||
*read_bytes = off - noff;
|
||||
|
||||
#ifdef ZFS_DEBUG
|
||||
|
||||
Reference in New Issue
Block a user