for (enum zio_checksum c = 0; c < ZIO_CHECKSUM_FUNCTIONS; c++) {
ddt_t *ddt = spa->spa_ddt[c];
+ if (!ddt)
+ continue;
for (ddt_type_t type = 0; type < DDT_TYPES; type++) {
for (ddt_class_t class = 0; class < DDT_CLASSES;
class++) {
return;
ASSERT(ddt_phys_total_refcnt(&dde) > 1);
+ ddt_t *ddt = spa->spa_ddt[ddb.ddb_checksum];
+ VERIFY(ddt);
for (p = 0; p < DDT_PHYS_TYPES; p++, ddp++) {
if (ddp->ddp_phys_birth == 0)
zcb->zcb_dedup_blocks++;
}
}
- ddt_t *ddt = spa->spa_ddt[ddb.ddb_checksum];
+
ddt_enter(ddt);
VERIFY(ddt_lookup(ddt, &blk, B_TRUE) != NULL);
ddt_exit(ddt);
for (uint64_t cksum = 0;
cksum < ZIO_CHECKSUM_FUNCTIONS; cksum++) {
ddt_t *ddt = spa->spa_ddt[cksum];
+ if (!ddt)
+ continue;
mos_obj_refd(ddt->ddt_object[type][class]);
}
}
#include <sys/dsl_scan.h>
#include <sys/abd.h>
+/*
+ * These are the only checksums valid for dedup. They must match the list
+ * from dedup_table in zfs_prop.c
+ */
+#define DDT_CHECKSUM_VALID(c) \
+ (c == ZIO_CHECKSUM_SHA256 || c == ZIO_CHECKSUM_SHA512 || \
+ c == ZIO_CHECKSUM_SKEIN || c == ZIO_CHECKSUM_EDONR || \
+ c == ZIO_CHECKSUM_BLAKE3)
+
static kmem_cache_t *ddt_cache;
static kmem_cache_t *ddt_entry_cache;
ddt_t *
ddt_select(spa_t *spa, const blkptr_t *bp)
{
+ ASSERT(DDT_CHECKSUM_VALID(BP_GET_CHECKSUM(bp)));
return (spa->spa_ddt[BP_GET_CHECKSUM(bp)]);
}
{
spa->spa_dedup_checksum = ZIO_DEDUPCHECKSUM;
- for (enum zio_checksum c = 0; c < ZIO_CHECKSUM_FUNCTIONS; c++)
- spa->spa_ddt[c] = ddt_table_alloc(spa, c);
+ for (enum zio_checksum c = 0; c < ZIO_CHECKSUM_FUNCTIONS; c++) {
+ if (DDT_CHECKSUM_VALID(c))
+ spa->spa_ddt[c] = ddt_table_alloc(spa, c);
+ }
}
int
return (error == ENOENT ? 0 : error);
for (enum zio_checksum c = 0; c < ZIO_CHECKSUM_FUNCTIONS; c++) {
+ if (!DDT_CHECKSUM_VALID(c))
+ continue;
+
ddt_t *ddt = spa->spa_ddt[c];
for (ddt_type_t type = 0; type < DDT_TYPES; type++) {
for (ddt_class_t class = 0; class < DDT_CLASSES;
do {
do {
ddt_t *ddt = spa->spa_ddt[ddb->ddb_checksum];
+ if (ddt == NULL)
+ continue;
int error = ENOENT;
if (ddt_object_exists(ddt, ddb->ddb_type,
ddb->ddb_class)) {