Lines Matching defs:bpo

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