Lines Matching refs:bpo
96 bpobj_t bpo; in bpobj_free() local
102 VERIFY3U(0, ==, bpobj_open(&bpo, os, obj)); in bpobj_free()
104 mutex_enter(&bpo.bpo_lock); in bpobj_free()
106 if (!bpo.bpo_havesubobj || bpo.bpo_phys->bpo_subobjs == 0) in bpobj_free()
109 VERIFY3U(0, ==, dmu_object_info(os, bpo.bpo_phys->bpo_subobjs, &doi)); in bpobj_free()
112 for (i = bpo.bpo_phys->bpo_num_subobjs - 1; i >= 0; i--) { in bpobj_free()
123 bpo.bpo_phys->bpo_subobjs, offset, FTAG, &dbuf, 0)); in bpobj_free()
136 VERIFY3U(0, ==, dmu_object_free(os, bpo.bpo_phys->bpo_subobjs, tx)); in bpobj_free()
139 mutex_exit(&bpo.bpo_lock); in bpobj_free()
140 bpobj_close(&bpo); in bpobj_free()
146 bpobj_open(bpobj_t *bpo, objset_t *os, uint64_t object) in bpobj_open() argument
155 bzero(bpo, sizeof (*bpo)); in bpobj_open()
156 mutex_init(&bpo->bpo_lock, NULL, MUTEX_DEFAULT, NULL); in bpobj_open()
158 ASSERT(bpo->bpo_dbuf == NULL); in bpobj_open()
159 ASSERT(bpo->bpo_phys == NULL); in bpobj_open()
164 err = dmu_bonus_hold(os, object, bpo, &bpo->bpo_dbuf); in bpobj_open()
168 bpo->bpo_os = os; in bpobj_open()
169 bpo->bpo_object = object; in bpobj_open()
170 bpo->bpo_epb = doi.doi_data_block_size >> SPA_BLKPTRSHIFT; in bpobj_open()
171 bpo->bpo_havecomp = (doi.doi_bonus_size > BPOBJ_SIZE_V0); in bpobj_open()
172 bpo->bpo_havesubobj = (doi.doi_bonus_size > BPOBJ_SIZE_V1); in bpobj_open()
173 bpo->bpo_phys = bpo->bpo_dbuf->db_data; in bpobj_open()
178 bpobj_close(bpobj_t *bpo) in bpobj_close() argument
181 if (bpo->bpo_object == 0) in bpobj_close()
184 dmu_buf_rele(bpo->bpo_dbuf, bpo); in bpobj_close()
185 if (bpo->bpo_cached_dbuf != NULL) in bpobj_close()
186 dmu_buf_rele(bpo->bpo_cached_dbuf, bpo); in bpobj_close()
187 bpo->bpo_dbuf = NULL; in bpobj_close()
188 bpo->bpo_phys = NULL; in bpobj_close()
189 bpo->bpo_cached_dbuf = NULL; in bpobj_close()
190 bpo->bpo_object = 0; in bpobj_close()
192 mutex_destroy(&bpo->bpo_lock); in bpobj_close()
196 bpobj_hasentries(bpobj_t *bpo) in bpobj_hasentries() argument
198 return (bpo->bpo_phys->bpo_num_blkptrs != 0 || in bpobj_hasentries()
199 (bpo->bpo_havesubobj && bpo->bpo_phys->bpo_num_subobjs != 0)); in bpobj_hasentries()
203 bpobj_iterate_impl(bpobj_t *bpo, bpobj_itor_t func, void *arg, dmu_tx_t *tx, in bpobj_iterate_impl() argument
212 mutex_enter(&bpo->bpo_lock); in bpobj_iterate_impl()
215 dmu_buf_will_dirty(bpo->bpo_dbuf, tx); in bpobj_iterate_impl()
217 for (i = bpo->bpo_phys->bpo_num_blkptrs - 1; i >= 0; i--) { in bpobj_iterate_impl()
223 blkoff = P2PHASE(i, bpo->bpo_epb); in bpobj_iterate_impl()
228 err = dmu_buf_hold(bpo->bpo_os, bpo->bpo_object, offset, in bpobj_iterate_impl()
243 bpo->bpo_phys->bpo_bytes -= in bpobj_iterate_impl()
244 bp_get_dsize_sync(dmu_objset_spa(bpo->bpo_os), bp); in bpobj_iterate_impl()
245 ASSERT3S(bpo->bpo_phys->bpo_bytes, >=, 0); in bpobj_iterate_impl()
246 if (bpo->bpo_havecomp) { in bpobj_iterate_impl()
247 bpo->bpo_phys->bpo_comp -= BP_GET_PSIZE(bp); in bpobj_iterate_impl()
248 bpo->bpo_phys->bpo_uncomp -= BP_GET_UCSIZE(bp); in bpobj_iterate_impl()
250 bpo->bpo_phys->bpo_num_blkptrs--; in bpobj_iterate_impl()
251 ASSERT3S(bpo->bpo_phys->bpo_num_blkptrs, >=, 0); in bpobj_iterate_impl()
259 VERIFY3U(0, ==, dmu_free_range(bpo->bpo_os, bpo->bpo_object, in bpobj_iterate_impl()
262 if (err || !bpo->bpo_havesubobj || bpo->bpo_phys->bpo_subobjs == 0) in bpobj_iterate_impl()
265 ASSERT(bpo->bpo_havecomp); in bpobj_iterate_impl()
266 err = dmu_object_info(bpo->bpo_os, bpo->bpo_phys->bpo_subobjs, &doi); in bpobj_iterate_impl()
268 mutex_exit(&bpo->bpo_lock); in bpobj_iterate_impl()
274 for (i = bpo->bpo_phys->bpo_num_subobjs - 1; i >= 0; i--) { in bpobj_iterate_impl()
287 err = dmu_buf_hold(bpo->bpo_os, in bpobj_iterate_impl()
288 bpo->bpo_phys->bpo_subobjs, offset, FTAG, &dbuf, 0); in bpobj_iterate_impl()
297 err = bpobj_open(&sublist, bpo->bpo_os, objarray[blkoff]); in bpobj_iterate_impl()
312 bpo->bpo_phys->bpo_bytes -= used_before - used_after; in bpobj_iterate_impl()
313 ASSERT3S(bpo->bpo_phys->bpo_bytes, >=, 0); in bpobj_iterate_impl()
314 bpo->bpo_phys->bpo_comp -= comp_before - comp_after; in bpobj_iterate_impl()
315 bpo->bpo_phys->bpo_uncomp -= in bpobj_iterate_impl()
323 err = dmu_object_free(bpo->bpo_os, in bpobj_iterate_impl()
327 bpo->bpo_phys->bpo_num_subobjs--; in bpobj_iterate_impl()
328 ASSERT3S(bpo->bpo_phys->bpo_num_subobjs, >=, 0); in bpobj_iterate_impl()
336 VERIFY3U(0, ==, dmu_free_range(bpo->bpo_os, in bpobj_iterate_impl()
337 bpo->bpo_phys->bpo_subobjs, in bpobj_iterate_impl()
343 if (!bpobj_hasentries(bpo)) { in bpobj_iterate_impl()
344 ASSERT0(bpo->bpo_phys->bpo_bytes); in bpobj_iterate_impl()
345 ASSERT0(bpo->bpo_phys->bpo_comp); in bpobj_iterate_impl()
346 ASSERT0(bpo->bpo_phys->bpo_uncomp); in bpobj_iterate_impl()
349 mutex_exit(&bpo->bpo_lock); in bpobj_iterate_impl()
358 bpobj_iterate(bpobj_t *bpo, bpobj_itor_t func, void *arg, dmu_tx_t *tx) in bpobj_iterate() argument
360 return (bpobj_iterate_impl(bpo, func, arg, tx, B_TRUE)); in bpobj_iterate()
367 bpobj_iterate_nofree(bpobj_t *bpo, bpobj_itor_t func, void *arg, dmu_tx_t *tx) in bpobj_iterate_nofree() argument
369 return (bpobj_iterate_impl(bpo, func, arg, tx, B_FALSE)); in bpobj_iterate_nofree()
373 bpobj_enqueue_subobj(bpobj_t *bpo, uint64_t subobj, dmu_tx_t *tx) in bpobj_enqueue_subobj() argument
378 ASSERT(bpo->bpo_havesubobj); in bpobj_enqueue_subobj()
379 ASSERT(bpo->bpo_havecomp); in bpobj_enqueue_subobj()
380 ASSERT(bpo->bpo_object != dmu_objset_pool(bpo->bpo_os)->dp_empty_bpobj); in bpobj_enqueue_subobj()
382 if (subobj == dmu_objset_pool(bpo->bpo_os)->dp_empty_bpobj) { in bpobj_enqueue_subobj()
383 bpobj_decr_empty(bpo->bpo_os, tx); in bpobj_enqueue_subobj()
387 VERIFY3U(0, ==, bpobj_open(&subbpo, bpo->bpo_os, subobj)); in bpobj_enqueue_subobj()
393 bpobj_free(bpo->bpo_os, subobj, tx); in bpobj_enqueue_subobj()
397 dmu_buf_will_dirty(bpo->bpo_dbuf, tx); in bpobj_enqueue_subobj()
398 if (bpo->bpo_phys->bpo_subobjs == 0) { in bpobj_enqueue_subobj()
399 bpo->bpo_phys->bpo_subobjs = dmu_object_alloc(bpo->bpo_os, in bpobj_enqueue_subobj()
405 ASSERT0(dmu_object_info(bpo->bpo_os, bpo->bpo_phys->bpo_subobjs, &doi)); in bpobj_enqueue_subobj()
408 mutex_enter(&bpo->bpo_lock); in bpobj_enqueue_subobj()
409 dmu_write(bpo->bpo_os, bpo->bpo_phys->bpo_subobjs, in bpobj_enqueue_subobj()
410 bpo->bpo_phys->bpo_num_subobjs * sizeof (subobj), in bpobj_enqueue_subobj()
412 bpo->bpo_phys->bpo_num_subobjs++; in bpobj_enqueue_subobj()
423 VERIFY3U(0, ==, dmu_object_info(bpo->bpo_os, subsubobjs, &doi)); in bpobj_enqueue_subobj()
428 VERIFY3U(0, ==, dmu_buf_hold(bpo->bpo_os, subsubobjs, in bpobj_enqueue_subobj()
436 dmu_write(bpo->bpo_os, bpo->bpo_phys->bpo_subobjs, in bpobj_enqueue_subobj()
437 bpo->bpo_phys->bpo_num_subobjs * sizeof (subobj), in bpobj_enqueue_subobj()
440 bpo->bpo_phys->bpo_num_subobjs += numsubsub; in bpobj_enqueue_subobj()
444 VERIFY3U(0, ==, dmu_object_free(bpo->bpo_os, in bpobj_enqueue_subobj()
448 bpo->bpo_phys->bpo_bytes += used; in bpobj_enqueue_subobj()
449 bpo->bpo_phys->bpo_comp += comp; in bpobj_enqueue_subobj()
450 bpo->bpo_phys->bpo_uncomp += uncomp; in bpobj_enqueue_subobj()
451 mutex_exit(&bpo->bpo_lock); in bpobj_enqueue_subobj()
457 bpobj_enqueue(bpobj_t *bpo, const blkptr_t *bp, dmu_tx_t *tx) in bpobj_enqueue() argument
465 ASSERT(bpo->bpo_object != dmu_objset_pool(bpo->bpo_os)->dp_empty_bpobj); in bpobj_enqueue()
490 mutex_enter(&bpo->bpo_lock); in bpobj_enqueue()
492 offset = bpo->bpo_phys->bpo_num_blkptrs * sizeof (stored_bp); in bpobj_enqueue()
493 blkoff = P2PHASE(bpo->bpo_phys->bpo_num_blkptrs, bpo->bpo_epb); in bpobj_enqueue()
495 if (bpo->bpo_cached_dbuf == NULL || in bpobj_enqueue()
496 offset < bpo->bpo_cached_dbuf->db_offset || in bpobj_enqueue()
497 offset >= bpo->bpo_cached_dbuf->db_offset + in bpobj_enqueue()
498 bpo->bpo_cached_dbuf->db_size) { in bpobj_enqueue()
499 if (bpo->bpo_cached_dbuf) in bpobj_enqueue()
500 dmu_buf_rele(bpo->bpo_cached_dbuf, bpo); in bpobj_enqueue()
501 VERIFY3U(0, ==, dmu_buf_hold(bpo->bpo_os, bpo->bpo_object, in bpobj_enqueue()
502 offset, bpo, &bpo->bpo_cached_dbuf, 0)); in bpobj_enqueue()
505 dmu_buf_will_dirty(bpo->bpo_cached_dbuf, tx); in bpobj_enqueue()
506 bparray = bpo->bpo_cached_dbuf->db_data; in bpobj_enqueue()
509 dmu_buf_will_dirty(bpo->bpo_dbuf, tx); in bpobj_enqueue()
510 bpo->bpo_phys->bpo_num_blkptrs++; in bpobj_enqueue()
511 bpo->bpo_phys->bpo_bytes += in bpobj_enqueue()
512 bp_get_dsize_sync(dmu_objset_spa(bpo->bpo_os), bp); in bpobj_enqueue()
513 if (bpo->bpo_havecomp) { in bpobj_enqueue()
514 bpo->bpo_phys->bpo_comp += BP_GET_PSIZE(bp); in bpobj_enqueue()
515 bpo->bpo_phys->bpo_uncomp += BP_GET_UCSIZE(bp); in bpobj_enqueue()
517 mutex_exit(&bpo->bpo_lock); in bpobj_enqueue()
547 bpobj_space(bpobj_t *bpo, uint64_t *usedp, uint64_t *compp, uint64_t *uncompp) in bpobj_space() argument
549 mutex_enter(&bpo->bpo_lock); in bpobj_space()
551 *usedp = bpo->bpo_phys->bpo_bytes; in bpobj_space()
552 if (bpo->bpo_havecomp) { in bpobj_space()
553 *compp = bpo->bpo_phys->bpo_comp; in bpobj_space()
554 *uncompp = bpo->bpo_phys->bpo_uncomp; in bpobj_space()
555 mutex_exit(&bpo->bpo_lock); in bpobj_space()
558 mutex_exit(&bpo->bpo_lock); in bpobj_space()
559 return (bpobj_space_range(bpo, 0, UINT64_MAX, in bpobj_space()
569 bpobj_space_range(bpobj_t *bpo, uint64_t mintxg, uint64_t maxtxg, in bpobj_space_range() argument
579 if (mintxg < TXG_INITIAL && maxtxg == UINT64_MAX && bpo->bpo_havecomp) in bpobj_space_range()
580 return (bpobj_space(bpo, usedp, compp, uncompp)); in bpobj_space_range()
582 sra.spa = dmu_objset_spa(bpo->bpo_os); in bpobj_space_range()
586 err = bpobj_iterate_nofree(bpo, space_range_cb, &sra, NULL); in bpobj_space_range()