Lines Matching defs:ddt

31 #include <sys/ddt.h>
56 ddt_object_create(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
59 spa_t *spa = ddt->ddt_spa;
60 objset_t *os = ddt->ddt_os;
61 uint64_t *objectp = &ddt->ddt_object[type][class];
62 boolean_t prehash = zio_checksum_table[ddt->ddt_checksum].ci_flags &
66 ddt_object_name(ddt, type, class, name);
77 &ddt->ddt_histogram[type][class], tx) == 0);
81 ddt_object_destroy(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
84 spa_t *spa = ddt->ddt_spa;
85 objset_t *os = ddt->ddt_os;
86 uint64_t *objectp = &ddt->ddt_object[type][class];
89 ddt_object_name(ddt, type, class, name);
92 ASSERT(ddt_object_count(ddt, type, class) == 0);
93 ASSERT(ddt_histogram_empty(&ddt->ddt_histogram[type][class]));
97 bzero(&ddt->ddt_object_stats[type][class], sizeof (ddt_object_t));
103 ddt_object_load(ddt_t *ddt, enum ddt_type type, enum ddt_class class)
105 ddt_object_t *ddo = &ddt->ddt_object_stats[type][class];
110 ddt_object_name(ddt, type, class, name);
112 error = zap_lookup(ddt->ddt_os, DMU_POOL_DIRECTORY_OBJECT, name,
113 sizeof (uint64_t), 1, &ddt->ddt_object[type][class]);
118 VERIFY0(zap_lookup(ddt->ddt_os, ddt->ddt_spa->spa_ddt_stat_object, name,
120 &ddt->ddt_histogram[type][class]));
125 VERIFY(ddt_object_info(ddt, type, class, &doi) == 0);
127 ddo->ddo_count = ddt_object_count(ddt, type, class);
135 ddt_object_sync(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
138 ddt_object_t *ddo = &ddt->ddt_object_stats[type][class];
142 ddt_object_name(ddt, type, class, name);
144 VERIFY(zap_update(ddt->ddt_os, ddt->ddt_spa->spa_ddt_stat_object, name,
146 &ddt->ddt_histogram[type][class], tx) == 0);
151 VERIFY(ddt_object_info(ddt, type, class, &doi) == 0);
153 ddo->ddo_count = ddt_object_count(ddt, type, class);
159 ddt_object_lookup(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
162 if (!ddt_object_exists(ddt, type, class))
165 return (ddt_ops[type]->ddt_op_lookup(ddt->ddt_os,
166 ddt->ddt_object[type][class], dde));
170 ddt_object_prefetch(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
173 if (!ddt_object_exists(ddt, type, class))
176 ddt_ops[type]->ddt_op_prefetch(ddt->ddt_os,
177 ddt->ddt_object[type][class], dde);
181 ddt_object_update(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
184 ASSERT(ddt_object_exists(ddt, type, class));
186 return (ddt_ops[type]->ddt_op_update(ddt->ddt_os,
187 ddt->ddt_object[type][class], dde, tx));
191 ddt_object_remove(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
194 ASSERT(ddt_object_exists(ddt, type, class));
196 return (ddt_ops[type]->ddt_op_remove(ddt->ddt_os,
197 ddt->ddt_object[type][class], dde, tx));
201 ddt_object_walk(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
204 ASSERT(ddt_object_exists(ddt, type, class));
206 return (ddt_ops[type]->ddt_op_walk(ddt->ddt_os,
207 ddt->ddt_object[type][class], dde, walk));
211 ddt_object_count(ddt_t *ddt, enum ddt_type type, enum ddt_class class)
213 ASSERT(ddt_object_exists(ddt, type, class));
215 return (ddt_ops[type]->ddt_op_count(ddt->ddt_os,
216 ddt->ddt_object[type][class]));
220 ddt_object_info(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
223 if (!ddt_object_exists(ddt, type, class))
226 return (dmu_object_info(ddt->ddt_os, ddt->ddt_object[type][class],
231 ddt_object_exists(ddt_t *ddt, enum ddt_type type, enum ddt_class class)
233 return (!!ddt->ddt_object[type][class]);
237 ddt_object_name(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
241 zio_checksum_table[ddt->ddt_checksum].ci_name,
318 ddt_phys_free(ddt_t *ddt, ddt_key_t *ddk, ddt_phys_t *ddp, uint64_t txg)
322 ddt_bp_create(ddt->ddt_checksum, ddk, ddp, &blk);
324 zio_free(ddt->ddt_spa, txg, &blk);
352 ddt_stat_generate(ddt_t *ddt, ddt_entry_t *dde, ddt_stat_t *dds)
354 spa_t *spa = ddt->ddt_spa;
398 ddt_stat_update(ddt_t *ddt, ddt_entry_t *dde, uint64_t neg)
404 ddt_stat_generate(ddt, dde, &dds);
409 ddh = &ddt->ddt_histogram[dde->dde_type][dde->dde_class];
448 ddt_t *ddt = spa->spa_ddt[c];
453 &ddt->ddt_object_stats[type][class];
472 ddt_t *ddt = spa->spa_ddt[c];
477 &ddt->ddt_histogram_cache[type][class]);
516 ddt_ditto_copies_needed(ddt_t *ddt, ddt_entry_t *dde, ddt_phys_t *ddp_willref)
518 spa_t *spa = ddt->ddt_spa;
622 ddt_enter(ddt_t *ddt)
624 mutex_enter(&ddt->ddt_lock);
628 ddt_exit(ddt_t *ddt)
630 mutex_exit(&ddt->ddt_lock);
663 ddt_remove(ddt_t *ddt, ddt_entry_t *dde)
665 ASSERT(MUTEX_HELD(&ddt->ddt_lock));
667 avl_remove(&ddt->ddt_tree, dde);
672 ddt_lookup(ddt_t *ddt, const blkptr_t *bp, boolean_t add)
680 ASSERT(MUTEX_HELD(&ddt->ddt_lock));
684 dde = avl_find(&ddt->ddt_tree, &dde_search, &where);
689 avl_insert(&ddt->ddt_tree, dde, where);
693 cv_wait(&dde->dde_cv, &ddt->ddt_lock);
700 ddt_exit(ddt);
706 error = ddt_object_lookup(ddt, type, class, dde);
716 ddt_enter(ddt);
727 ddt_stat_update(ddt, dde, -1ULL);
737 ddt_t *ddt;
748 ddt = ddt_select(spa, bp);
753 ddt_object_prefetch(ddt, type, class, &dde);
779 ddt_t *ddt;
781 ddt = kmem_zalloc(sizeof (*ddt), KM_SLEEP);
783 mutex_init(&ddt->ddt_lock, NULL, MUTEX_DEFAULT, NULL);
784 avl_create(&ddt->ddt_tree, ddt_entry_compare,
786 avl_create(&ddt->ddt_repair_tree, ddt_entry_compare,
788 ddt->ddt_checksum = c;
789 ddt->ddt_spa = spa;
790 ddt->ddt_os = spa->spa_meta_objset;
792 return (ddt);
796 ddt_table_free(ddt_t *ddt)
798 ASSERT(avl_numnodes(&ddt->ddt_tree) == 0);
799 ASSERT(avl_numnodes(&ddt->ddt_repair_tree) == 0);
800 avl_destroy(&ddt->ddt_tree);
801 avl_destroy(&ddt->ddt_repair_tree);
802 mutex_destroy(&ddt->ddt_lock);
803 kmem_free(ddt, sizeof (*ddt));
830 ddt_t *ddt = spa->spa_ddt[c];
834 error = ddt_object_load(ddt, type, class);
843 bcopy(ddt->ddt_histogram, &ddt->ddt_histogram_cache,
844 sizeof (ddt->ddt_histogram));
864 ddt_t *ddt;
873 ddt = spa->spa_ddt[BP_GET_CHECKSUM(bp)];
879 if (ddt_object_lookup(ddt, type, class, &dde) == 0)
886 ddt_repair_start(ddt_t *ddt, const blkptr_t *bp)
903 ddt_object_lookup(ddt, type, class, dde) == 0)
914 ddt_repair_done(ddt_t *ddt, ddt_entry_t *dde)
918 ddt_enter(ddt);
920 if (dde->dde_repair_data != NULL && spa_writeable(ddt->ddt_spa) &&
921 avl_find(&ddt->ddt_repair_tree, dde, &where) == NULL)
922 avl_insert(&ddt->ddt_repair_tree, dde, where);
926 ddt_exit(ddt);
938 ddt_repair_entry(ddt_t *ddt, ddt_entry_t *dde, ddt_entry_t *rdde, zio_t *rio)
955 ddt_bp_create(ddt->ddt_checksum, ddk, ddp, &blk);
965 ddt_repair_table(ddt_t *ddt, zio_t *rio)
967 spa_t *spa = ddt->ddt_spa;
969 avl_tree_t *t = &ddt->ddt_repair_tree;
975 ddt_enter(ddt);
978 avl_remove(&ddt->ddt_repair_tree, rdde);
979 ddt_exit(ddt);
980 ddt_bp_create(ddt->ddt_checksum, &rdde->dde_key, NULL, &blk);
981 dde = ddt_repair_start(ddt, &blk);
982 ddt_repair_entry(ddt, dde, rdde, rio);
983 ddt_repair_done(ddt, dde);
984 ddt_enter(ddt);
986 ddt_exit(ddt);
990 ddt_sync_entry(ddt_t *ddt, ddt_entry_t *dde, dmu_tx_t *tx, uint64_t txg)
992 dsl_pool_t *dp = ddt->ddt_spa->spa_dsl_pool;
1012 if (ddt_ditto_copies_needed(ddt, dde, NULL) == 0)
1013 ddt_phys_free(ddt, ddk, ddp, txg);
1017 ddt_phys_free(ddt, ddk, ddp, txg);
1030 VERIFY(ddt_object_remove(ddt, otype, oclass, dde, tx) == 0);
1031 ASSERT(ddt_object_lookup(ddt, otype, oclass, dde) == ENOENT);
1037 ddt_stat_update(ddt, dde, 0);
1038 if (!ddt_object_exists(ddt, ntype, nclass))
1039 ddt_object_create(ddt, ntype, nclass, tx);
1040 VERIFY(ddt_object_update(ddt, ntype, nclass, dde, tx) == 0);
1051 ddt->ddt_checksum, dde, tx);
1057 ddt_sync_table(ddt_t *ddt, dmu_tx_t *tx, uint64_t txg)
1059 spa_t *spa = ddt->ddt_spa;
1063 if (avl_numnodes(&ddt->ddt_tree) == 0)
1069 spa->spa_ddt_stat_object = zap_create_link(ddt->ddt_os,
1074 while ((dde = avl_destroy_nodes(&ddt->ddt_tree, &cookie)) != NULL) {
1075 ddt_sync_entry(ddt, dde, tx, txg);
1082 if (ddt_object_exists(ddt, type, class)) {
1083 ddt_object_sync(ddt, type, class, tx);
1084 count += ddt_object_count(ddt, type, class);
1088 if (count == 0 && ddt_object_exists(ddt, type, class))
1089 ddt_object_destroy(ddt, type, class, tx);
1093 bcopy(ddt->ddt_histogram, &ddt->ddt_histogram_cache,
1094 sizeof (ddt->ddt_histogram));
1109 ddt_t *ddt = spa->spa_ddt[c];
1110 if (ddt == NULL)
1112 ddt_sync_table(ddt, tx, txg);
1113 ddt_repair_table(ddt, rio);
1127 ddt_t *ddt = spa->spa_ddt[ddb->ddb_checksum];
1129 if (ddt_object_exists(ddt, ddb->ddb_type,
1131 error = ddt_object_walk(ddt,