From bfaf07481e2ed145059a6452413c3df623854d22 Mon Sep 17 00:00:00 2001 From: Tom Caputi Date: Fri, 24 Apr 2020 22:00:32 -0400 Subject: [PATCH] Fix missing ivset guid with resumed raw base recv This patch corrects a bug introduced in 61152d1069. When resuming a raw base receive, the dmu_recv code always sets drc->drc_fromsnapobj to the object ID of the previous snapshot. For incrementals, this is correct, but for base sends, this should be left at 0. The presence of this ID eventually allows a check to run which determines whether or not the incoming stream and the previous snapshot have matching IVset guids. This check fails becuase it is not meant to run when there is no previous snapshot. When it does fail, the user receives an error stating that the incoming stream has the problem outlined in errata 4. This patch corrects this issue by simply ensuring drc->drc_fromsnapobj is left as 0 for base receives. Reviewed-by: Brian Behlendorf Reviewed-by: George Melikov Signed-off-by: Tom Caputi Closes #10234 Closes #10239 --- module/zfs/dmu_recv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/zfs/dmu_recv.c b/module/zfs/dmu_recv.c index 788eef02279..11cd5a274a0 100644 --- a/module/zfs/dmu_recv.c +++ b/module/zfs/dmu_recv.c @@ -695,7 +695,7 @@ dmu_recv_resume_begin_check(void *arg, dmu_tx_t *tx) return (SET_ERROR(EINVAL)); } - if (ds->ds_prev != NULL) + if (ds->ds_prev != NULL && drrb->drr_fromguid != 0) drc->drc_fromsnapobj = ds->ds_prev->ds_object; dsl_dataset_rele_flags(ds, dsflags, FTAG);