]> granicus.if.org Git - zfs/commitdiff
dedup=verify doesn't clear the blkptr's dedup flag
authorMatthew Ahrens <mahrens@delphix.com>
Fri, 21 Jun 2019 01:30:40 +0000 (18:30 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 21 Jun 2019 01:30:40 +0000 (18:30 -0700)
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

module/zfs/zio.c

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