161 {
162 if (!ddt_object_exists(ddt, type, class))
163 return (SET_ERROR(ENOENT));
164
165 return (ddt_ops[type]->ddt_op_lookup(ddt->ddt_os,
166 ddt->ddt_object[type][class], dde));
167 }
168
169 static void
170 ddt_object_prefetch(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
171 ddt_entry_t *dde)
172 {
173 if (!ddt_object_exists(ddt, type, class))
174 return;
175
176 ddt_ops[type]->ddt_op_prefetch(ddt->ddt_os,
177 ddt->ddt_object[type][class], dde);
178 }
179
180 int
181 ddt_object_update(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
182 ddt_entry_t *dde, dmu_tx_t *tx)
183 {
184 ASSERT(ddt_object_exists(ddt, type, class));
185
186 return (ddt_ops[type]->ddt_op_update(ddt->ddt_os,
187 ddt->ddt_object[type][class], dde, tx));
188 }
189
190 static int
191 ddt_object_remove(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
192 ddt_entry_t *dde, dmu_tx_t *tx)
193 {
194 ASSERT(ddt_object_exists(ddt, type, class));
195
196 return (ddt_ops[type]->ddt_op_remove(ddt->ddt_os,
197 ddt->ddt_object[type][class], dde, tx));
198 }
199
200 int
201 ddt_object_walk(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
202 uint64_t *walk, ddt_entry_t *dde)
203 {
204 ASSERT(ddt_object_exists(ddt, type, class));
205
206 return (ddt_ops[type]->ddt_op_walk(ddt->ddt_os,
207 ddt->ddt_object[type][class], dde, walk));
208 }
209
210 uint64_t
211 ddt_object_count(ddt_t *ddt, enum ddt_type type, enum ddt_class class)
212 {
213 ASSERT(ddt_object_exists(ddt, type, class));
214
215 return (ddt_ops[type]->ddt_op_count(ddt->ddt_os,
216 ddt->ddt_object[type][class]));
217 }
218
219 int
220 ddt_object_info(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
221 dmu_object_info_t *doi)
222 {
223 if (!ddt_object_exists(ddt, type, class))
224 return (SET_ERROR(ENOENT));
225
226 return (dmu_object_info(ddt->ddt_os, ddt->ddt_object[type][class],
227 doi));
228 }
229
230 boolean_t
231 ddt_object_exists(ddt_t *ddt, enum ddt_type type, enum ddt_class class)
232 {
233 return (!!ddt->ddt_object[type][class]);
234 }
235
236 void
237 ddt_object_name(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
238 char *name)
239 {
240 (void) sprintf(name, DMU_POOL_DDT,
241 zio_checksum_table[ddt->ddt_checksum].ci_name,
242 ddt_ops[type]->ddt_op_name, ddt_class_name[class]);
243 }
244
245 void
246 ddt_bp_fill(const ddt_phys_t *ddp, blkptr_t *bp, uint64_t txg)
247 {
248 ASSERT(txg != 0);
249
250 for (int d = 0; d < SPA_DVAS_PER_BP; d++)
251 bp->blk_dva[d] = ddp->ddp_dva[d];
252 BP_SET_BIRTH(bp, txg, ddp->ddp_phys_birth);
253 }
254
255 void
256 ddt_bp_create(enum zio_checksum checksum,
257 const ddt_key_t *ddk, const ddt_phys_t *ddp, blkptr_t *bp)
258 {
259 BP_ZERO(bp);
260
261 if (ddp != NULL)
262 ddt_bp_fill(ddp, bp, ddp->ddp_phys_birth);
|
161 {
162 if (!ddt_object_exists(ddt, type, class))
163 return (SET_ERROR(ENOENT));
164
165 return (ddt_ops[type]->ddt_op_lookup(ddt->ddt_os,
166 ddt->ddt_object[type][class], dde));
167 }
168
169 static void
170 ddt_object_prefetch(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
171 ddt_entry_t *dde)
172 {
173 if (!ddt_object_exists(ddt, type, class))
174 return;
175
176 ddt_ops[type]->ddt_op_prefetch(ddt->ddt_os,
177 ddt->ddt_object[type][class], dde);
178 }
179
180 int
181 ddt_object_update(ddt_t *ddt, enum ddt_type type, enum ddt_class ddt_class,
182 ddt_entry_t *dde, dmu_tx_t *tx)
183 {
184 ASSERT(ddt_object_exists(ddt, type, ddt_class));
185
186 return (ddt_ops[type]->ddt_op_update(ddt->ddt_os,
187 ddt->ddt_object[type][ddt_class], dde, tx));
188 }
189
190 static int
191 ddt_object_remove(ddt_t *ddt, enum ddt_type type, enum ddt_class class,
192 ddt_entry_t *dde, dmu_tx_t *tx)
193 {
194 ASSERT(ddt_object_exists(ddt, type, class));
195
196 return (ddt_ops[type]->ddt_op_remove(ddt->ddt_os,
197 ddt->ddt_object[type][class], dde, tx));
198 }
199
200 int
201 ddt_object_walk(ddt_t *ddt, enum ddt_type type, enum ddt_class ddt_class,
202 uint64_t *walk, ddt_entry_t *dde)
203 {
204 ASSERT(ddt_object_exists(ddt, type, ddt_class));
205
206 return (ddt_ops[type]->ddt_op_walk(ddt->ddt_os,
207 ddt->ddt_object[type][ddt_class], dde, walk));
208 }
209
210 uint64_t
211 ddt_object_count(ddt_t *ddt, enum ddt_type type, enum ddt_class ddt_class)
212 {
213 ASSERT(ddt_object_exists(ddt, type, ddt_class));
214
215 return (ddt_ops[type]->ddt_op_count(ddt->ddt_os,
216 ddt->ddt_object[type][ddt_class]));
217 }
218
219 int
220 ddt_object_info(ddt_t *ddt, enum ddt_type type, enum ddt_class ddt_class,
221 dmu_object_info_t *doi)
222 {
223 if (!ddt_object_exists(ddt, type, ddt_class))
224 return (SET_ERROR(ENOENT));
225
226 return (dmu_object_info(ddt->ddt_os, ddt->ddt_object[type][ddt_class],
227 doi));
228 }
229
230 boolean_t
231 ddt_object_exists(ddt_t *ddt, enum ddt_type type, enum ddt_class ddt_class)
232 {
233 return (!!ddt->ddt_object[type][ddt_class]);
234 }
235
236 void
237 ddt_object_name(ddt_t *ddt, enum ddt_type type, enum ddt_class ddt_class,
238 char *name)
239 {
240 (void) sprintf(name, DMU_POOL_DDT,
241 zio_checksum_table[ddt->ddt_checksum].ci_name,
242 ddt_ops[type]->ddt_op_name, ddt_class_name[ddt_class]);
243 }
244
245 void
246 ddt_bp_fill(const ddt_phys_t *ddp, blkptr_t *bp, uint64_t txg)
247 {
248 ASSERT(txg != 0);
249
250 for (int d = 0; d < SPA_DVAS_PER_BP; d++)
251 bp->blk_dva[d] = ddp->ddp_dva[d];
252 BP_SET_BIRTH(bp, txg, ddp->ddp_phys_birth);
253 }
254
255 void
256 ddt_bp_create(enum zio_checksum checksum,
257 const ddt_key_t *ddk, const ddt_phys_t *ddp, blkptr_t *bp)
258 {
259 BP_ZERO(bp);
260
261 if (ddp != NULL)
262 ddt_bp_fill(ddp, bp, ddp->ddp_phys_birth);
|