Lines Matching refs:dn

104 	dnode_t *dn = arg;  in dnode_cons()  local
107 rw_init(&dn->dn_struct_rwlock, NULL, RW_DEFAULT, NULL); in dnode_cons()
108 mutex_init(&dn->dn_mtx, NULL, MUTEX_DEFAULT, NULL); in dnode_cons()
109 mutex_init(&dn->dn_dbufs_mtx, NULL, MUTEX_DEFAULT, NULL); in dnode_cons()
110 cv_init(&dn->dn_notxholds, NULL, CV_DEFAULT, NULL); in dnode_cons()
116 refcount_create_untracked(&dn->dn_holds); in dnode_cons()
117 refcount_create(&dn->dn_tx_holds); in dnode_cons()
118 list_link_init(&dn->dn_link); in dnode_cons()
120 bzero(&dn->dn_next_nblkptr[0], sizeof (dn->dn_next_nblkptr)); in dnode_cons()
121 bzero(&dn->dn_next_nlevels[0], sizeof (dn->dn_next_nlevels)); in dnode_cons()
122 bzero(&dn->dn_next_indblkshift[0], sizeof (dn->dn_next_indblkshift)); in dnode_cons()
123 bzero(&dn->dn_next_bonustype[0], sizeof (dn->dn_next_bonustype)); in dnode_cons()
124 bzero(&dn->dn_rm_spillblk[0], sizeof (dn->dn_rm_spillblk)); in dnode_cons()
125 bzero(&dn->dn_next_bonuslen[0], sizeof (dn->dn_next_bonuslen)); in dnode_cons()
126 bzero(&dn->dn_next_blksz[0], sizeof (dn->dn_next_blksz)); in dnode_cons()
129 list_link_init(&dn->dn_dirty_link[i]); in dnode_cons()
130 dn->dn_free_ranges[i] = NULL; in dnode_cons()
131 list_create(&dn->dn_dirty_records[i], in dnode_cons()
136 dn->dn_allocated_txg = 0; in dnode_cons()
137 dn->dn_free_txg = 0; in dnode_cons()
138 dn->dn_assigned_txg = 0; in dnode_cons()
139 dn->dn_dirtyctx = 0; in dnode_cons()
140 dn->dn_dirtyctx_firstset = NULL; in dnode_cons()
141 dn->dn_bonus = NULL; in dnode_cons()
142 dn->dn_have_spill = B_FALSE; in dnode_cons()
143 dn->dn_zio = NULL; in dnode_cons()
144 dn->dn_oldused = 0; in dnode_cons()
145 dn->dn_oldflags = 0; in dnode_cons()
146 dn->dn_olduid = 0; in dnode_cons()
147 dn->dn_oldgid = 0; in dnode_cons()
148 dn->dn_newuid = 0; in dnode_cons()
149 dn->dn_newgid = 0; in dnode_cons()
150 dn->dn_id_flags = 0; in dnode_cons()
152 dn->dn_dbufs_count = 0; in dnode_cons()
153 dn->dn_unlisted_l0_blkid = 0; in dnode_cons()
154 avl_create(&dn->dn_dbufs, dbuf_compare, sizeof (dmu_buf_impl_t), in dnode_cons()
157 dn->dn_moved = 0; in dnode_cons()
166 dnode_t *dn = arg; in dnode_dest() local
168 rw_destroy(&dn->dn_struct_rwlock); in dnode_dest()
169 mutex_destroy(&dn->dn_mtx); in dnode_dest()
170 mutex_destroy(&dn->dn_dbufs_mtx); in dnode_dest()
171 cv_destroy(&dn->dn_notxholds); in dnode_dest()
172 refcount_destroy(&dn->dn_holds); in dnode_dest()
173 refcount_destroy(&dn->dn_tx_holds); in dnode_dest()
174 ASSERT(!list_link_active(&dn->dn_link)); in dnode_dest()
177 ASSERT(!list_link_active(&dn->dn_dirty_link[i])); in dnode_dest()
178 ASSERT3P(dn->dn_free_ranges[i], ==, NULL); in dnode_dest()
179 list_destroy(&dn->dn_dirty_records[i]); in dnode_dest()
180 ASSERT0(dn->dn_next_nblkptr[i]); in dnode_dest()
181 ASSERT0(dn->dn_next_nlevels[i]); in dnode_dest()
182 ASSERT0(dn->dn_next_indblkshift[i]); in dnode_dest()
183 ASSERT0(dn->dn_next_bonustype[i]); in dnode_dest()
184 ASSERT0(dn->dn_rm_spillblk[i]); in dnode_dest()
185 ASSERT0(dn->dn_next_bonuslen[i]); in dnode_dest()
186 ASSERT0(dn->dn_next_blksz[i]); in dnode_dest()
189 ASSERT0(dn->dn_allocated_txg); in dnode_dest()
190 ASSERT0(dn->dn_free_txg); in dnode_dest()
191 ASSERT0(dn->dn_assigned_txg); in dnode_dest()
192 ASSERT0(dn->dn_dirtyctx); in dnode_dest()
193 ASSERT3P(dn->dn_dirtyctx_firstset, ==, NULL); in dnode_dest()
194 ASSERT3P(dn->dn_bonus, ==, NULL); in dnode_dest()
195 ASSERT(!dn->dn_have_spill); in dnode_dest()
196 ASSERT3P(dn->dn_zio, ==, NULL); in dnode_dest()
197 ASSERT0(dn->dn_oldused); in dnode_dest()
198 ASSERT0(dn->dn_oldflags); in dnode_dest()
199 ASSERT0(dn->dn_olduid); in dnode_dest()
200 ASSERT0(dn->dn_oldgid); in dnode_dest()
201 ASSERT0(dn->dn_newuid); in dnode_dest()
202 ASSERT0(dn->dn_newgid); in dnode_dest()
203 ASSERT0(dn->dn_id_flags); in dnode_dest()
205 ASSERT0(dn->dn_dbufs_count); in dnode_dest()
206 ASSERT0(dn->dn_unlisted_l0_blkid); in dnode_dest()
207 avl_destroy(&dn->dn_dbufs); in dnode_dest()
230 dnode_verify(dnode_t *dn) in dnode_verify() argument
234 ASSERT(dn->dn_phys); in dnode_verify()
235 ASSERT(dn->dn_objset); in dnode_verify()
236 ASSERT(dn->dn_handle->dnh_dnode == dn); in dnode_verify()
238 ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type)); in dnode_verify()
243 if (!RW_WRITE_HELD(&dn->dn_struct_rwlock)) { in dnode_verify()
244 rw_enter(&dn->dn_struct_rwlock, RW_READER); in dnode_verify()
247 if (dn->dn_phys->dn_type != DMU_OT_NONE || dn->dn_allocated_txg != 0) { in dnode_verify()
249 ASSERT3U(dn->dn_indblkshift, >=, 0); in dnode_verify()
250 ASSERT3U(dn->dn_indblkshift, <=, SPA_MAXBLOCKSHIFT); in dnode_verify()
251 if (dn->dn_datablkshift) { in dnode_verify()
252 ASSERT3U(dn->dn_datablkshift, >=, SPA_MINBLOCKSHIFT); in dnode_verify()
253 ASSERT3U(dn->dn_datablkshift, <=, SPA_MAXBLOCKSHIFT); in dnode_verify()
254 ASSERT3U(1<<dn->dn_datablkshift, ==, dn->dn_datablksz); in dnode_verify()
256 ASSERT3U(dn->dn_nlevels, <=, 30); in dnode_verify()
257 ASSERT(DMU_OT_IS_VALID(dn->dn_type)); in dnode_verify()
258 ASSERT3U(dn->dn_nblkptr, >=, 1); in dnode_verify()
259 ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR); in dnode_verify()
260 ASSERT3U(dn->dn_bonuslen, <=, DN_MAX_BONUSLEN); in dnode_verify()
261 ASSERT3U(dn->dn_datablksz, ==, in dnode_verify()
262 dn->dn_datablkszsec << SPA_MINBLOCKSHIFT); in dnode_verify()
263 ASSERT3U(ISP2(dn->dn_datablksz), ==, dn->dn_datablkshift != 0); in dnode_verify()
264 ASSERT3U((dn->dn_nblkptr - 1) * sizeof (blkptr_t) + in dnode_verify()
265 dn->dn_bonuslen, <=, DN_MAX_BONUSLEN); in dnode_verify()
267 ASSERT3U(dn->dn_next_nlevels[i], <=, dn->dn_nlevels); in dnode_verify()
270 if (dn->dn_phys->dn_type != DMU_OT_NONE) in dnode_verify()
271 ASSERT3U(dn->dn_phys->dn_nlevels, <=, dn->dn_nlevels); in dnode_verify()
272 ASSERT(DMU_OBJECT_IS_SPECIAL(dn->dn_object) || dn->dn_dbuf != NULL); in dnode_verify()
273 if (dn->dn_dbuf != NULL) { in dnode_verify()
274 ASSERT3P(dn->dn_phys, ==, in dnode_verify()
275 (dnode_phys_t *)dn->dn_dbuf->db.db_data + in dnode_verify()
276 (dn->dn_object % (dn->dn_dbuf->db.db_size >> DNODE_SHIFT))); in dnode_verify()
279 rw_exit(&dn->dn_struct_rwlock); in dnode_verify()
352 dnode_setbonuslen(dnode_t *dn, int newsize, dmu_tx_t *tx) in dnode_setbonuslen() argument
354 ASSERT3U(refcount_count(&dn->dn_holds), >=, 1); in dnode_setbonuslen()
356 dnode_setdirty(dn, tx); in dnode_setbonuslen()
357 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_setbonuslen()
359 (dn->dn_nblkptr-1) * sizeof (blkptr_t)); in dnode_setbonuslen()
360 dn->dn_bonuslen = newsize; in dnode_setbonuslen()
362 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = DN_ZERO_BONUSLEN; in dnode_setbonuslen()
364 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = dn->dn_bonuslen; in dnode_setbonuslen()
365 rw_exit(&dn->dn_struct_rwlock); in dnode_setbonuslen()
369 dnode_setbonus_type(dnode_t *dn, dmu_object_type_t newtype, dmu_tx_t *tx) in dnode_setbonus_type() argument
371 ASSERT3U(refcount_count(&dn->dn_holds), >=, 1); in dnode_setbonus_type()
372 dnode_setdirty(dn, tx); in dnode_setbonus_type()
373 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_setbonus_type()
374 dn->dn_bonustype = newtype; in dnode_setbonus_type()
375 dn->dn_next_bonustype[tx->tx_txg & TXG_MASK] = dn->dn_bonustype; in dnode_setbonus_type()
376 rw_exit(&dn->dn_struct_rwlock); in dnode_setbonus_type()
380 dnode_rm_spill(dnode_t *dn, dmu_tx_t *tx) in dnode_rm_spill() argument
382 ASSERT3U(refcount_count(&dn->dn_holds), >=, 1); in dnode_rm_spill()
383 ASSERT(RW_WRITE_HELD(&dn->dn_struct_rwlock)); in dnode_rm_spill()
384 dnode_setdirty(dn, tx); in dnode_rm_spill()
385 dn->dn_rm_spillblk[tx->tx_txg&TXG_MASK] = DN_KILL_SPILLBLK; in dnode_rm_spill()
386 dn->dn_have_spill = B_FALSE; in dnode_rm_spill()
390 dnode_setdblksz(dnode_t *dn, int size) in dnode_setdblksz() argument
396 1<<(sizeof (dn->dn_phys->dn_datablkszsec) * 8)); in dnode_setdblksz()
397 dn->dn_datablksz = size; in dnode_setdblksz()
398 dn->dn_datablkszsec = size >> SPA_MINBLOCKSHIFT; in dnode_setdblksz()
399 dn->dn_datablkshift = ISP2(size) ? highbit64(size - 1) : 0; in dnode_setdblksz()
406 dnode_t *dn; in dnode_create() local
408 dn = kmem_cache_alloc(dnode_cache, KM_SLEEP); in dnode_create()
409 ASSERT(!POINTER_IS_VALID(dn->dn_objset)); in dnode_create()
410 dn->dn_moved = 0; in dnode_create()
416 dn->dn_object = object; in dnode_create()
417 dn->dn_dbuf = db; in dnode_create()
418 dn->dn_handle = dnh; in dnode_create()
419 dn->dn_phys = dnp; in dnode_create()
422 dnode_setdblksz(dn, dnp->dn_datablkszsec << SPA_MINBLOCKSHIFT); in dnode_create()
424 dn->dn_datablksz = 0; in dnode_create()
425 dn->dn_datablkszsec = 0; in dnode_create()
426 dn->dn_datablkshift = 0; in dnode_create()
428 dn->dn_indblkshift = dnp->dn_indblkshift; in dnode_create()
429 dn->dn_nlevels = dnp->dn_nlevels; in dnode_create()
430 dn->dn_type = dnp->dn_type; in dnode_create()
431 dn->dn_nblkptr = dnp->dn_nblkptr; in dnode_create()
432 dn->dn_checksum = dnp->dn_checksum; in dnode_create()
433 dn->dn_compress = dnp->dn_compress; in dnode_create()
434 dn->dn_bonustype = dnp->dn_bonustype; in dnode_create()
435 dn->dn_bonuslen = dnp->dn_bonuslen; in dnode_create()
436 dn->dn_maxblkid = dnp->dn_maxblkid; in dnode_create()
437 dn->dn_have_spill = ((dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) != 0); in dnode_create()
438 dn->dn_id_flags = 0; in dnode_create()
440 dmu_zfetch_init(&dn->dn_zfetch, dn); in dnode_create()
442 ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type)); in dnode_create()
448 kmem_cache_free(dnode_cache, dn); in dnode_create()
460 list_insert_head(&os->os_dnodes, dn); in dnode_create()
467 dn->dn_objset = os; in dnode_create()
469 dnh->dnh_dnode = dn; in dnode_create()
473 return (dn); in dnode_create()
480 dnode_destroy(dnode_t *dn) in dnode_destroy() argument
482 objset_t *os = dn->dn_objset; in dnode_destroy()
485 ASSERT((dn->dn_id_flags & DN_ID_NEW_EXIST) == 0); in dnode_destroy()
488 POINTER_INVALIDATE(&dn->dn_objset); in dnode_destroy()
489 if (!DMU_OBJECT_IS_SPECIAL(dn->dn_object)) { in dnode_destroy()
490 list_remove(&os->os_dnodes, dn); in dnode_destroy()
498 zrl_remove(&dn->dn_handle->dnh_zrlock); in dnode_destroy()
500 dn->dn_allocated_txg = 0; in dnode_destroy()
501 dn->dn_free_txg = 0; in dnode_destroy()
502 dn->dn_assigned_txg = 0; in dnode_destroy()
504 dn->dn_dirtyctx = 0; in dnode_destroy()
505 if (dn->dn_dirtyctx_firstset != NULL) { in dnode_destroy()
506 kmem_free(dn->dn_dirtyctx_firstset, 1); in dnode_destroy()
507 dn->dn_dirtyctx_firstset = NULL; in dnode_destroy()
509 if (dn->dn_bonus != NULL) { in dnode_destroy()
510 mutex_enter(&dn->dn_bonus->db_mtx); in dnode_destroy()
511 dbuf_evict(dn->dn_bonus); in dnode_destroy()
512 dn->dn_bonus = NULL; in dnode_destroy()
514 dn->dn_zio = NULL; in dnode_destroy()
516 dn->dn_have_spill = B_FALSE; in dnode_destroy()
517 dn->dn_oldused = 0; in dnode_destroy()
518 dn->dn_oldflags = 0; in dnode_destroy()
519 dn->dn_olduid = 0; in dnode_destroy()
520 dn->dn_oldgid = 0; in dnode_destroy()
521 dn->dn_newuid = 0; in dnode_destroy()
522 dn->dn_newgid = 0; in dnode_destroy()
523 dn->dn_id_flags = 0; in dnode_destroy()
524 dn->dn_unlisted_l0_blkid = 0; in dnode_destroy()
526 dmu_zfetch_rele(&dn->dn_zfetch); in dnode_destroy()
527 kmem_cache_free(dnode_cache, dn); in dnode_destroy()
535 dnode_allocate(dnode_t *dn, dmu_object_type_t ot, int blocksize, int ibs, in dnode_allocate() argument
541 spa_maxblocksize(dmu_objset_spa(dn->dn_objset))); in dnode_allocate()
552 dprintf("os=%p obj=%llu txg=%llu blocksize=%d ibs=%d\n", dn->dn_objset, in dnode_allocate()
553 dn->dn_object, tx->tx_txg, blocksize, ibs); in dnode_allocate()
555 ASSERT(dn->dn_type == DMU_OT_NONE); in dnode_allocate()
556 ASSERT(bcmp(dn->dn_phys, &dnode_phys_zero, sizeof (dnode_phys_t)) == 0); in dnode_allocate()
557 ASSERT(dn->dn_phys->dn_type == DMU_OT_NONE); in dnode_allocate()
565 ASSERT(dn->dn_type == DMU_OT_NONE); in dnode_allocate()
566 ASSERT0(dn->dn_maxblkid); in dnode_allocate()
567 ASSERT0(dn->dn_allocated_txg); in dnode_allocate()
568 ASSERT0(dn->dn_assigned_txg); in dnode_allocate()
569 ASSERT(refcount_is_zero(&dn->dn_tx_holds)); in dnode_allocate()
570 ASSERT3U(refcount_count(&dn->dn_holds), <=, 1); in dnode_allocate()
571 ASSERT(avl_is_empty(&dn->dn_dbufs)); in dnode_allocate()
574 ASSERT0(dn->dn_next_nblkptr[i]); in dnode_allocate()
575 ASSERT0(dn->dn_next_nlevels[i]); in dnode_allocate()
576 ASSERT0(dn->dn_next_indblkshift[i]); in dnode_allocate()
577 ASSERT0(dn->dn_next_bonuslen[i]); in dnode_allocate()
578 ASSERT0(dn->dn_next_bonustype[i]); in dnode_allocate()
579 ASSERT0(dn->dn_rm_spillblk[i]); in dnode_allocate()
580 ASSERT0(dn->dn_next_blksz[i]); in dnode_allocate()
581 ASSERT(!list_link_active(&dn->dn_dirty_link[i])); in dnode_allocate()
582 ASSERT3P(list_head(&dn->dn_dirty_records[i]), ==, NULL); in dnode_allocate()
583 ASSERT3P(dn->dn_free_ranges[i], ==, NULL); in dnode_allocate()
586 dn->dn_type = ot; in dnode_allocate()
587 dnode_setdblksz(dn, blocksize); in dnode_allocate()
588 dn->dn_indblkshift = ibs; in dnode_allocate()
589 dn->dn_nlevels = 1; in dnode_allocate()
591 dn->dn_nblkptr = 1; in dnode_allocate()
593 dn->dn_nblkptr = 1 + in dnode_allocate()
595 dn->dn_bonustype = bonustype; in dnode_allocate()
596 dn->dn_bonuslen = bonuslen; in dnode_allocate()
597 dn->dn_checksum = ZIO_CHECKSUM_INHERIT; in dnode_allocate()
598 dn->dn_compress = ZIO_COMPRESS_INHERIT; in dnode_allocate()
599 dn->dn_dirtyctx = 0; in dnode_allocate()
601 dn->dn_free_txg = 0; in dnode_allocate()
602 if (dn->dn_dirtyctx_firstset) { in dnode_allocate()
603 kmem_free(dn->dn_dirtyctx_firstset, 1); in dnode_allocate()
604 dn->dn_dirtyctx_firstset = NULL; in dnode_allocate()
607 dn->dn_allocated_txg = tx->tx_txg; in dnode_allocate()
608 dn->dn_id_flags = 0; in dnode_allocate()
610 dnode_setdirty(dn, tx); in dnode_allocate()
611 dn->dn_next_indblkshift[tx->tx_txg & TXG_MASK] = ibs; in dnode_allocate()
612 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = dn->dn_bonuslen; in dnode_allocate()
613 dn->dn_next_bonustype[tx->tx_txg & TXG_MASK] = dn->dn_bonustype; in dnode_allocate()
614 dn->dn_next_blksz[tx->tx_txg & TXG_MASK] = dn->dn_datablksz; in dnode_allocate()
618 dnode_reallocate(dnode_t *dn, dmu_object_type_t ot, int blocksize, in dnode_reallocate() argument
625 spa_maxblocksize(dmu_objset_spa(dn->dn_objset))); in dnode_reallocate()
627 ASSERT(dn->dn_object != DMU_META_DNODE_OBJECT || dmu_tx_private_ok(tx)); in dnode_reallocate()
636 dnode_evict_dbufs(dn); in dnode_reallocate()
638 dn->dn_id_flags = 0; in dnode_reallocate()
640 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_reallocate()
641 dnode_setdirty(dn, tx); in dnode_reallocate()
642 if (dn->dn_datablksz != blocksize) { in dnode_reallocate()
644 ASSERT(dn->dn_maxblkid == 0 && in dnode_reallocate()
645 (BP_IS_HOLE(&dn->dn_phys->dn_blkptr[0]) || in dnode_reallocate()
646 dnode_block_freed(dn, 0))); in dnode_reallocate()
647 dnode_setdblksz(dn, blocksize); in dnode_reallocate()
648 dn->dn_next_blksz[tx->tx_txg&TXG_MASK] = blocksize; in dnode_reallocate()
650 if (dn->dn_bonuslen != bonuslen) in dnode_reallocate()
651 dn->dn_next_bonuslen[tx->tx_txg&TXG_MASK] = bonuslen; in dnode_reallocate()
657 if (dn->dn_bonustype != bonustype) in dnode_reallocate()
658 dn->dn_next_bonustype[tx->tx_txg&TXG_MASK] = bonustype; in dnode_reallocate()
659 if (dn->dn_nblkptr != nblkptr) in dnode_reallocate()
660 dn->dn_next_nblkptr[tx->tx_txg&TXG_MASK] = nblkptr; in dnode_reallocate()
661 if (dn->dn_phys->dn_flags & DNODE_FLAG_SPILL_BLKPTR) { in dnode_reallocate()
662 dbuf_rm_spill(dn, tx); in dnode_reallocate()
663 dnode_rm_spill(dn, tx); in dnode_reallocate()
665 rw_exit(&dn->dn_struct_rwlock); in dnode_reallocate()
668 dn->dn_type = ot; in dnode_reallocate()
671 mutex_enter(&dn->dn_mtx); in dnode_reallocate()
672 dn->dn_bonustype = bonustype; in dnode_reallocate()
673 dn->dn_bonuslen = bonuslen; in dnode_reallocate()
674 dn->dn_nblkptr = nblkptr; in dnode_reallocate()
675 dn->dn_checksum = ZIO_CHECKSUM_INHERIT; in dnode_reallocate()
676 dn->dn_compress = ZIO_COMPRESS_INHERIT; in dnode_reallocate()
677 ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR); in dnode_reallocate()
680 if (dn->dn_bonus) { in dnode_reallocate()
681 dn->dn_bonus->db.db_size = in dnode_reallocate()
682 DN_MAX_BONUSLEN - (dn->dn_nblkptr-1) * sizeof (blkptr_t); in dnode_reallocate()
683 ASSERT(dn->dn_bonuslen <= dn->dn_bonus->db.db_size); in dnode_reallocate()
686 dn->dn_allocated_txg = tx->tx_txg; in dnode_reallocate()
687 mutex_exit(&dn->dn_mtx); in dnode_reallocate()
988 dnode_t *dn = dnh->dnh_dnode; in dnode_special_close() local
996 while (refcount_count(&dn->dn_holds) > 0) in dnode_special_close()
998 ASSERT(dn->dn_dbuf == NULL || in dnode_special_close()
999 dmu_buf_get_user(&dn->dn_dbuf->db) == NULL); in dnode_special_close()
1001 dnode_destroy(dn); /* implicit zrl_remove() */ in dnode_special_close()
1010 dnode_t *dn; in dnode_special_open() local
1012 dn = dnode_create(os, dnp, NULL, object, dnh); in dnode_special_open()
1014 DNODE_VERIFY(dn); in dnode_special_open()
1025 dnode_t *dn; in dnode_buf_evict_async() local
1038 dn = dnh->dnh_dnode; in dnode_buf_evict_async()
1045 ASSERT(refcount_is_zero(&dn->dn_holds)); in dnode_buf_evict_async()
1046 ASSERT(refcount_is_zero(&dn->dn_tx_holds)); in dnode_buf_evict_async()
1048 dnode_destroy(dn); /* implicit zrl_remove() */ in dnode_buf_evict_async()
1070 dnode_t *mdn, *dn; in dnode_hold_impl() local
1086 dn = (object == DMU_USERUSED_OBJECT) ? in dnode_hold_impl()
1088 if (dn == NULL) in dnode_hold_impl()
1090 type = dn->dn_type; in dnode_hold_impl()
1095 DNODE_VERIFY(dn); in dnode_hold_impl()
1096 (void) refcount_add(&dn->dn_holds, tag); in dnode_hold_impl()
1097 *dnp = dn; in dnode_hold_impl()
1162 dn = dnh->dnh_dnode; in dnode_hold_impl()
1163 if (dn == NULL) { in dnode_hold_impl()
1166 dn = dnode_create(os, phys, db, object, dnh); in dnode_hold_impl()
1169 mutex_enter(&dn->dn_mtx); in dnode_hold_impl()
1170 type = dn->dn_type; in dnode_hold_impl()
1171 if (dn->dn_free_txg || in dnode_hold_impl()
1174 (type != DMU_OT_NONE || !refcount_is_zero(&dn->dn_holds)))) { in dnode_hold_impl()
1175 mutex_exit(&dn->dn_mtx); in dnode_hold_impl()
1180 if (refcount_add(&dn->dn_holds, tag) == 1) in dnode_hold_impl()
1182 mutex_exit(&dn->dn_mtx); in dnode_hold_impl()
1187 DNODE_VERIFY(dn); in dnode_hold_impl()
1188 ASSERT3P(dn->dn_dbuf, ==, db); in dnode_hold_impl()
1189 ASSERT3U(dn->dn_object, ==, object); in dnode_hold_impl()
1192 *dnp = dn; in dnode_hold_impl()
1211 dnode_add_ref(dnode_t *dn, void *tag) in dnode_add_ref() argument
1213 mutex_enter(&dn->dn_mtx); in dnode_add_ref()
1214 if (refcount_is_zero(&dn->dn_holds)) { in dnode_add_ref()
1215 mutex_exit(&dn->dn_mtx); in dnode_add_ref()
1218 VERIFY(1 < refcount_add(&dn->dn_holds, tag)); in dnode_add_ref()
1219 mutex_exit(&dn->dn_mtx); in dnode_add_ref()
1224 dnode_rele(dnode_t *dn, void *tag) in dnode_rele() argument
1226 mutex_enter(&dn->dn_mtx); in dnode_rele()
1227 dnode_rele_and_unlock(dn, tag); in dnode_rele()
1231 dnode_rele_and_unlock(dnode_t *dn, void *tag) in dnode_rele_and_unlock() argument
1235 dmu_buf_impl_t *db = dn->dn_dbuf; in dnode_rele_and_unlock()
1236 dnode_handle_t *dnh = dn->dn_handle; in dnode_rele_and_unlock()
1238 refs = refcount_remove(&dn->dn_holds, tag); in dnode_rele_and_unlock()
1239 mutex_exit(&dn->dn_mtx); in dnode_rele_and_unlock()
1267 dnode_setdirty(dnode_t *dn, dmu_tx_t *tx) in dnode_setdirty() argument
1269 objset_t *os = dn->dn_objset; in dnode_setdirty()
1272 if (DMU_OBJECT_IS_SPECIAL(dn->dn_object)) { in dnode_setdirty()
1277 DNODE_VERIFY(dn); in dnode_setdirty()
1280 mutex_enter(&dn->dn_mtx); in dnode_setdirty()
1281 ASSERT(dn->dn_phys->dn_type || dn->dn_allocated_txg); in dnode_setdirty()
1282 ASSERT(dn->dn_free_txg == 0 || dn->dn_free_txg >= txg); in dnode_setdirty()
1283 mutex_exit(&dn->dn_mtx); in dnode_setdirty()
1289 dmu_objset_userquota_get_ids(dn, B_TRUE, tx); in dnode_setdirty()
1296 if (list_link_active(&dn->dn_dirty_link[txg & TXG_MASK])) { in dnode_setdirty()
1301 ASSERT(!refcount_is_zero(&dn->dn_holds) || in dnode_setdirty()
1302 !avl_is_empty(&dn->dn_dbufs)); in dnode_setdirty()
1303 ASSERT(dn->dn_datablksz != 0); in dnode_setdirty()
1304 ASSERT0(dn->dn_next_bonuslen[txg&TXG_MASK]); in dnode_setdirty()
1305 ASSERT0(dn->dn_next_blksz[txg&TXG_MASK]); in dnode_setdirty()
1306 ASSERT0(dn->dn_next_bonustype[txg&TXG_MASK]); in dnode_setdirty()
1309 dn->dn_object, txg); in dnode_setdirty()
1311 if (dn->dn_free_txg > 0 && dn->dn_free_txg <= txg) { in dnode_setdirty()
1312 list_insert_tail(&os->os_free_dnodes[txg&TXG_MASK], dn); in dnode_setdirty()
1314 list_insert_tail(&os->os_dirty_dnodes[txg&TXG_MASK], dn); in dnode_setdirty()
1328 VERIFY(dnode_add_ref(dn, (void *)(uintptr_t)tx->tx_txg)); in dnode_setdirty()
1330 (void) dbuf_dirty(dn->dn_dbuf, tx); in dnode_setdirty()
1336 dnode_free(dnode_t *dn, dmu_tx_t *tx) in dnode_free() argument
1340 dprintf("dn=%p txg=%llu\n", dn, tx->tx_txg); in dnode_free()
1345 mutex_enter(&dn->dn_mtx); in dnode_free()
1346 if (dn->dn_type == DMU_OT_NONE || dn->dn_free_txg) { in dnode_free()
1347 mutex_exit(&dn->dn_mtx); in dnode_free()
1350 dn->dn_free_txg = tx->tx_txg; in dnode_free()
1351 mutex_exit(&dn->dn_mtx); in dnode_free()
1357 mutex_enter(&dn->dn_objset->os_lock); in dnode_free()
1358 if (list_link_active(&dn->dn_dirty_link[txgoff])) { in dnode_free()
1359 list_remove(&dn->dn_objset->os_dirty_dnodes[txgoff], dn); in dnode_free()
1360 list_insert_tail(&dn->dn_objset->os_free_dnodes[txgoff], dn); in dnode_free()
1361 mutex_exit(&dn->dn_objset->os_lock); in dnode_free()
1363 mutex_exit(&dn->dn_objset->os_lock); in dnode_free()
1364 dnode_setdirty(dn, tx); in dnode_free()
1373 dnode_set_blksz(dnode_t *dn, uint64_t size, int ibs, dmu_tx_t *tx) in dnode_set_blksz() argument
1378 ASSERT3U(size, <=, spa_maxblocksize(dmu_objset_spa(dn->dn_objset))); in dnode_set_blksz()
1384 if (ibs == dn->dn_indblkshift) in dnode_set_blksz()
1387 if (size >> SPA_MINBLOCKSHIFT == dn->dn_datablkszsec && ibs == 0) in dnode_set_blksz()
1390 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_set_blksz()
1393 if (dn->dn_maxblkid != 0) in dnode_set_blksz()
1396 mutex_enter(&dn->dn_dbufs_mtx); in dnode_set_blksz()
1397 for (db = avl_first(&dn->dn_dbufs); db != NULL; in dnode_set_blksz()
1398 db = AVL_NEXT(&dn->dn_dbufs, db)) { in dnode_set_blksz()
1401 mutex_exit(&dn->dn_dbufs_mtx); in dnode_set_blksz()
1405 mutex_exit(&dn->dn_dbufs_mtx); in dnode_set_blksz()
1407 if (ibs && dn->dn_nlevels != 1) in dnode_set_blksz()
1411 err = dbuf_hold_impl(dn, 0, 0, TRUE, FALSE, FTAG, &db); in dnode_set_blksz()
1417 dnode_setdblksz(dn, size); in dnode_set_blksz()
1418 dnode_setdirty(dn, tx); in dnode_set_blksz()
1419 dn->dn_next_blksz[tx->tx_txg&TXG_MASK] = size; in dnode_set_blksz()
1421 dn->dn_indblkshift = ibs; in dnode_set_blksz()
1422 dn->dn_next_indblkshift[tx->tx_txg&TXG_MASK] = ibs; in dnode_set_blksz()
1428 rw_exit(&dn->dn_struct_rwlock); in dnode_set_blksz()
1432 rw_exit(&dn->dn_struct_rwlock); in dnode_set_blksz()
1438 dnode_new_blkid(dnode_t *dn, uint64_t blkid, dmu_tx_t *tx, boolean_t have_read) in dnode_new_blkid() argument
1447 RW_READ_HELD(&dn->dn_struct_rwlock) : in dnode_new_blkid()
1448 RW_WRITE_HELD(&dn->dn_struct_rwlock)); in dnode_new_blkid()
1455 if (blkid <= dn->dn_maxblkid) in dnode_new_blkid()
1458 if (!rw_tryupgrade(&dn->dn_struct_rwlock)) { in dnode_new_blkid()
1459 rw_exit(&dn->dn_struct_rwlock); in dnode_new_blkid()
1460 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_new_blkid()
1464 if (blkid <= dn->dn_maxblkid) in dnode_new_blkid()
1467 dn->dn_maxblkid = blkid; in dnode_new_blkid()
1473 epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT; in dnode_new_blkid()
1474 for (sz = dn->dn_nblkptr; in dnode_new_blkid()
1475 sz <= blkid && sz >= dn->dn_nblkptr; sz <<= epbs) in dnode_new_blkid()
1478 if (new_nlevels > dn->dn_nlevels) { in dnode_new_blkid()
1479 int old_nlevels = dn->dn_nlevels; in dnode_new_blkid()
1484 dn->dn_nlevels = new_nlevels; in dnode_new_blkid()
1486 ASSERT3U(new_nlevels, >, dn->dn_next_nlevels[txgoff]); in dnode_new_blkid()
1487 dn->dn_next_nlevels[txgoff] = new_nlevels; in dnode_new_blkid()
1490 db = dbuf_hold_level(dn, old_nlevels, 0, FTAG); in dnode_new_blkid()
1496 mutex_enter(&dn->dn_mtx); in dnode_new_blkid()
1498 list = &dn->dn_dirty_records[txgoff]; in dnode_new_blkid()
1500 dr_next = list_next(&dn->dn_dirty_records[txgoff], dr); in dnode_new_blkid()
1505 list_remove(&dn->dn_dirty_records[txgoff], dr); in dnode_new_blkid()
1511 mutex_exit(&dn->dn_mtx); in dnode_new_blkid()
1516 rw_downgrade(&dn->dn_struct_rwlock); in dnode_new_blkid()
1520 dnode_dirty_l1(dnode_t *dn, uint64_t l1blkid, dmu_tx_t *tx) in dnode_dirty_l1() argument
1522 dmu_buf_impl_t *db = dbuf_hold_level(dn, 1, l1blkid, FTAG); in dnode_dirty_l1()
1530 dnode_free_range(dnode_t *dn, uint64_t off, uint64_t len, dmu_tx_t *tx) in dnode_free_range() argument
1538 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_free_range()
1539 blksz = dn->dn_datablksz; in dnode_free_range()
1540 blkshift = dn->dn_datablkshift; in dnode_free_range()
1541 epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT; in dnode_free_range()
1554 if ((off >> blkshift) > dn->dn_maxblkid) in dnode_free_range()
1557 ASSERT(dn->dn_maxblkid == 0); in dnode_free_range()
1584 if (dbuf_hold_impl(dn, 0, dbuf_whichblock(dn, 0, off), in dnode_free_range()
1591 rw_exit(&dn->dn_struct_rwlock); in dnode_free_range()
1593 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_free_range()
1608 if ((off >> blkshift) > dn->dn_maxblkid) in dnode_free_range()
1622 if (dbuf_hold_impl(dn, 0, dbuf_whichblock(dn, 0, off+len), in dnode_free_range()
1627 rw_exit(&dn->dn_struct_rwlock); in dnode_free_range()
1629 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_free_range()
1668 if (dn->dn_nlevels > 1) { in dnode_free_range()
1672 dnode_dirty_l1(dn, first, tx); in dnode_free_range()
1674 last = dn->dn_maxblkid >> epbs; in dnode_free_range()
1678 dnode_dirty_l1(dn, last, tx); in dnode_free_range()
1680 int shift = dn->dn_datablkshift + dn->dn_indblkshift - in dnode_free_range()
1690 int err = dnode_next_offset(dn, DNODE_FIND_HAVELOCK, in dnode_free_range()
1709 dnode_dirty_l1(dn, i, tx); in dnode_free_range()
1718 mutex_enter(&dn->dn_mtx); in dnode_free_range()
1720 if (dn->dn_free_ranges[txgoff] == NULL) { in dnode_free_range()
1721 dn->dn_free_ranges[txgoff] = in dnode_free_range()
1722 range_tree_create(NULL, NULL, &dn->dn_mtx); in dnode_free_range()
1724 range_tree_clear(dn->dn_free_ranges[txgoff], blkid, nblks); in dnode_free_range()
1725 range_tree_add(dn->dn_free_ranges[txgoff], blkid, nblks); in dnode_free_range()
1726 dprintf_dnode(dn, "blkid=%llu nblks=%llu txg=%llu\n", in dnode_free_range()
1728 mutex_exit(&dn->dn_mtx); in dnode_free_range()
1730 dbuf_free_range(dn, blkid, blkid + nblks - 1, tx); in dnode_free_range()
1731 dnode_setdirty(dn, tx); in dnode_free_range()
1734 rw_exit(&dn->dn_struct_rwlock); in dnode_free_range()
1738 dnode_spill_freed(dnode_t *dn) in dnode_spill_freed() argument
1742 mutex_enter(&dn->dn_mtx); in dnode_spill_freed()
1744 if (dn->dn_rm_spillblk[i] == DN_KILL_SPILLBLK) in dnode_spill_freed()
1747 mutex_exit(&dn->dn_mtx); in dnode_spill_freed()
1753 dnode_block_freed(dnode_t *dn, uint64_t blkid) in dnode_block_freed() argument
1755 void *dp = spa_get_dsl(dn->dn_objset->os_spa); in dnode_block_freed()
1768 if (dn->dn_free_txg) in dnode_block_freed()
1772 return (dnode_spill_freed(dn)); in dnode_block_freed()
1774 mutex_enter(&dn->dn_mtx); in dnode_block_freed()
1776 if (dn->dn_free_ranges[i] != NULL && in dnode_block_freed()
1777 range_tree_contains(dn->dn_free_ranges[i], blkid, 1)) in dnode_block_freed()
1780 mutex_exit(&dn->dn_mtx); in dnode_block_freed()
1786 dnode_diduse_space(dnode_t *dn, int64_t delta) in dnode_diduse_space() argument
1789 dprintf_dnode(dn, "dn=%p dnp=%p used=%llu delta=%lld\n", in dnode_diduse_space()
1790 dn, dn->dn_phys, in dnode_diduse_space()
1791 (u_longlong_t)dn->dn_phys->dn_used, in dnode_diduse_space()
1794 mutex_enter(&dn->dn_mtx); in dnode_diduse_space()
1795 space = DN_USED_BYTES(dn->dn_phys); in dnode_diduse_space()
1802 if (spa_version(dn->dn_objset->os_spa) < SPA_VERSION_DNODE_BYTES) { in dnode_diduse_space()
1803 ASSERT((dn->dn_phys->dn_flags & DNODE_FLAG_USED_BYTES) == 0); in dnode_diduse_space()
1805 dn->dn_phys->dn_used = space >> DEV_BSHIFT; in dnode_diduse_space()
1807 dn->dn_phys->dn_used = space; in dnode_diduse_space()
1808 dn->dn_phys->dn_flags |= DNODE_FLAG_USED_BYTES; in dnode_diduse_space()
1810 mutex_exit(&dn->dn_mtx); in dnode_diduse_space()
1818 dnode_willuse_space(dnode_t *dn, int64_t space, dmu_tx_t *tx) in dnode_willuse_space() argument
1820 objset_t *os = dn->dn_objset; in dnode_willuse_space()
1851 dnode_next_offset_level(dnode_t *dn, int flags, uint64_t *offset, in dnode_next_offset_level() argument
1856 uint64_t epbs = dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT; in dnode_next_offset_level()
1863 dn->dn_object, *offset, lvl, dn->dn_phys->dn_nlevels); in dnode_next_offset_level()
1869 if (lvl == dn->dn_phys->dn_nlevels) { in dnode_next_offset_level()
1871 epb = dn->dn_phys->dn_nblkptr; in dnode_next_offset_level()
1872 data = dn->dn_phys->dn_blkptr; in dnode_next_offset_level()
1874 uint64_t blkid = dbuf_whichblock(dn, lvl, *offset); in dnode_next_offset_level()
1875 error = dbuf_hold_impl(dn, lvl, blkid, TRUE, FALSE, FTAG, &db); in dnode_next_offset_level()
1910 ASSERT(dn->dn_type == DMU_OT_DNODE); in dnode_next_offset_level()
1923 span = (lvl - 1) * epbs + dn->dn_datablkshift; in dnode_next_offset_level()
1984 dnode_next_offset(dnode_t *dn, int flags, uint64_t *offset, in dnode_next_offset() argument
1992 rw_enter(&dn->dn_struct_rwlock, RW_READER); in dnode_next_offset()
1994 if (dn->dn_phys->dn_nlevels == 0) { in dnode_next_offset()
1999 if (dn->dn_datablkshift == 0) { in dnode_next_offset()
2000 if (*offset < dn->dn_datablksz) { in dnode_next_offset()
2002 *offset = dn->dn_datablksz; in dnode_next_offset()
2009 maxlvl = dn->dn_phys->dn_nlevels; in dnode_next_offset()
2012 error = dnode_next_offset_level(dn, in dnode_next_offset()
2019 error = dnode_next_offset_level(dn, in dnode_next_offset()
2037 rw_exit(&dn->dn_struct_rwlock); in dnode_next_offset()