From 51907a31bc20a6697ec9a92a58c163a0c0df5de7 Mon Sep 17 00:00:00 2001 From: "kernelOfTruth aka. kOT, Gentoo user" Date: Fri, 23 Sep 2016 01:01:19 +0200 Subject: [PATCH] OpenZFS 7230 - add assertions to dmu_send_impl() to verify that stream includes BEGIN and END records Authored by: Matt Krantz Reviewed by: Matthew Ahrens Reviewed by: Paul Dagnelie Reviewed by: Igor Kozhukhov Reviewed-by: Brian Behlendorf Approved by: Robert Mustacchi Ported-by: kernelOfTruth OpenZFS-issue: https://www.illumos.org/issues/7230 OpenZFS-commit: https://github.com/illumos/illumos-gate/commit/12b90ee2 Closes #5112 --- include/sys/dmu_impl.h | 2 ++ module/zfs/dmu_send.c | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/sys/dmu_impl.h b/include/sys/dmu_impl.h index 3e4423c8d..ae129b7cf 100644 --- a/include/sys/dmu_impl.h +++ b/include/sys/dmu_impl.h @@ -273,6 +273,8 @@ typedef struct dmu_sendarg { uint64_t dsa_last_data_offset; uint64_t dsa_resume_object; uint64_t dsa_resume_offset; + boolean_t dsa_sent_begin; + boolean_t dsa_sent_end; } dmu_sendarg_t; void dmu_object_zapify(objset_t *, uint64_t, dmu_object_type_t, dmu_tx_t *); diff --git a/module/zfs/dmu_send.c b/module/zfs/dmu_send.c index ebe103045..5e95da52d 100644 --- a/module/zfs/dmu_send.c +++ b/module/zfs/dmu_send.c @@ -169,11 +169,16 @@ dump_record(dmu_sendarg_t *dsp, void *payload, int payload_len) fletcher_4_incremental_native(dsp->dsa_drr, offsetof(dmu_replay_record_t, drr_u.drr_checksum.drr_checksum), &dsp->dsa_zc); - if (dsp->dsa_drr->drr_type != DRR_BEGIN) { + if (dsp->dsa_drr->drr_type == DRR_BEGIN) { + dsp->dsa_sent_begin = B_TRUE; + } else { ASSERT(ZIO_CHECKSUM_IS_ZERO(&dsp->dsa_drr->drr_u. drr_checksum.drr_checksum)); dsp->dsa_drr->drr_u.drr_checksum.drr_checksum = dsp->dsa_zc; } + if (dsp->dsa_drr->drr_type == DRR_END) { + dsp->dsa_sent_end = B_TRUE; + } fletcher_4_incremental_native(&dsp->dsa_drr-> drr_u.drr_checksum.drr_checksum, sizeof (zio_cksum_t), &dsp->dsa_zc); @@ -979,6 +984,8 @@ out: list_remove(&to_ds->ds_sendstreams, dsp); mutex_exit(&to_ds->ds_sendstream_lock); + VERIFY(err != 0 || (dsp->dsa_sent_begin && dsp->dsa_sent_end)); + kmem_free(drr, sizeof (dmu_replay_record_t)); kmem_free(dsp, sizeof (dmu_sendarg_t));