Lines Matching refs:ddt

31 #include <sys/ddt.h>
62 ddt_object_create(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
65 spa_t *spa = ddt->ddt_spa;
66 objset_t *os = ddt->ddt_os;
67 uint64_t *objectp = &ddt->ddt_object[type][class];
68 boolean_t prehash = zio_checksum_table[ddt->ddt_checksum].ci_dedup;
71 ddt_object_name(ddt, type, class, name);
82 &ddt->ddt_histogram[type][class], tx) == 0);
86 ddt_object_destroy(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
89 spa_t *spa = ddt->ddt_spa;
90 objset_t *os = ddt->ddt_os;
91 uint64_t *objectp = &ddt->ddt_object[type][class];
95 ddt_object_name(ddt, type, class, name);
98 VERIFY(ddt_object_count(ddt, type, class, &count) == 0 && count == 0);
99 ASSERT(ddt_histogram_empty(&ddt->ddt_histogram[type][class]));
103 bzero(&ddt->ddt_object_stats[type][class], sizeof (ddt_object_t));
109 ddt_object_load(ddt_t *ddt, enum ddt_type type, enum ddt_class class)
111 ddt_object_t *ddo = &ddt->ddt_object_stats[type][class];
117 ddt_object_name(ddt, type, class, name);
119 error = zap_lookup(ddt->ddt_os, DMU_POOL_DIRECTORY_OBJECT, name,
120 sizeof (uint64_t), 1, &ddt->ddt_object[type][class]);
125 VERIFY0(zap_lookup(ddt->ddt_os, ddt->ddt_spa->spa_ddt_stat_object, name,
127 &ddt->ddt_histogram[type][class]));
132 VERIFY(ddt_object_info(ddt, type, class, &doi) == 0);
134 error = ddt_object_count(ddt, type, class, &count);
146 ddt_object_sync(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
149 ddt_object_t *ddo = &ddt->ddt_object_stats[type][class];
154 ddt_object_name(ddt, type, class, name);
156 VERIFY(zap_update(ddt->ddt_os, ddt->ddt_spa->spa_ddt_stat_object, name,
158 &ddt->ddt_histogram[type][class], tx) == 0);
163 VERIFY(ddt_object_info(ddt, type, class, &doi) == 0);
164 VERIFY(ddt_object_count(ddt, type, class, &count) == 0);
172 ddt_object_lookup(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
175 if (!ddt_object_exists(ddt, type, class))
178 return (ddt_ops[type]->ddt_op_lookup(ddt->ddt_os,
179 ddt->ddt_object[type][class], dde));
183 ddt_object_prefetch(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
186 if (!ddt_object_exists(ddt, type, class))
189 ddt_ops[type]->ddt_op_prefetch(ddt->ddt_os,
190 ddt->ddt_object[type][class], dde);
194 ddt_object_update(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
197 ASSERT(ddt_object_exists(ddt, type, class));
199 return (ddt_ops[type]->ddt_op_update(ddt->ddt_os,
200 ddt->ddt_object[type][class], dde, tx));
204 ddt_object_remove(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
207 ASSERT(ddt_object_exists(ddt, type, class));
209 return (ddt_ops[type]->ddt_op_remove(ddt->ddt_os,
210 ddt->ddt_object[type][class], dde, tx));
214 ddt_object_walk(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
217 ASSERT(ddt_object_exists(ddt, type, class));
219 return (ddt_ops[type]->ddt_op_walk(ddt->ddt_os,
220 ddt->ddt_object[type][class], dde, walk));
224 ddt_object_count(ddt_t *ddt, enum ddt_type type, enum ddt_class class, uint64_t *count)
226 ASSERT(ddt_object_exists(ddt, type, class));
228 return (ddt_ops[type]->ddt_op_count(ddt->ddt_os,
229 ddt->ddt_object[type][class], count));
233 ddt_object_info(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
236 if (!ddt_object_exists(ddt, type, class))
239 return (dmu_object_info(ddt->ddt_os, ddt->ddt_object[type][class],
244 ddt_object_exists(ddt_t *ddt, enum ddt_type type, enum ddt_class class)
246 return (!!ddt->ddt_object[type][class]);
250 ddt_object_name(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
254 zio_checksum_table[ddt->ddt_checksum].ci_name,
331 ddt_phys_free(ddt_t *ddt, ddt_key_t *ddk, ddt_phys_t *ddp, uint64_t txg)
335 ddt_bp_create(ddt->ddt_checksum, ddk, ddp, &blk);
337 zio_free(ddt->ddt_spa, txg, &blk);
365 ddt_stat_generate(ddt_t *ddt, ddt_entry_t *dde, ddt_stat_t *dds)
367 spa_t *spa = ddt->ddt_spa;
411 ddt_stat_update(ddt_t *ddt, ddt_entry_t *dde, uint64_t neg)
417 ddt_stat_generate(ddt, dde, &dds);
422 ddh = &ddt->ddt_histogram[dde->dde_type][dde->dde_class];
461 ddt_t *ddt = spa->spa_ddt[c];
466 &ddt->ddt_object_stats[type][class];
485 ddt_t *ddt = spa->spa_ddt[c];
490 &ddt->ddt_histogram_cache[type][class]);
529 ddt_ditto_copies_needed(ddt_t *ddt, ddt_entry_t *dde, ddt_phys_t *ddp_willref)
531 spa_t *spa = ddt->ddt_spa;
635 ddt_enter(ddt_t *ddt)
637 mutex_enter(&ddt->ddt_lock);
641 ddt_exit(ddt_t *ddt)
643 mutex_exit(&ddt->ddt_lock);
676 ddt_remove(ddt_t *ddt, ddt_entry_t *dde)
678 ASSERT(MUTEX_HELD(&ddt->ddt_lock));
680 avl_remove(&ddt->ddt_tree, dde);
685 ddt_lookup(ddt_t *ddt, const blkptr_t *bp, boolean_t add)
693 ASSERT(MUTEX_HELD(&ddt->ddt_lock));
697 dde = avl_find(&ddt->ddt_tree, &dde_search, &where);
702 avl_insert(&ddt->ddt_tree, dde, where);
706 cv_wait(&dde->dde_cv, &ddt->ddt_lock);
713 ddt_exit(ddt);
719 error = ddt_object_lookup(ddt, type, class, dde);
729 ddt_enter(ddt);
740 ddt_stat_update(ddt, dde, -1ULL);
750 ddt_t *ddt;
761 ddt = ddt_select(spa, bp);
766 ddt_object_prefetch(ddt, type, class, &dde);
792 ddt_t *ddt;
794 ddt = kmem_zalloc(sizeof (*ddt), KM_SLEEP);
796 mutex_init(&ddt->ddt_lock, NULL, MUTEX_DEFAULT, NULL);
797 avl_create(&ddt->ddt_tree, ddt_entry_compare,
799 avl_create(&ddt->ddt_repair_tree, ddt_entry_compare,
801 ddt->ddt_checksum = c;
802 ddt->ddt_spa = spa;
803 ddt->ddt_os = spa->spa_meta_objset;
805 return (ddt);
809 ddt_table_free(ddt_t *ddt)
811 ASSERT(avl_numnodes(&ddt->ddt_tree) == 0);
812 ASSERT(avl_numnodes(&ddt->ddt_repair_tree) == 0);
813 avl_destroy(&ddt->ddt_tree);
814 avl_destroy(&ddt->ddt_repair_tree);
815 mutex_destroy(&ddt->ddt_lock);
816 kmem_free(ddt, sizeof (*ddt));
843 ddt_t *ddt = spa->spa_ddt[c];
847 error = ddt_object_load(ddt, type, class);
856 bcopy(ddt->ddt_histogram, &ddt->ddt_histogram_cache,
857 sizeof (ddt->ddt_histogram));
877 ddt_t *ddt;
886 ddt = spa->spa_ddt[BP_GET_CHECKSUM(bp)];
892 if (ddt_object_lookup(ddt, type, class, &dde) == 0)
899 ddt_repair_start(ddt_t *ddt, const blkptr_t *bp)
916 ddt_object_lookup(ddt, type, class, dde) == 0)
927 ddt_repair_done(ddt_t *ddt, ddt_entry_t *dde)
931 ddt_enter(ddt);
933 if (dde->dde_repair_data != NULL && spa_writeable(ddt->ddt_spa) &&
934 avl_find(&ddt->ddt_repair_tree, dde, &where) == NULL)
935 avl_insert(&ddt->ddt_repair_tree, dde, where);
939 ddt_exit(ddt);
951 ddt_repair_entry(ddt_t *ddt, ddt_entry_t *dde, ddt_entry_t *rdde, zio_t *rio)
968 ddt_bp_create(ddt->ddt_checksum, ddk, ddp, &blk);
978 ddt_repair_table(ddt_t *ddt, zio_t *rio)
980 spa_t *spa = ddt->ddt_spa;
982 avl_tree_t *t = &ddt->ddt_repair_tree;
988 ddt_enter(ddt);
991 avl_remove(&ddt->ddt_repair_tree, rdde);
992 ddt_exit(ddt);
993 ddt_bp_create(ddt->ddt_checksum, &rdde->dde_key, NULL, &blk);
994 dde = ddt_repair_start(ddt, &blk);
995 ddt_repair_entry(ddt, dde, rdde, rio);
996 ddt_repair_done(ddt, dde);
997 ddt_enter(ddt);
999 ddt_exit(ddt);
1003 ddt_sync_entry(ddt_t *ddt, ddt_entry_t *dde, dmu_tx_t *tx, uint64_t txg)
1005 dsl_pool_t *dp = ddt->ddt_spa->spa_dsl_pool;
1025 if (ddt_ditto_copies_needed(ddt, dde, NULL) == 0)
1026 ddt_phys_free(ddt, ddk, ddp, txg);
1030 ddt_phys_free(ddt, ddk, ddp, txg);
1043 VERIFY(ddt_object_remove(ddt, otype, oclass, dde, tx) == 0);
1044 ASSERT(ddt_object_lookup(ddt, otype, oclass, dde) == ENOENT);
1050 ddt_stat_update(ddt, dde, 0);
1051 if (!ddt_object_exists(ddt, ntype, nclass))
1052 ddt_object_create(ddt, ntype, nclass, tx);
1053 VERIFY(ddt_object_update(ddt, ntype, nclass, dde, tx) == 0);
1064 ddt->ddt_checksum, dde, tx);
1070 ddt_sync_table(ddt_t *ddt, dmu_tx_t *tx, uint64_t txg)
1072 spa_t *spa = ddt->ddt_spa;
1076 if (avl_numnodes(&ddt->ddt_tree) == 0)
1082 spa->spa_ddt_stat_object = zap_create_link(ddt->ddt_os,
1087 while ((dde = avl_destroy_nodes(&ddt->ddt_tree, &cookie)) != NULL) {
1088 ddt_sync_entry(ddt, dde, tx, txg);
1095 if (ddt_object_exists(ddt, type, class)) {
1096 ddt_object_sync(ddt, type, class, tx);
1097 VERIFY(ddt_object_count(ddt, type, class,
1103 if (count == 0 && ddt_object_exists(ddt, type, class))
1104 ddt_object_destroy(ddt, type, class, tx);
1108 bcopy(ddt->ddt_histogram, &ddt->ddt_histogram_cache,
1109 sizeof (ddt->ddt_histogram));
1124 ddt_t *ddt = spa->spa_ddt[c];
1125 if (ddt == NULL)
1127 ddt_sync_table(ddt, tx, txg);
1128 ddt_repair_table(ddt, rio);
1142 ddt_t *ddt = spa->spa_ddt[ddb->ddb_checksum];
1144 if (ddt_object_exists(ddt, ddb->ddb_type,
1146 error = ddt_object_walk(ddt,