]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/cddl/contrib/opensolaris/uts/common/fs/zfs/ddt.c
Add the llvm-cov and llvm-profdata tools, when WITH_CLANG_EXTRAS is
[FreeBSD/FreeBSD.git] / sys / cddl / contrib / opensolaris / uts / common / fs / zfs / ddt.c
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21
22 /*
23  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Copyright (c) 2012, 2014 by Delphix. All rights reserved.
25  */
26
27 #include <sys/zfs_context.h>
28 #include <sys/spa.h>
29 #include <sys/spa_impl.h>
30 #include <sys/zio.h>
31 #include <sys/ddt.h>
32 #include <sys/zap.h>
33 #include <sys/dmu_tx.h>
34 #include <sys/arc.h>
35 #include <sys/dsl_pool.h>
36 #include <sys/zio_checksum.h>
37 #include <sys/zio_compress.h>
38 #include <sys/dsl_scan.h>
39
40 /*
41  * Enable/disable prefetching of dedup-ed blocks which are going to be freed.
42  */
43 int zfs_dedup_prefetch = 1;
44
45 SYSCTL_DECL(_vfs_zfs);
46 SYSCTL_NODE(_vfs_zfs, OID_AUTO, dedup, CTLFLAG_RW, 0, "ZFS DEDUP");
47 SYSCTL_INT(_vfs_zfs_dedup, OID_AUTO, prefetch, CTLFLAG_RWTUN, &zfs_dedup_prefetch,
48     0, "Enable/disable prefetching of dedup-ed blocks which are going to be freed");
49
50 static const ddt_ops_t *ddt_ops[DDT_TYPES] = {
51         &ddt_zap_ops,
52 };
53
54 static const char *ddt_class_name[DDT_CLASSES] = {
55         "ditto",
56         "duplicate",
57         "unique",
58 };
59
60 static void
61 ddt_object_create(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
62     dmu_tx_t *tx)
63 {
64         spa_t *spa = ddt->ddt_spa;
65         objset_t *os = ddt->ddt_os;
66         uint64_t *objectp = &ddt->ddt_object[type][class];
67         boolean_t prehash = zio_checksum_table[ddt->ddt_checksum].ci_dedup;
68         char name[DDT_NAMELEN];
69
70         ddt_object_name(ddt, type, class, name);
71
72         ASSERT(*objectp == 0);
73         VERIFY(ddt_ops[type]->ddt_op_create(os, objectp, tx, prehash) == 0);
74         ASSERT(*objectp != 0);
75
76         VERIFY(zap_add(os, DMU_POOL_DIRECTORY_OBJECT, name,
77             sizeof (uint64_t), 1, objectp, tx) == 0);
78
79         VERIFY(zap_add(os, spa->spa_ddt_stat_object, name,
80             sizeof (uint64_t), sizeof (ddt_histogram_t) / sizeof (uint64_t),
81             &ddt->ddt_histogram[type][class], tx) == 0);
82 }
83
84 static void
85 ddt_object_destroy(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
86     dmu_tx_t *tx)
87 {
88         spa_t *spa = ddt->ddt_spa;
89         objset_t *os = ddt->ddt_os;
90         uint64_t *objectp = &ddt->ddt_object[type][class];
91         uint64_t count;
92         char name[DDT_NAMELEN];
93
94         ddt_object_name(ddt, type, class, name);
95
96         ASSERT(*objectp != 0);
97         VERIFY(ddt_object_count(ddt, type, class, &count) == 0 && count == 0);
98         ASSERT(ddt_histogram_empty(&ddt->ddt_histogram[type][class]));
99         VERIFY(zap_remove(os, DMU_POOL_DIRECTORY_OBJECT, name, tx) == 0);
100         VERIFY(zap_remove(os, spa->spa_ddt_stat_object, name, tx) == 0);
101         VERIFY(ddt_ops[type]->ddt_op_destroy(os, *objectp, tx) == 0);
102         bzero(&ddt->ddt_object_stats[type][class], sizeof (ddt_object_t));
103
104         *objectp = 0;
105 }
106
107 static int
108 ddt_object_load(ddt_t *ddt, enum ddt_type type, enum ddt_class class)
109 {
110         ddt_object_t *ddo = &ddt->ddt_object_stats[type][class];
111         dmu_object_info_t doi;
112         uint64_t count;
113         char name[DDT_NAMELEN];
114         int error;
115
116         ddt_object_name(ddt, type, class, name);
117
118         error = zap_lookup(ddt->ddt_os, DMU_POOL_DIRECTORY_OBJECT, name,
119             sizeof (uint64_t), 1, &ddt->ddt_object[type][class]);
120
121         if (error != 0)
122                 return (error);
123
124         VERIFY0(zap_lookup(ddt->ddt_os, ddt->ddt_spa->spa_ddt_stat_object, name,
125             sizeof (uint64_t), sizeof (ddt_histogram_t) / sizeof (uint64_t),
126             &ddt->ddt_histogram[type][class]));
127
128         /*
129          * Seed the cached statistics.
130          */
131         VERIFY(ddt_object_info(ddt, type, class, &doi) == 0);
132
133         error = ddt_object_count(ddt, type, class, &count);
134         if (error)
135                 return error;
136
137         ddo->ddo_count = count;
138         ddo->ddo_dspace = doi.doi_physical_blocks_512 << 9;
139         ddo->ddo_mspace = doi.doi_fill_count * doi.doi_data_block_size;
140
141         return (0);
142 }
143
144 static void
145 ddt_object_sync(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
146     dmu_tx_t *tx)
147 {
148         ddt_object_t *ddo = &ddt->ddt_object_stats[type][class];
149         dmu_object_info_t doi;
150         uint64_t count;
151         char name[DDT_NAMELEN];
152
153         ddt_object_name(ddt, type, class, name);
154
155         VERIFY(zap_update(ddt->ddt_os, ddt->ddt_spa->spa_ddt_stat_object, name,
156             sizeof (uint64_t), sizeof (ddt_histogram_t) / sizeof (uint64_t),
157             &ddt->ddt_histogram[type][class], tx) == 0);
158
159         /*
160          * Cache DDT statistics; this is the only time they'll change.
161          */
162         VERIFY(ddt_object_info(ddt, type, class, &doi) == 0);
163         VERIFY(ddt_object_count(ddt, type, class, &count) == 0);
164
165         ddo->ddo_count = count;
166         ddo->ddo_dspace = doi.doi_physical_blocks_512 << 9;
167         ddo->ddo_mspace = doi.doi_fill_count * doi.doi_data_block_size;
168 }
169
170 static int
171 ddt_object_lookup(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
172     ddt_entry_t *dde)
173 {
174         if (!ddt_object_exists(ddt, type, class))
175                 return (SET_ERROR(ENOENT));
176
177         return (ddt_ops[type]->ddt_op_lookup(ddt->ddt_os,
178             ddt->ddt_object[type][class], dde));
179 }
180
181 static void
182 ddt_object_prefetch(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
183     ddt_entry_t *dde)
184 {
185         if (!ddt_object_exists(ddt, type, class))
186                 return;
187
188         ddt_ops[type]->ddt_op_prefetch(ddt->ddt_os,
189             ddt->ddt_object[type][class], dde);
190 }
191
192 int
193 ddt_object_update(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
194     ddt_entry_t *dde, dmu_tx_t *tx)
195 {
196         ASSERT(ddt_object_exists(ddt, type, class));
197
198         return (ddt_ops[type]->ddt_op_update(ddt->ddt_os,
199             ddt->ddt_object[type][class], dde, tx));
200 }
201
202 static int
203 ddt_object_remove(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
204     ddt_entry_t *dde, dmu_tx_t *tx)
205 {
206         ASSERT(ddt_object_exists(ddt, type, class));
207
208         return (ddt_ops[type]->ddt_op_remove(ddt->ddt_os,
209             ddt->ddt_object[type][class], dde, tx));
210 }
211
212 int
213 ddt_object_walk(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
214     uint64_t *walk, ddt_entry_t *dde)
215 {
216         ASSERT(ddt_object_exists(ddt, type, class));
217
218         return (ddt_ops[type]->ddt_op_walk(ddt->ddt_os,
219             ddt->ddt_object[type][class], dde, walk));
220 }
221
222 int
223 ddt_object_count(ddt_t *ddt, enum ddt_type type, enum ddt_class class, uint64_t *count)
224 {
225         ASSERT(ddt_object_exists(ddt, type, class));
226
227         return (ddt_ops[type]->ddt_op_count(ddt->ddt_os,
228             ddt->ddt_object[type][class], count));
229 }
230
231 int
232 ddt_object_info(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
233     dmu_object_info_t *doi)
234 {
235         if (!ddt_object_exists(ddt, type, class))
236                 return (SET_ERROR(ENOENT));
237
238         return (dmu_object_info(ddt->ddt_os, ddt->ddt_object[type][class],
239             doi));
240 }
241
242 boolean_t
243 ddt_object_exists(ddt_t *ddt, enum ddt_type type, enum ddt_class class)
244 {
245         return (!!ddt->ddt_object[type][class]);
246 }
247
248 void
249 ddt_object_name(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
250     char *name)
251 {
252         (void) sprintf(name, DMU_POOL_DDT,
253             zio_checksum_table[ddt->ddt_checksum].ci_name,
254             ddt_ops[type]->ddt_op_name, ddt_class_name[class]);
255 }
256
257 void
258 ddt_bp_fill(const ddt_phys_t *ddp, blkptr_t *bp, uint64_t txg)
259 {
260         ASSERT(txg != 0);
261
262         for (int d = 0; d < SPA_DVAS_PER_BP; d++)
263                 bp->blk_dva[d] = ddp->ddp_dva[d];
264         BP_SET_BIRTH(bp, txg, ddp->ddp_phys_birth);
265 }
266
267 void
268 ddt_bp_create(enum zio_checksum checksum,
269     const ddt_key_t *ddk, const ddt_phys_t *ddp, blkptr_t *bp)
270 {
271         BP_ZERO(bp);
272
273         if (ddp != NULL)
274                 ddt_bp_fill(ddp, bp, ddp->ddp_phys_birth);
275
276         bp->blk_cksum = ddk->ddk_cksum;
277         bp->blk_fill = 1;
278
279         BP_SET_LSIZE(bp, DDK_GET_LSIZE(ddk));
280         BP_SET_PSIZE(bp, DDK_GET_PSIZE(ddk));
281         BP_SET_COMPRESS(bp, DDK_GET_COMPRESS(ddk));
282         BP_SET_CHECKSUM(bp, checksum);
283         BP_SET_TYPE(bp, DMU_OT_DEDUP);
284         BP_SET_LEVEL(bp, 0);
285         BP_SET_DEDUP(bp, 0);
286         BP_SET_BYTEORDER(bp, ZFS_HOST_BYTEORDER);
287 }
288
289 void
290 ddt_key_fill(ddt_key_t *ddk, const blkptr_t *bp)
291 {
292         ddk->ddk_cksum = bp->blk_cksum;
293         ddk->ddk_prop = 0;
294
295         DDK_SET_LSIZE(ddk, BP_GET_LSIZE(bp));
296         DDK_SET_PSIZE(ddk, BP_GET_PSIZE(bp));
297         DDK_SET_COMPRESS(ddk, BP_GET_COMPRESS(bp));
298 }
299
300 void
301 ddt_phys_fill(ddt_phys_t *ddp, const blkptr_t *bp)
302 {
303         ASSERT(ddp->ddp_phys_birth == 0);
304
305         for (int d = 0; d < SPA_DVAS_PER_BP; d++)
306                 ddp->ddp_dva[d] = bp->blk_dva[d];
307         ddp->ddp_phys_birth = BP_PHYSICAL_BIRTH(bp);
308 }
309
310 void
311 ddt_phys_clear(ddt_phys_t *ddp)
312 {
313         bzero(ddp, sizeof (*ddp));
314 }
315
316 void
317 ddt_phys_addref(ddt_phys_t *ddp)
318 {
319         ddp->ddp_refcnt++;
320 }
321
322 void
323 ddt_phys_decref(ddt_phys_t *ddp)
324 {
325         ASSERT((int64_t)ddp->ddp_refcnt > 0);
326         ddp->ddp_refcnt--;
327 }
328
329 void
330 ddt_phys_free(ddt_t *ddt, ddt_key_t *ddk, ddt_phys_t *ddp, uint64_t txg)
331 {
332         blkptr_t blk;
333
334         ddt_bp_create(ddt->ddt_checksum, ddk, ddp, &blk);
335         ddt_phys_clear(ddp);
336         zio_free(ddt->ddt_spa, txg, &blk);
337 }
338
339 ddt_phys_t *
340 ddt_phys_select(const ddt_entry_t *dde, const blkptr_t *bp)
341 {
342         ddt_phys_t *ddp = (ddt_phys_t *)dde->dde_phys;
343
344         for (int p = 0; p < DDT_PHYS_TYPES; p++, ddp++) {
345                 if (DVA_EQUAL(BP_IDENTITY(bp), &ddp->ddp_dva[0]) &&
346                     BP_PHYSICAL_BIRTH(bp) == ddp->ddp_phys_birth)
347                         return (ddp);
348         }
349         return (NULL);
350 }
351
352 uint64_t
353 ddt_phys_total_refcnt(const ddt_entry_t *dde)
354 {
355         uint64_t refcnt = 0;
356
357         for (int p = DDT_PHYS_SINGLE; p <= DDT_PHYS_TRIPLE; p++)
358                 refcnt += dde->dde_phys[p].ddp_refcnt;
359
360         return (refcnt);
361 }
362
363 static void
364 ddt_stat_generate(ddt_t *ddt, ddt_entry_t *dde, ddt_stat_t *dds)
365 {
366         spa_t *spa = ddt->ddt_spa;
367         ddt_phys_t *ddp = dde->dde_phys;
368         ddt_key_t *ddk = &dde->dde_key;
369         uint64_t lsize = DDK_GET_LSIZE(ddk);
370         uint64_t psize = DDK_GET_PSIZE(ddk);
371
372         bzero(dds, sizeof (*dds));
373
374         for (int p = 0; p < DDT_PHYS_TYPES; p++, ddp++) {
375                 uint64_t dsize = 0;
376                 uint64_t refcnt = ddp->ddp_refcnt;
377
378                 if (ddp->ddp_phys_birth == 0)
379                         continue;
380
381                 for (int d = 0; d < SPA_DVAS_PER_BP; d++)
382                         dsize += dva_get_dsize_sync(spa, &ddp->ddp_dva[d]);
383
384                 dds->dds_blocks += 1;
385                 dds->dds_lsize += lsize;
386                 dds->dds_psize += psize;
387                 dds->dds_dsize += dsize;
388
389                 dds->dds_ref_blocks += refcnt;
390                 dds->dds_ref_lsize += lsize * refcnt;
391                 dds->dds_ref_psize += psize * refcnt;
392                 dds->dds_ref_dsize += dsize * refcnt;
393         }
394 }
395
396 void
397 ddt_stat_add(ddt_stat_t *dst, const ddt_stat_t *src, uint64_t neg)
398 {
399         const uint64_t *s = (const uint64_t *)src;
400         uint64_t *d = (uint64_t *)dst;
401         uint64_t *d_end = (uint64_t *)(dst + 1);
402
403         ASSERT(neg == 0 || neg == -1ULL);       /* add or subtract */
404
405         while (d < d_end)
406                 *d++ += (*s++ ^ neg) - neg;
407 }
408
409 static void
410 ddt_stat_update(ddt_t *ddt, ddt_entry_t *dde, uint64_t neg)
411 {
412         ddt_stat_t dds;
413         ddt_histogram_t *ddh;
414         int bucket;
415
416         ddt_stat_generate(ddt, dde, &dds);
417
418         bucket = highbit64(dds.dds_ref_blocks) - 1;
419         ASSERT(bucket >= 0);
420
421         ddh = &ddt->ddt_histogram[dde->dde_type][dde->dde_class];
422
423         ddt_stat_add(&ddh->ddh_stat[bucket], &dds, neg);
424 }
425
426 void
427 ddt_histogram_add(ddt_histogram_t *dst, const ddt_histogram_t *src)
428 {
429         for (int h = 0; h < 64; h++)
430                 ddt_stat_add(&dst->ddh_stat[h], &src->ddh_stat[h], 0);
431 }
432
433 void
434 ddt_histogram_stat(ddt_stat_t *dds, const ddt_histogram_t *ddh)
435 {
436         bzero(dds, sizeof (*dds));
437
438         for (int h = 0; h < 64; h++)
439                 ddt_stat_add(dds, &ddh->ddh_stat[h], 0);
440 }
441
442 boolean_t
443 ddt_histogram_empty(const ddt_histogram_t *ddh)
444 {
445         const uint64_t *s = (const uint64_t *)ddh;
446         const uint64_t *s_end = (const uint64_t *)(ddh + 1);
447
448         while (s < s_end)
449                 if (*s++ != 0)
450                         return (B_FALSE);
451
452         return (B_TRUE);
453 }
454
455 void
456 ddt_get_dedup_object_stats(spa_t *spa, ddt_object_t *ddo_total)
457 {
458         /* Sum the statistics we cached in ddt_object_sync(). */
459         for (enum zio_checksum c = 0; c < ZIO_CHECKSUM_FUNCTIONS; c++) {
460                 ddt_t *ddt = spa->spa_ddt[c];
461                 for (enum ddt_type type = 0; type < DDT_TYPES; type++) {
462                         for (enum ddt_class class = 0; class < DDT_CLASSES;
463                             class++) {
464                                 ddt_object_t *ddo =
465                                     &ddt->ddt_object_stats[type][class];
466                                 ddo_total->ddo_count += ddo->ddo_count;
467                                 ddo_total->ddo_dspace += ddo->ddo_dspace;
468                                 ddo_total->ddo_mspace += ddo->ddo_mspace;
469                         }
470                 }
471         }
472
473         /* ... and compute the averages. */
474         if (ddo_total->ddo_count != 0) {
475                 ddo_total->ddo_dspace /= ddo_total->ddo_count;
476                 ddo_total->ddo_mspace /= ddo_total->ddo_count;
477         }
478 }
479
480 void
481 ddt_get_dedup_histogram(spa_t *spa, ddt_histogram_t *ddh)
482 {
483         for (enum zio_checksum c = 0; c < ZIO_CHECKSUM_FUNCTIONS; c++) {
484                 ddt_t *ddt = spa->spa_ddt[c];
485                 for (enum ddt_type type = 0; type < DDT_TYPES; type++) {
486                         for (enum ddt_class class = 0; class < DDT_CLASSES;
487                             class++) {
488                                 ddt_histogram_add(ddh,
489                                     &ddt->ddt_histogram_cache[type][class]);
490                         }
491                 }
492         }
493 }
494
495 void
496 ddt_get_dedup_stats(spa_t *spa, ddt_stat_t *dds_total)
497 {
498         ddt_histogram_t *ddh_total;
499
500         ddh_total = kmem_zalloc(sizeof (ddt_histogram_t), KM_SLEEP);
501         ddt_get_dedup_histogram(spa, ddh_total);
502         ddt_histogram_stat(dds_total, ddh_total);
503         kmem_free(ddh_total, sizeof (ddt_histogram_t));
504 }
505
506 uint64_t
507 ddt_get_dedup_dspace(spa_t *spa)
508 {
509         ddt_stat_t dds_total = { 0 };
510
511         ddt_get_dedup_stats(spa, &dds_total);
512         return (dds_total.dds_ref_dsize - dds_total.dds_dsize);
513 }
514
515 uint64_t
516 ddt_get_pool_dedup_ratio(spa_t *spa)
517 {
518         ddt_stat_t dds_total = { 0 };
519
520         ddt_get_dedup_stats(spa, &dds_total);
521         if (dds_total.dds_dsize == 0)
522                 return (100);
523
524         return (dds_total.dds_ref_dsize * 100 / dds_total.dds_dsize);
525 }
526
527 int
528 ddt_ditto_copies_needed(ddt_t *ddt, ddt_entry_t *dde, ddt_phys_t *ddp_willref)
529 {
530         spa_t *spa = ddt->ddt_spa;
531         uint64_t total_refcnt = 0;
532         uint64_t ditto = spa->spa_dedup_ditto;
533         int total_copies = 0;
534         int desired_copies = 0;
535
536         for (int p = DDT_PHYS_SINGLE; p <= DDT_PHYS_TRIPLE; p++) {
537                 ddt_phys_t *ddp = &dde->dde_phys[p];
538                 zio_t *zio = dde->dde_lead_zio[p];
539                 uint64_t refcnt = ddp->ddp_refcnt;      /* committed refs */
540                 if (zio != NULL)
541                         refcnt += zio->io_parent_count; /* pending refs */
542                 if (ddp == ddp_willref)
543                         refcnt++;                       /* caller's ref */
544                 if (refcnt != 0) {
545                         total_refcnt += refcnt;
546                         total_copies += p;
547                 }
548         }
549
550         if (ditto == 0 || ditto > UINT32_MAX)
551                 ditto = UINT32_MAX;
552
553         if (total_refcnt >= 1)
554                 desired_copies++;
555         if (total_refcnt >= ditto)
556                 desired_copies++;
557         if (total_refcnt >= ditto * ditto)
558                 desired_copies++;
559
560         return (MAX(desired_copies, total_copies) - total_copies);
561 }
562
563 int
564 ddt_ditto_copies_present(ddt_entry_t *dde)
565 {
566         ddt_phys_t *ddp = &dde->dde_phys[DDT_PHYS_DITTO];
567         dva_t *dva = ddp->ddp_dva;
568         int copies = 0 - DVA_GET_GANG(dva);
569
570         for (int d = 0; d < SPA_DVAS_PER_BP; d++, dva++)
571                 if (DVA_IS_VALID(dva))
572                         copies++;
573
574         ASSERT(copies >= 0 && copies < SPA_DVAS_PER_BP);
575
576         return (copies);
577 }
578
579 size_t
580 ddt_compress(void *src, uchar_t *dst, size_t s_len, size_t d_len)
581 {
582         uchar_t *version = dst++;
583         int cpfunc = ZIO_COMPRESS_ZLE;
584         zio_compress_info_t *ci = &zio_compress_table[cpfunc];
585         size_t c_len;
586
587         ASSERT(d_len >= s_len + 1);     /* no compression plus version byte */
588
589         c_len = ci->ci_compress(src, dst, s_len, d_len - 1, ci->ci_level);
590
591         if (c_len == s_len) {
592                 cpfunc = ZIO_COMPRESS_OFF;
593                 bcopy(src, dst, s_len);
594         }
595
596         *version = cpfunc;
597         /* CONSTCOND */
598         if (ZFS_HOST_BYTEORDER)
599                 *version |= DDT_COMPRESS_BYTEORDER_MASK;
600
601         return (c_len + 1);
602 }
603
604 void
605 ddt_decompress(uchar_t *src, void *dst, size_t s_len, size_t d_len)
606 {
607         uchar_t version = *src++;
608         int cpfunc = version & DDT_COMPRESS_FUNCTION_MASK;
609         zio_compress_info_t *ci = &zio_compress_table[cpfunc];
610
611         if (ci->ci_decompress != NULL)
612                 (void) ci->ci_decompress(src, dst, s_len, d_len, ci->ci_level);
613         else
614                 bcopy(src, dst, d_len);
615
616         if (((version & DDT_COMPRESS_BYTEORDER_MASK) != 0) !=
617             (ZFS_HOST_BYTEORDER != 0))
618                 byteswap_uint64_array(dst, d_len);
619 }
620
621 ddt_t *
622 ddt_select_by_checksum(spa_t *spa, enum zio_checksum c)
623 {
624         return (spa->spa_ddt[c]);
625 }
626
627 ddt_t *
628 ddt_select(spa_t *spa, const blkptr_t *bp)
629 {
630         return (spa->spa_ddt[BP_GET_CHECKSUM(bp)]);
631 }
632
633 void
634 ddt_enter(ddt_t *ddt)
635 {
636         mutex_enter(&ddt->ddt_lock);
637 }
638
639 void
640 ddt_exit(ddt_t *ddt)
641 {
642         mutex_exit(&ddt->ddt_lock);
643 }
644
645 static ddt_entry_t *
646 ddt_alloc(const ddt_key_t *ddk)
647 {
648         ddt_entry_t *dde;
649
650         dde = kmem_zalloc(sizeof (ddt_entry_t), KM_SLEEP);
651         cv_init(&dde->dde_cv, NULL, CV_DEFAULT, NULL);
652
653         dde->dde_key = *ddk;
654
655         return (dde);
656 }
657
658 static void
659 ddt_free(ddt_entry_t *dde)
660 {
661         ASSERT(!dde->dde_loading);
662
663         for (int p = 0; p < DDT_PHYS_TYPES; p++)
664                 ASSERT(dde->dde_lead_zio[p] == NULL);
665
666         if (dde->dde_repair_data != NULL)
667                 zio_buf_free(dde->dde_repair_data,
668                     DDK_GET_PSIZE(&dde->dde_key));
669
670         cv_destroy(&dde->dde_cv);
671         kmem_free(dde, sizeof (*dde));
672 }
673
674 void
675 ddt_remove(ddt_t *ddt, ddt_entry_t *dde)
676 {
677         ASSERT(MUTEX_HELD(&ddt->ddt_lock));
678
679         avl_remove(&ddt->ddt_tree, dde);
680         ddt_free(dde);
681 }
682
683 ddt_entry_t *
684 ddt_lookup(ddt_t *ddt, const blkptr_t *bp, boolean_t add)
685 {
686         ddt_entry_t *dde, dde_search;
687         enum ddt_type type;
688         enum ddt_class class;
689         avl_index_t where;
690         int error;
691
692         ASSERT(MUTEX_HELD(&ddt->ddt_lock));
693
694         ddt_key_fill(&dde_search.dde_key, bp);
695
696         dde = avl_find(&ddt->ddt_tree, &dde_search, &where);
697         if (dde == NULL) {
698                 if (!add)
699                         return (NULL);
700                 dde = ddt_alloc(&dde_search.dde_key);
701                 avl_insert(&ddt->ddt_tree, dde, where);
702         }
703
704         while (dde->dde_loading)
705                 cv_wait(&dde->dde_cv, &ddt->ddt_lock);
706
707         if (dde->dde_loaded)
708                 return (dde);
709
710         dde->dde_loading = B_TRUE;
711
712         ddt_exit(ddt);
713
714         error = ENOENT;
715
716         for (type = 0; type < DDT_TYPES; type++) {
717                 for (class = 0; class < DDT_CLASSES; class++) {
718                         error = ddt_object_lookup(ddt, type, class, dde);
719                         if (error != ENOENT)
720                                 break;
721                 }
722                 if (error != ENOENT)
723                         break;
724         }
725
726         ASSERT(error == 0 || error == ENOENT);
727
728         ddt_enter(ddt);
729
730         ASSERT(dde->dde_loaded == B_FALSE);
731         ASSERT(dde->dde_loading == B_TRUE);
732
733         dde->dde_type = type;   /* will be DDT_TYPES if no entry found */
734         dde->dde_class = class; /* will be DDT_CLASSES if no entry found */
735         dde->dde_loaded = B_TRUE;
736         dde->dde_loading = B_FALSE;
737
738         if (error == 0)
739                 ddt_stat_update(ddt, dde, -1ULL);
740
741         cv_broadcast(&dde->dde_cv);
742
743         return (dde);
744 }
745
746 void
747 ddt_prefetch(spa_t *spa, const blkptr_t *bp)
748 {
749         ddt_t *ddt;
750         ddt_entry_t dde;
751
752         if (!zfs_dedup_prefetch || bp == NULL || !BP_GET_DEDUP(bp))
753                 return;
754
755         /*
756          * We only remove the DDT once all tables are empty and only
757          * prefetch dedup blocks when there are entries in the DDT.
758          * Thus no locking is required as the DDT can't disappear on us.
759          */
760         ddt = ddt_select(spa, bp);
761         ddt_key_fill(&dde.dde_key, bp);
762
763         for (enum ddt_type type = 0; type < DDT_TYPES; type++) {
764                 for (enum ddt_class class = 0; class < DDT_CLASSES; class++) {
765                         ddt_object_prefetch(ddt, type, class, &dde);
766                 }
767         }
768 }
769
770 int
771 ddt_entry_compare(const void *x1, const void *x2)
772 {
773         const ddt_entry_t *dde1 = x1;
774         const ddt_entry_t *dde2 = x2;
775         const uint64_t *u1 = (const uint64_t *)&dde1->dde_key;
776         const uint64_t *u2 = (const uint64_t *)&dde2->dde_key;
777
778         for (int i = 0; i < DDT_KEY_WORDS; i++) {
779                 if (u1[i] < u2[i])
780                         return (-1);
781                 if (u1[i] > u2[i])
782                         return (1);
783         }
784
785         return (0);
786 }
787
788 static ddt_t *
789 ddt_table_alloc(spa_t *spa, enum zio_checksum c)
790 {
791         ddt_t *ddt;
792
793         ddt = kmem_zalloc(sizeof (*ddt), KM_SLEEP);
794
795         mutex_init(&ddt->ddt_lock, NULL, MUTEX_DEFAULT, NULL);
796         avl_create(&ddt->ddt_tree, ddt_entry_compare,
797             sizeof (ddt_entry_t), offsetof(ddt_entry_t, dde_node));
798         avl_create(&ddt->ddt_repair_tree, ddt_entry_compare,
799             sizeof (ddt_entry_t), offsetof(ddt_entry_t, dde_node));
800         ddt->ddt_checksum = c;
801         ddt->ddt_spa = spa;
802         ddt->ddt_os = spa->spa_meta_objset;
803
804         return (ddt);
805 }
806
807 static void
808 ddt_table_free(ddt_t *ddt)
809 {
810         ASSERT(avl_numnodes(&ddt->ddt_tree) == 0);
811         ASSERT(avl_numnodes(&ddt->ddt_repair_tree) == 0);
812         avl_destroy(&ddt->ddt_tree);
813         avl_destroy(&ddt->ddt_repair_tree);
814         mutex_destroy(&ddt->ddt_lock);
815         kmem_free(ddt, sizeof (*ddt));
816 }
817
818 void
819 ddt_create(spa_t *spa)
820 {
821         spa->spa_dedup_checksum = ZIO_DEDUPCHECKSUM;
822
823         for (enum zio_checksum c = 0; c < ZIO_CHECKSUM_FUNCTIONS; c++)
824                 spa->spa_ddt[c] = ddt_table_alloc(spa, c);
825 }
826
827 int
828 ddt_load(spa_t *spa)
829 {
830         int error;
831
832         ddt_create(spa);
833
834         error = zap_lookup(spa->spa_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
835             DMU_POOL_DDT_STATS, sizeof (uint64_t), 1,
836             &spa->spa_ddt_stat_object);
837
838         if (error)
839                 return (error == ENOENT ? 0 : error);
840
841         for (enum zio_checksum c = 0; c < ZIO_CHECKSUM_FUNCTIONS; c++) {
842                 ddt_t *ddt = spa->spa_ddt[c];
843                 for (enum ddt_type type = 0; type < DDT_TYPES; type++) {
844                         for (enum ddt_class class = 0; class < DDT_CLASSES;
845                             class++) {
846                                 error = ddt_object_load(ddt, type, class);
847                                 if (error != 0 && error != ENOENT)
848                                         return (error);
849                         }
850                 }
851
852                 /*
853                  * Seed the cached histograms.
854                  */
855                 bcopy(ddt->ddt_histogram, &ddt->ddt_histogram_cache,
856                     sizeof (ddt->ddt_histogram));
857         }
858
859         return (0);
860 }
861
862 void
863 ddt_unload(spa_t *spa)
864 {
865         for (enum zio_checksum c = 0; c < ZIO_CHECKSUM_FUNCTIONS; c++) {
866                 if (spa->spa_ddt[c]) {
867                         ddt_table_free(spa->spa_ddt[c]);
868                         spa->spa_ddt[c] = NULL;
869                 }
870         }
871 }
872
873 boolean_t
874 ddt_class_contains(spa_t *spa, enum ddt_class max_class, const blkptr_t *bp)
875 {
876         ddt_t *ddt;
877         ddt_entry_t dde;
878
879         if (!BP_GET_DEDUP(bp))
880                 return (B_FALSE);
881
882         if (max_class == DDT_CLASS_UNIQUE)
883                 return (B_TRUE);
884
885         ddt = spa->spa_ddt[BP_GET_CHECKSUM(bp)];
886
887         ddt_key_fill(&dde.dde_key, bp);
888
889         for (enum ddt_type type = 0; type < DDT_TYPES; type++)
890                 for (enum ddt_class class = 0; class <= max_class; class++)
891                         if (ddt_object_lookup(ddt, type, class, &dde) == 0)
892                                 return (B_TRUE);
893
894         return (B_FALSE);
895 }
896
897 ddt_entry_t *
898 ddt_repair_start(ddt_t *ddt, const blkptr_t *bp)
899 {
900         ddt_key_t ddk;
901         ddt_entry_t *dde;
902
903         ddt_key_fill(&ddk, bp);
904
905         dde = ddt_alloc(&ddk);
906
907         for (enum ddt_type type = 0; type < DDT_TYPES; type++) {
908                 for (enum ddt_class class = 0; class < DDT_CLASSES; class++) {
909                         /*
910                          * We can only do repair if there are multiple copies
911                          * of the block.  For anything in the UNIQUE class,
912                          * there's definitely only one copy, so don't even try.
913                          */
914                         if (class != DDT_CLASS_UNIQUE &&
915                             ddt_object_lookup(ddt, type, class, dde) == 0)
916                                 return (dde);
917                 }
918         }
919
920         bzero(dde->dde_phys, sizeof (dde->dde_phys));
921
922         return (dde);
923 }
924
925 void
926 ddt_repair_done(ddt_t *ddt, ddt_entry_t *dde)
927 {
928         avl_index_t where;
929
930         ddt_enter(ddt);
931
932         if (dde->dde_repair_data != NULL && spa_writeable(ddt->ddt_spa) &&
933             avl_find(&ddt->ddt_repair_tree, dde, &where) == NULL)
934                 avl_insert(&ddt->ddt_repair_tree, dde, where);
935         else
936                 ddt_free(dde);
937
938         ddt_exit(ddt);
939 }
940
941 static void
942 ddt_repair_entry_done(zio_t *zio)
943 {
944         ddt_entry_t *rdde = zio->io_private;
945
946         ddt_free(rdde);
947 }
948
949 static void
950 ddt_repair_entry(ddt_t *ddt, ddt_entry_t *dde, ddt_entry_t *rdde, zio_t *rio)
951 {
952         ddt_phys_t *ddp = dde->dde_phys;
953         ddt_phys_t *rddp = rdde->dde_phys;
954         ddt_key_t *ddk = &dde->dde_key;
955         ddt_key_t *rddk = &rdde->dde_key;
956         zio_t *zio;
957         blkptr_t blk;
958
959         zio = zio_null(rio, rio->io_spa, NULL,
960             ddt_repair_entry_done, rdde, rio->io_flags);
961
962         for (int p = 0; p < DDT_PHYS_TYPES; p++, ddp++, rddp++) {
963                 if (ddp->ddp_phys_birth == 0 ||
964                     ddp->ddp_phys_birth != rddp->ddp_phys_birth ||
965                     bcmp(ddp->ddp_dva, rddp->ddp_dva, sizeof (ddp->ddp_dva)))
966                         continue;
967                 ddt_bp_create(ddt->ddt_checksum, ddk, ddp, &blk);
968                 zio_nowait(zio_rewrite(zio, zio->io_spa, 0, &blk,
969                     rdde->dde_repair_data, DDK_GET_PSIZE(rddk), NULL, NULL,
970                     ZIO_PRIORITY_SYNC_WRITE, ZIO_DDT_CHILD_FLAGS(zio), NULL));
971         }
972
973         zio_nowait(zio);
974 }
975
976 static void
977 ddt_repair_table(ddt_t *ddt, zio_t *rio)
978 {
979         spa_t *spa = ddt->ddt_spa;
980         ddt_entry_t *dde, *rdde_next, *rdde;
981         avl_tree_t *t = &ddt->ddt_repair_tree;
982         blkptr_t blk;
983
984         if (spa_sync_pass(spa) > 1)
985                 return;
986
987         ddt_enter(ddt);
988         for (rdde = avl_first(t); rdde != NULL; rdde = rdde_next) {
989                 rdde_next = AVL_NEXT(t, rdde);
990                 avl_remove(&ddt->ddt_repair_tree, rdde);
991                 ddt_exit(ddt);
992                 ddt_bp_create(ddt->ddt_checksum, &rdde->dde_key, NULL, &blk);
993                 dde = ddt_repair_start(ddt, &blk);
994                 ddt_repair_entry(ddt, dde, rdde, rio);
995                 ddt_repair_done(ddt, dde);
996                 ddt_enter(ddt);
997         }
998         ddt_exit(ddt);
999 }
1000
1001 static void
1002 ddt_sync_entry(ddt_t *ddt, ddt_entry_t *dde, dmu_tx_t *tx, uint64_t txg)
1003 {
1004         dsl_pool_t *dp = ddt->ddt_spa->spa_dsl_pool;
1005         ddt_phys_t *ddp = dde->dde_phys;
1006         ddt_key_t *ddk = &dde->dde_key;
1007         enum ddt_type otype = dde->dde_type;
1008         enum ddt_type ntype = DDT_TYPE_CURRENT;
1009         enum ddt_class oclass = dde->dde_class;
1010         enum ddt_class nclass;
1011         uint64_t total_refcnt = 0;
1012
1013         ASSERT(dde->dde_loaded);
1014         ASSERT(!dde->dde_loading);
1015
1016         for (int p = 0; p < DDT_PHYS_TYPES; p++, ddp++) {
1017                 ASSERT(dde->dde_lead_zio[p] == NULL);
1018                 ASSERT((int64_t)ddp->ddp_refcnt >= 0);
1019                 if (ddp->ddp_phys_birth == 0) {
1020                         ASSERT(ddp->ddp_refcnt == 0);
1021                         continue;
1022                 }
1023                 if (p == DDT_PHYS_DITTO) {
1024                         if (ddt_ditto_copies_needed(ddt, dde, NULL) == 0)
1025                                 ddt_phys_free(ddt, ddk, ddp, txg);
1026                         continue;
1027                 }
1028                 if (ddp->ddp_refcnt == 0)
1029                         ddt_phys_free(ddt, ddk, ddp, txg);
1030                 total_refcnt += ddp->ddp_refcnt;
1031         }
1032
1033         if (dde->dde_phys[DDT_PHYS_DITTO].ddp_phys_birth != 0)
1034                 nclass = DDT_CLASS_DITTO;
1035         else if (total_refcnt > 1)
1036                 nclass = DDT_CLASS_DUPLICATE;
1037         else
1038                 nclass = DDT_CLASS_UNIQUE;
1039
1040         if (otype != DDT_TYPES &&
1041             (otype != ntype || oclass != nclass || total_refcnt == 0)) {
1042                 VERIFY(ddt_object_remove(ddt, otype, oclass, dde, tx) == 0);
1043                 ASSERT(ddt_object_lookup(ddt, otype, oclass, dde) == ENOENT);
1044         }
1045
1046         if (total_refcnt != 0) {
1047                 dde->dde_type = ntype;
1048                 dde->dde_class = nclass;
1049                 ddt_stat_update(ddt, dde, 0);
1050                 if (!ddt_object_exists(ddt, ntype, nclass))
1051                         ddt_object_create(ddt, ntype, nclass, tx);
1052                 VERIFY(ddt_object_update(ddt, ntype, nclass, dde, tx) == 0);
1053
1054                 /*
1055                  * If the class changes, the order that we scan this bp
1056                  * changes.  If it decreases, we could miss it, so
1057                  * scan it right now.  (This covers both class changing
1058                  * while we are doing ddt_walk(), and when we are
1059                  * traversing.)
1060                  */
1061                 if (nclass < oclass) {
1062                         dsl_scan_ddt_entry(dp->dp_scan,
1063                             ddt->ddt_checksum, dde, tx);
1064                 }
1065         }
1066 }
1067
1068 static void
1069 ddt_sync_table(ddt_t *ddt, dmu_tx_t *tx, uint64_t txg)
1070 {
1071         spa_t *spa = ddt->ddt_spa;
1072         ddt_entry_t *dde;
1073         void *cookie = NULL;
1074
1075         if (avl_numnodes(&ddt->ddt_tree) == 0)
1076                 return;
1077
1078         ASSERT(spa->spa_uberblock.ub_version >= SPA_VERSION_DEDUP);
1079
1080         if (spa->spa_ddt_stat_object == 0) {
1081                 spa->spa_ddt_stat_object = zap_create_link(ddt->ddt_os,
1082                     DMU_OT_DDT_STATS, DMU_POOL_DIRECTORY_OBJECT,
1083                     DMU_POOL_DDT_STATS, tx);
1084         }
1085
1086         while ((dde = avl_destroy_nodes(&ddt->ddt_tree, &cookie)) != NULL) {
1087                 ddt_sync_entry(ddt, dde, tx, txg);
1088                 ddt_free(dde);
1089         }
1090
1091         for (enum ddt_type type = 0; type < DDT_TYPES; type++) {
1092                 uint64_t add, count = 0;
1093                 for (enum ddt_class class = 0; class < DDT_CLASSES; class++) {
1094                         if (ddt_object_exists(ddt, type, class)) {
1095                                 ddt_object_sync(ddt, type, class, tx);
1096                                 VERIFY(ddt_object_count(ddt, type, class,
1097                                     &add) == 0);
1098                                 count += add;
1099                         }
1100                 }
1101                 for (enum ddt_class class = 0; class < DDT_CLASSES; class++) {
1102                         if (count == 0 && ddt_object_exists(ddt, type, class))
1103                                 ddt_object_destroy(ddt, type, class, tx);
1104                 }
1105         }
1106
1107         bcopy(ddt->ddt_histogram, &ddt->ddt_histogram_cache,
1108             sizeof (ddt->ddt_histogram));
1109 }
1110
1111 void
1112 ddt_sync(spa_t *spa, uint64_t txg)
1113 {
1114         dmu_tx_t *tx;
1115         zio_t *rio = zio_root(spa, NULL, NULL,
1116             ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE);
1117
1118         ASSERT(spa_syncing_txg(spa) == txg);
1119
1120         tx = dmu_tx_create_assigned(spa->spa_dsl_pool, txg);
1121
1122         for (enum zio_checksum c = 0; c < ZIO_CHECKSUM_FUNCTIONS; c++) {
1123                 ddt_t *ddt = spa->spa_ddt[c];
1124                 if (ddt == NULL)
1125                         continue;
1126                 ddt_sync_table(ddt, tx, txg);
1127                 ddt_repair_table(ddt, rio);
1128         }
1129
1130         (void) zio_wait(rio);
1131
1132         dmu_tx_commit(tx);
1133 }
1134
1135 int
1136 ddt_walk(spa_t *spa, ddt_bookmark_t *ddb, ddt_entry_t *dde)
1137 {
1138         do {
1139                 do {
1140                         do {
1141                                 ddt_t *ddt = spa->spa_ddt[ddb->ddb_checksum];
1142                                 int error = ENOENT;
1143                                 if (ddt_object_exists(ddt, ddb->ddb_type,
1144                                     ddb->ddb_class)) {
1145                                         error = ddt_object_walk(ddt,
1146                                             ddb->ddb_type, ddb->ddb_class,
1147                                             &ddb->ddb_cursor, dde);
1148                                 }
1149                                 dde->dde_type = ddb->ddb_type;
1150                                 dde->dde_class = ddb->ddb_class;
1151                                 if (error == 0)
1152                                         return (0);
1153                                 if (error != ENOENT)
1154                                         return (error);
1155                                 ddb->ddb_cursor = 0;
1156                         } while (++ddb->ddb_checksum < ZIO_CHECKSUM_FUNCTIONS);
1157                         ddb->ddb_checksum = 0;
1158                 } while (++ddb->ddb_type < DDT_TYPES);
1159                 ddb->ddb_type = 0;
1160         } while (++ddb->ddb_class < DDT_CLASSES);
1161
1162         return (SET_ERROR(ENOENT));
1163 }