]> granicus.if.org Git - zfs/commit
Raw DRR_OBJECT records must write raw data
authorTom Caputi <tcaputi@datto.com>
Tue, 27 Feb 2018 17:04:05 +0000 (12:04 -0500)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 27 Feb 2018 17:04:05 +0000 (09:04 -0800)
commit095495e0081c16a18641fc60e7c9872123a4f83e
tree6bfafa8d3c800a875fb042df43c08922b9cb8747
parent8b5814393f43d7eb7e4319120529d957a5f7bf8e
Raw DRR_OBJECT records must write raw data

b1d21733 made it possible for empty metadnode blocks to be
compressed to a hole, fixing a bug that would cause invalid
metadnode MACs when a send stream attempted to free objects
and allowing the blocks to be reclaimed when they were no
longer needed. However, this patch also introduced a race
condition; if a txg sync occurred after a DRR_OBJECT_RANGE
record was received but before any objects were added, the
metadnode block would be compressed to a hole and lose all
of its encryption parameters. This would cause subsequent
DRR_OBJECT records to fail when they attempted to write
their data into an unencrypted block. This patch defers the
DRR_OBJECT_RANGE handling to receive_object() so that the
encryption parameters are set with each object that is
written into that block.

Reviewed-by: Kash Pande <kash@tripleback.net>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Tom Caputi <tcaputi@datto.com>
Closes #7215
Closes #7236
include/sys/dmu.h
module/zfs/dbuf.c
module/zfs/dmu.c
module/zfs/dmu_send.c