dedup=verify doesn't clear the blkptr's dedup flag

The logic to handle strong checksum collisions where the data doesn't
match is incorrect. It is not clearing the dedup bit of the blkptr,
which can cause a panic later in zio_ddt_free() due to the dedup table
not matching what is in the blkptr.

Reviewed-by: Tom Caputi <tcaputi@datto.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Matthew Ahrens <mahrens@delphix.com>
External-issue: DLPX-48097
Closes #8936
This commit is contained in:
Matthew Ahrens 2019-06-20 18:30:40 -07:00 committed by Tony Hutter
parent 9af524b0ee
commit 3c2a42fd25

View File

@ -3192,7 +3192,9 @@ zio_ddt_write(zio_t *zio)
BP_ZERO(bp); BP_ZERO(bp);
} else { } else {
zp->zp_dedup = B_FALSE; zp->zp_dedup = B_FALSE;
BP_SET_DEDUP(bp, B_FALSE);
} }
ASSERT(!BP_GET_DEDUP(bp));
zio->io_pipeline = ZIO_WRITE_PIPELINE; zio->io_pipeline = ZIO_WRITE_PIPELINE;
ddt_exit(ddt); ddt_exit(ddt);
return (zio); return (zio);