X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=module%2Fzfs%2Fddt.c;h=f93024d8f988a779f16c5b0f24de33810bc2cc49;hb=594b4dd82a6ba6b046b894a24986ce727f4d7391;hp=c7db3d7580bce62bd85f2759198db59181c2ac2e;hpb=00b46022c676e402e3f33ce93ee2983bbad2c46f;p=zfs.git diff --git a/module/zfs/ddt.c b/module/zfs/ddt.c index c7db3d7..f93024d 100644 --- a/module/zfs/ddt.c +++ b/module/zfs/ddt.c @@ -120,7 +120,9 @@ ddt_object_load(ddt_t *ddt, enum ddt_type type, enum ddt_class class) /* * Seed the cached statistics. */ - VERIFY(ddt_object_info(ddt, type, class, &doi) == 0); + error = ddt_object_info(ddt, type, class, &doi); + if (error) + return (error); ddo->ddo_count = ddt_object_count(ddt, type, class); ddo->ddo_dspace = doi.doi_physical_blocks_512 << 9; @@ -502,7 +504,7 @@ ddt_get_dedup_stats(spa_t *spa, ddt_stat_t *dds_total) ddt_histogram_t *ddh_total; /* XXX: Move to a slab */ - ddh_total = kmem_zalloc(sizeof (ddt_histogram_t), KM_SLEEP); + ddh_total = kmem_zalloc(sizeof (ddt_histogram_t), KM_PUSHPAGE); ddt_get_dedup_histogram(spa, ddh_total); ddt_histogram_stat(dds_total, ddh_total); kmem_free(ddh_total, sizeof (ddt_histogram_t)); @@ -891,7 +893,7 @@ boolean_t ddt_class_contains(spa_t *spa, enum ddt_class max_class, const blkptr_t *bp) { ddt_t *ddt; - ddt_entry_t dde; + ddt_entry_t *dde; enum ddt_type type; enum ddt_class class; @@ -902,14 +904,20 @@ ddt_class_contains(spa_t *spa, enum ddt_class max_class, const blkptr_t *bp) return (B_TRUE); ddt = spa->spa_ddt[BP_GET_CHECKSUM(bp)]; + dde = kmem_alloc(sizeof(ddt_entry_t), KM_SLEEP); - ddt_key_fill(&dde.dde_key, bp); + ddt_key_fill(&(dde->dde_key), bp); - for (type = 0; type < DDT_TYPES; type++) - for (class = 0; class <= max_class; class++) - if (ddt_object_lookup(ddt, type, class, &dde) == 0) + for (type = 0; type < DDT_TYPES; type++) { + for (class = 0; class <= max_class; class++) { + if (ddt_object_lookup(ddt, type, class, dde) == 0) { + kmem_free(dde, sizeof(ddt_entry_t)); return (B_TRUE); + } + } + } + kmem_free(dde, sizeof(ddt_entry_t)); return (B_FALSE); } @@ -1187,3 +1195,8 @@ ddt_walk(spa_t *spa, ddt_bookmark_t *ddb, ddt_entry_t *dde) return (ENOENT); } + +#if defined(_KERNEL) && defined(HAVE_SPL) +module_param(zfs_dedup_prefetch, int, 0644); +MODULE_PARM_DESC(zfs_dedup_prefetch,"Enable prefetching dedup-ed blks"); +#endif