Lines Matching refs:bpo
97 bpobj_t bpo; in bpobj_free() local
103 VERIFY3U(0, ==, bpobj_open(&bpo, os, obj)); in bpobj_free()
105 mutex_enter(&bpo.bpo_lock); in bpobj_free()
107 if (!bpo.bpo_havesubobj || bpo.bpo_phys->bpo_subobjs == 0) in bpobj_free()
110 VERIFY3U(0, ==, dmu_object_info(os, bpo.bpo_phys->bpo_subobjs, &doi)); in bpobj_free()
113 for (i = bpo.bpo_phys->bpo_num_subobjs - 1; i >= 0; i--) { in bpobj_free()
124 bpo.bpo_phys->bpo_subobjs, offset, FTAG, &dbuf, 0)); in bpobj_free()
137 VERIFY3U(0, ==, dmu_object_free(os, bpo.bpo_phys->bpo_subobjs, tx)); in bpobj_free()
140 mutex_exit(&bpo.bpo_lock); in bpobj_free()
141 bpobj_close(&bpo); in bpobj_free()
147 bpobj_open(bpobj_t *bpo, objset_t *os, uint64_t object) in bpobj_open() argument
156 bzero(bpo, sizeof (*bpo)); in bpobj_open()
157 mutex_init(&bpo->bpo_lock, NULL, MUTEX_DEFAULT, NULL); in bpobj_open()
159 ASSERT(bpo->bpo_dbuf == NULL); in bpobj_open()
160 ASSERT(bpo->bpo_phys == NULL); in bpobj_open()
165 err = dmu_bonus_hold(os, object, bpo, &bpo->bpo_dbuf); in bpobj_open()
169 bpo->bpo_os = os; in bpobj_open()
170 bpo->bpo_object = object; in bpobj_open()
171 bpo->bpo_epb = doi.doi_data_block_size >> SPA_BLKPTRSHIFT; in bpobj_open()
172 bpo->bpo_havecomp = (doi.doi_bonus_size > BPOBJ_SIZE_V0); in bpobj_open()
173 bpo->bpo_havesubobj = (doi.doi_bonus_size > BPOBJ_SIZE_V1); in bpobj_open()
174 bpo->bpo_phys = bpo->bpo_dbuf->db_data; in bpobj_open()
179 bpobj_close(bpobj_t *bpo) in bpobj_close() argument
182 if (bpo->bpo_object == 0) in bpobj_close()
185 dmu_buf_rele(bpo->bpo_dbuf, bpo); in bpobj_close()
186 if (bpo->bpo_cached_dbuf != NULL) in bpobj_close()
187 dmu_buf_rele(bpo->bpo_cached_dbuf, bpo); in bpobj_close()
188 bpo->bpo_dbuf = NULL; in bpobj_close()
189 bpo->bpo_phys = NULL; in bpobj_close()
190 bpo->bpo_cached_dbuf = NULL; in bpobj_close()
191 bpo->bpo_object = 0; in bpobj_close()
193 mutex_destroy(&bpo->bpo_lock); in bpobj_close()
197 bpobj_hasentries(bpobj_t *bpo) in bpobj_hasentries() argument
199 return (bpo->bpo_phys->bpo_num_blkptrs != 0 || in bpobj_hasentries()
200 (bpo->bpo_havesubobj && bpo->bpo_phys->bpo_num_subobjs != 0)); in bpobj_hasentries()
204 bpobj_iterate_impl(bpobj_t *bpo, bpobj_itor_t func, void *arg, dmu_tx_t *tx, in bpobj_iterate_impl() argument
213 mutex_enter(&bpo->bpo_lock); in bpobj_iterate_impl()
216 dmu_buf_will_dirty(bpo->bpo_dbuf, tx); in bpobj_iterate_impl()
218 for (i = bpo->bpo_phys->bpo_num_blkptrs - 1; i >= 0; i--) { in bpobj_iterate_impl()
224 blkoff = P2PHASE(i, bpo->bpo_epb); in bpobj_iterate_impl()
229 err = dmu_buf_hold(bpo->bpo_os, bpo->bpo_object, offset, in bpobj_iterate_impl()
244 bpo->bpo_phys->bpo_bytes -= in bpobj_iterate_impl()
245 bp_get_dsize_sync(dmu_objset_spa(bpo->bpo_os), bp); in bpobj_iterate_impl()
246 ASSERT3S(bpo->bpo_phys->bpo_bytes, >=, 0); in bpobj_iterate_impl()
247 if (bpo->bpo_havecomp) { in bpobj_iterate_impl()
248 bpo->bpo_phys->bpo_comp -= BP_GET_PSIZE(bp); in bpobj_iterate_impl()
249 bpo->bpo_phys->bpo_uncomp -= BP_GET_UCSIZE(bp); in bpobj_iterate_impl()
251 bpo->bpo_phys->bpo_num_blkptrs--; in bpobj_iterate_impl()
252 ASSERT3S(bpo->bpo_phys->bpo_num_blkptrs, >=, 0); in bpobj_iterate_impl()
260 VERIFY3U(0, ==, dmu_free_range(bpo->bpo_os, bpo->bpo_object, in bpobj_iterate_impl()
263 if (err || !bpo->bpo_havesubobj || bpo->bpo_phys->bpo_subobjs == 0) in bpobj_iterate_impl()
266 ASSERT(bpo->bpo_havecomp); in bpobj_iterate_impl()
267 err = dmu_object_info(bpo->bpo_os, bpo->bpo_phys->bpo_subobjs, &doi); in bpobj_iterate_impl()
269 mutex_exit(&bpo->bpo_lock); in bpobj_iterate_impl()
275 for (i = bpo->bpo_phys->bpo_num_subobjs - 1; i >= 0; i--) { in bpobj_iterate_impl()
288 err = dmu_buf_hold(bpo->bpo_os, in bpobj_iterate_impl()
289 bpo->bpo_phys->bpo_subobjs, offset, FTAG, &dbuf, 0); in bpobj_iterate_impl()
298 err = bpobj_open(&sublist, bpo->bpo_os, objarray[blkoff]); in bpobj_iterate_impl()
313 bpo->bpo_phys->bpo_bytes -= used_before - used_after; in bpobj_iterate_impl()
314 ASSERT3S(bpo->bpo_phys->bpo_bytes, >=, 0); in bpobj_iterate_impl()
315 bpo->bpo_phys->bpo_comp -= comp_before - comp_after; in bpobj_iterate_impl()
316 bpo->bpo_phys->bpo_uncomp -= in bpobj_iterate_impl()
324 err = dmu_object_free(bpo->bpo_os, in bpobj_iterate_impl()
328 bpo->bpo_phys->bpo_num_subobjs--; in bpobj_iterate_impl()
329 ASSERT3S(bpo->bpo_phys->bpo_num_subobjs, >=, 0); in bpobj_iterate_impl()
337 VERIFY3U(0, ==, dmu_free_range(bpo->bpo_os, in bpobj_iterate_impl()
338 bpo->bpo_phys->bpo_subobjs, in bpobj_iterate_impl()
344 if (!bpobj_hasentries(bpo)) { in bpobj_iterate_impl()
345 ASSERT0(bpo->bpo_phys->bpo_bytes); in bpobj_iterate_impl()
346 ASSERT0(bpo->bpo_phys->bpo_comp); in bpobj_iterate_impl()
347 ASSERT0(bpo->bpo_phys->bpo_uncomp); in bpobj_iterate_impl()
350 mutex_exit(&bpo->bpo_lock); in bpobj_iterate_impl()
359 bpobj_iterate(bpobj_t *bpo, bpobj_itor_t func, void *arg, dmu_tx_t *tx) in bpobj_iterate() argument
361 return (bpobj_iterate_impl(bpo, func, arg, tx, B_TRUE)); in bpobj_iterate()
368 bpobj_iterate_nofree(bpobj_t *bpo, bpobj_itor_t func, void *arg, dmu_tx_t *tx) in bpobj_iterate_nofree() argument
370 return (bpobj_iterate_impl(bpo, func, arg, tx, B_FALSE)); in bpobj_iterate_nofree()
374 bpobj_enqueue_subobj(bpobj_t *bpo, uint64_t subobj, dmu_tx_t *tx) in bpobj_enqueue_subobj() argument
379 ASSERT(bpo->bpo_havesubobj); in bpobj_enqueue_subobj()
380 ASSERT(bpo->bpo_havecomp); in bpobj_enqueue_subobj()
381 ASSERT(bpo->bpo_object != dmu_objset_pool(bpo->bpo_os)->dp_empty_bpobj); in bpobj_enqueue_subobj()
383 if (subobj == dmu_objset_pool(bpo->bpo_os)->dp_empty_bpobj) { in bpobj_enqueue_subobj()
384 bpobj_decr_empty(bpo->bpo_os, tx); in bpobj_enqueue_subobj()
388 VERIFY3U(0, ==, bpobj_open(&subbpo, bpo->bpo_os, subobj)); in bpobj_enqueue_subobj()
394 bpobj_free(bpo->bpo_os, subobj, tx); in bpobj_enqueue_subobj()
398 dmu_buf_will_dirty(bpo->bpo_dbuf, tx); in bpobj_enqueue_subobj()
399 if (bpo->bpo_phys->bpo_subobjs == 0) { in bpobj_enqueue_subobj()
400 bpo->bpo_phys->bpo_subobjs = dmu_object_alloc(bpo->bpo_os, in bpobj_enqueue_subobj()
406 ASSERT0(dmu_object_info(bpo->bpo_os, bpo->bpo_phys->bpo_subobjs, &doi)); in bpobj_enqueue_subobj()
409 mutex_enter(&bpo->bpo_lock); in bpobj_enqueue_subobj()
410 dmu_write(bpo->bpo_os, bpo->bpo_phys->bpo_subobjs, in bpobj_enqueue_subobj()
411 bpo->bpo_phys->bpo_num_subobjs * sizeof (subobj), in bpobj_enqueue_subobj()
413 bpo->bpo_phys->bpo_num_subobjs++; in bpobj_enqueue_subobj()
424 VERIFY3U(0, ==, dmu_object_info(bpo->bpo_os, subsubobjs, &doi)); in bpobj_enqueue_subobj()
429 VERIFY3U(0, ==, dmu_buf_hold(bpo->bpo_os, subsubobjs, in bpobj_enqueue_subobj()
437 dmu_write(bpo->bpo_os, bpo->bpo_phys->bpo_subobjs, in bpobj_enqueue_subobj()
438 bpo->bpo_phys->bpo_num_subobjs * sizeof (subobj), in bpobj_enqueue_subobj()
441 bpo->bpo_phys->bpo_num_subobjs += numsubsub; in bpobj_enqueue_subobj()
445 VERIFY3U(0, ==, dmu_object_free(bpo->bpo_os, in bpobj_enqueue_subobj()
449 bpo->bpo_phys->bpo_bytes += used; in bpobj_enqueue_subobj()
450 bpo->bpo_phys->bpo_comp += comp; in bpobj_enqueue_subobj()
451 bpo->bpo_phys->bpo_uncomp += uncomp; in bpobj_enqueue_subobj()
452 mutex_exit(&bpo->bpo_lock); in bpobj_enqueue_subobj()
458 bpobj_enqueue(bpobj_t *bpo, const blkptr_t *bp, dmu_tx_t *tx) in bpobj_enqueue() argument
466 ASSERT(bpo->bpo_object != dmu_objset_pool(bpo->bpo_os)->dp_empty_bpobj); in bpobj_enqueue()
491 mutex_enter(&bpo->bpo_lock); in bpobj_enqueue()
493 offset = bpo->bpo_phys->bpo_num_blkptrs * sizeof (stored_bp); in bpobj_enqueue()
494 blkoff = P2PHASE(bpo->bpo_phys->bpo_num_blkptrs, bpo->bpo_epb); in bpobj_enqueue()
496 if (bpo->bpo_cached_dbuf == NULL || in bpobj_enqueue()
497 offset < bpo->bpo_cached_dbuf->db_offset || in bpobj_enqueue()
498 offset >= bpo->bpo_cached_dbuf->db_offset + in bpobj_enqueue()
499 bpo->bpo_cached_dbuf->db_size) { in bpobj_enqueue()
500 if (bpo->bpo_cached_dbuf) in bpobj_enqueue()
501 dmu_buf_rele(bpo->bpo_cached_dbuf, bpo); in bpobj_enqueue()
502 VERIFY3U(0, ==, dmu_buf_hold(bpo->bpo_os, bpo->bpo_object, in bpobj_enqueue()
503 offset, bpo, &bpo->bpo_cached_dbuf, 0)); in bpobj_enqueue()
506 dmu_buf_will_dirty(bpo->bpo_cached_dbuf, tx); in bpobj_enqueue()
507 bparray = bpo->bpo_cached_dbuf->db_data; in bpobj_enqueue()
510 dmu_buf_will_dirty(bpo->bpo_dbuf, tx); in bpobj_enqueue()
511 bpo->bpo_phys->bpo_num_blkptrs++; in bpobj_enqueue()
512 bpo->bpo_phys->bpo_bytes += in bpobj_enqueue()
513 bp_get_dsize_sync(dmu_objset_spa(bpo->bpo_os), bp); in bpobj_enqueue()
514 if (bpo->bpo_havecomp) { in bpobj_enqueue()
515 bpo->bpo_phys->bpo_comp += BP_GET_PSIZE(bp); in bpobj_enqueue()
516 bpo->bpo_phys->bpo_uncomp += BP_GET_UCSIZE(bp); in bpobj_enqueue()
518 mutex_exit(&bpo->bpo_lock); in bpobj_enqueue()
548 bpobj_space(bpobj_t *bpo, uint64_t *usedp, uint64_t *compp, uint64_t *uncompp) in bpobj_space() argument
550 mutex_enter(&bpo->bpo_lock); in bpobj_space()
552 *usedp = bpo->bpo_phys->bpo_bytes; in bpobj_space()
553 if (bpo->bpo_havecomp) { in bpobj_space()
554 *compp = bpo->bpo_phys->bpo_comp; in bpobj_space()
555 *uncompp = bpo->bpo_phys->bpo_uncomp; in bpobj_space()
556 mutex_exit(&bpo->bpo_lock); in bpobj_space()
559 mutex_exit(&bpo->bpo_lock); in bpobj_space()
560 return (bpobj_space_range(bpo, 0, UINT64_MAX, in bpobj_space()
570 bpobj_space_range(bpobj_t *bpo, uint64_t mintxg, uint64_t maxtxg, in bpobj_space_range() argument
580 if (mintxg < TXG_INITIAL && maxtxg == UINT64_MAX && bpo->bpo_havecomp) in bpobj_space_range()
581 return (bpobj_space(bpo, usedp, compp, uncompp)); in bpobj_space_range()
583 sra.spa = dmu_objset_spa(bpo->bpo_os); in bpobj_space_range()
587 err = bpobj_iterate_nofree(bpo, space_range_cb, &sra, NULL); in bpobj_space_range()