Lines Matching refs:dn
105 dnode_t *dn = arg; in dnode_cons() local
108 rw_init(&dn->dn_struct_rwlock, NULL, RW_DEFAULT, NULL); in dnode_cons()
109 mutex_init(&dn->dn_mtx, NULL, MUTEX_DEFAULT, NULL); in dnode_cons()
110 mutex_init(&dn->dn_dbufs_mtx, NULL, MUTEX_DEFAULT, NULL); in dnode_cons()
111 cv_init(&dn->dn_notxholds, NULL, CV_DEFAULT, NULL); in dnode_cons()
117 refcount_create_untracked(&dn->dn_holds); in dnode_cons()
118 refcount_create(&dn->dn_tx_holds); in dnode_cons()
119 list_link_init(&dn->dn_link); in dnode_cons()
121 bzero(&dn->dn_next_nblkptr[0], sizeof (dn->dn_next_nblkptr)); in dnode_cons()
122 bzero(&dn->dn_next_nlevels[0], sizeof (dn->dn_next_nlevels)); in dnode_cons()
123 bzero(&dn->dn_next_indblkshift[0], sizeof (dn->dn_next_indblkshift)); in dnode_cons()
124 bzero(&dn->dn_next_bonustype[0], sizeof (dn->dn_next_bonustype)); in dnode_cons()
125 bzero(&dn->dn_rm_spillblk[0], sizeof (dn->dn_rm_spillblk)); in dnode_cons()
126 bzero(&dn->dn_next_bonuslen[0], sizeof (dn->dn_next_bonuslen)); in dnode_cons()
127 bzero(&dn->dn_next_blksz[0], sizeof (dn->dn_next_blksz)); in dnode_cons()
130 list_link_init(&dn->dn_dirty_link[i]); in dnode_cons()
131 dn->dn_free_ranges[i] = NULL; in dnode_cons()
132 list_create(&dn->dn_dirty_records[i], in dnode_cons()
137 dn->dn_allocated_txg = 0; in dnode_cons()
138 dn->dn_free_txg = 0; in dnode_cons()
139 dn->dn_assigned_txg = 0; in dnode_cons()
140 dn->dn_dirtyctx = 0; in dnode_cons()
141 dn->dn_dirtyctx_firstset = NULL; in dnode_cons()
142 dn->dn_bonus = NULL; in dnode_cons()
143 dn->dn_have_spill = B_FALSE; in dnode_cons()
144 dn->dn_zio = NULL; in dnode_cons()
145 dn->dn_oldused = 0; in dnode_cons()
146 dn->dn_oldflags = 0; in dnode_cons()
147 dn->dn_olduid = 0; in dnode_cons()
148 dn->dn_oldgid = 0; in dnode_cons()
149 dn->dn_newuid = 0; in dnode_cons()
150 dn->dn_newgid = 0; in dnode_cons()
151 dn->dn_id_flags = 0; in dnode_cons()
153 dn->dn_dbufs_count = 0; in dnode_cons()
154 dn->dn_unlisted_l0_blkid = 0; in dnode_cons()
155 avl_create(&dn->dn_dbufs, dbuf_compare, sizeof (dmu_buf_impl_t), in dnode_cons()
158 dn->dn_moved = 0; in dnode_cons()
167 dnode_t *dn = arg; in dnode_dest() local
169 rw_destroy(&dn->dn_struct_rwlock); in dnode_dest()
170 mutex_destroy(&dn->dn_mtx); in dnode_dest()
171 mutex_destroy(&dn->dn_dbufs_mtx); in dnode_dest()
172 cv_destroy(&dn->dn_notxholds); in dnode_dest()
173 refcount_destroy(&dn->dn_holds); in dnode_dest()
174 refcount_destroy(&dn->dn_tx_holds); in dnode_dest()
175 ASSERT(!list_link_active(&dn->dn_link)); in dnode_dest()
178 ASSERT(!list_link_active(&dn->dn_dirty_link[i])); in dnode_dest()
179 ASSERT3P(dn->dn_free_ranges[i], ==, NULL); in dnode_dest()
180 list_destroy(&dn->dn_dirty_records[i]); in dnode_dest()
181 ASSERT0(dn->dn_next_nblkptr[i]); in dnode_dest()
182 ASSERT0(dn->dn_next_nlevels[i]); in dnode_dest()
183 ASSERT0(dn->dn_next_indblkshift[i]); in dnode_dest()
184 ASSERT0(dn->dn_next_bonustype[i]); in dnode_dest()
185 ASSERT0(dn->dn_rm_spillblk[i]); in dnode_dest()
186 ASSERT0(dn->dn_next_bonuslen[i]); in dnode_dest()
187 ASSERT0(dn->dn_next_blksz[i]); in dnode_dest()
190 ASSERT0(dn->dn_allocated_txg); in dnode_dest()
191 ASSERT0(dn->dn_free_txg); in dnode_dest()
192 ASSERT0(dn->dn_assigned_txg); in dnode_dest()
193 ASSERT0(dn->dn_dirtyctx); in dnode_dest()
194 ASSERT3P(dn->dn_dirtyctx_firstset, ==, NULL); in dnode_dest()
195 ASSERT3P(dn->dn_bonus, ==, NULL); in dnode_dest()
196 ASSERT(!dn->dn_have_spill); in dnode_dest()
197 ASSERT3P(dn->dn_zio, ==, NULL); in dnode_dest()
198 ASSERT0(dn->dn_oldused); in dnode_dest()
199 ASSERT0(dn->dn_oldflags); in dnode_dest()
200 ASSERT0(dn->dn_olduid); in dnode_dest()
201 ASSERT0(dn->dn_oldgid); in dnode_dest()
202 ASSERT0(dn->dn_newuid); in dnode_dest()
203 ASSERT0(dn->dn_newgid); in dnode_dest()
204 ASSERT0(dn->dn_id_flags); in dnode_dest()
206 ASSERT0(dn->dn_dbufs_count); in dnode_dest()
207 ASSERT0(dn->dn_unlisted_l0_blkid); in dnode_dest()
208 avl_destroy(&dn->dn_dbufs); in dnode_dest()
231 dnode_verify(dnode_t *dn) in dnode_verify() argument
235 ASSERT(dn->dn_phys); in dnode_verify()
236 ASSERT(dn->dn_objset); in dnode_verify()
237 ASSERT(dn->dn_handle->dnh_dnode == dn); in dnode_verify()
239 ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type)); in dnode_verify()
244 if (!RW_WRITE_HELD(&dn->dn_struct_rwlock)) { in dnode_verify()
245 rw_enter(&dn->dn_struct_rwlock, RW_READER); in dnode_verify()
248 if (dn->dn_phys->dn_type != DMU_OT_NONE || dn->dn_allocated_txg != 0) { in dnode_verify()
250 ASSERT3U(dn->dn_indblkshift, >=, 0); in dnode_verify()
251 ASSERT3U(dn->dn_indblkshift, <=, SPA_MAXBLOCKSHIFT); in dnode_verify()
252 if (dn->dn_datablkshift) { in dnode_verify()
253 ASSERT3U(dn->dn_datablkshift, >=, SPA_MINBLOCKSHIFT); in dnode_verify()
254 ASSERT3U(dn->dn_datablkshift, <=, SPA_MAXBLOCKSHIFT); in dnode_verify()
255 ASSERT3U(1<<dn->dn_datablkshift, ==, dn->dn_datablksz); in dnode_verify()
257 ASSERT3U(dn->dn_nlevels, <=, 30); in dnode_verify()
258 ASSERT(DMU_OT_IS_VALID(dn->dn_type)); in dnode_verify()
259 ASSERT3U(dn->dn_nblkptr, >=, 1); in dnode_verify()
260 ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR); in dnode_verify()
261 ASSERT3U(dn->dn_bonuslen, <=, DN_MAX_BONUSLEN); in dnode_verify()
262 ASSERT3U(dn->dn_datablksz, ==, in dnode_verify()
263 dn->dn_datablkszsec << SPA_MINBLOCKSHIFT); in dnode_verify()
264 ASSERT3U(ISP2(dn->dn_datablksz), ==, dn->dn_datablkshift != 0); in dnode_verify()
265 ASSERT3U((dn->dn_nblkptr - 1) * sizeof (blkptr_t) + in dnode_verify()
266 dn->dn_bonuslen, <=, DN_MAX_BONUSLEN); in dnode_verify()
268 ASSERT3U(dn->dn_next_nlevels[i], <=, dn->dn_nlevels); in dnode_verify()
271 if (dn->dn_phys->dn_type != DMU_OT_NONE) in dnode_verify()
272 ASSERT3U(dn->dn_phys->dn_nlevels, <=, dn->dn_nlevels); in dnode_verify()
273 ASSERT(DMU_OBJECT_IS_SPECIAL(dn->dn_object) || dn->dn_dbuf != NULL); in dnode_verify()
274 if (dn->dn_dbuf != NULL) { in dnode_verify()
275 ASSERT3P(dn->dn_phys, ==, in dnode_verify()
276 (dnode_phys_t *)dn->dn_dbuf->db.db_data + in dnode_verify()
277 (dn->dn_object % (dn->dn_dbuf->db.db_size >> DNODE_SHIFT))); in dnode_verify()
280 rw_exit(&dn->dn_struct_rwlock); in dnode_verify()
353 dnode_setbonuslen(dnode_t *dn, int newsize, dmu_tx_t *tx) in dnode_setbonuslen() argument
355 ASSERT3U(refcount_count(&dn->dn_holds), >=, 1); in dnode_setbonuslen()
357 dnode_setdirty(dn, tx); in dnode_setbonuslen()
358 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_setbonuslen()
360 (dn->dn_nblkptr-1) * sizeof (blkptr_t)); in dnode_setbonuslen()
361 dn->dn_bonuslen = newsize; in dnode_setbonuslen()
363 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = DN_ZERO_BONUSLEN; in dnode_setbonuslen()
365 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = dn->dn_bonuslen; in dnode_setbonuslen()
366 rw_exit(&dn->dn_struct_rwlock); in dnode_setbonuslen()
370 dnode_setbonus_type(dnode_t *dn, dmu_object_type_t newtype, dmu_tx_t *tx) in dnode_setbonus_type() argument
372 ASSERT3U(refcount_count(&dn->dn_holds), >=, 1); in dnode_setbonus_type()
373 dnode_setdirty(dn, tx); in dnode_setbonus_type()
374 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_setbonus_type()
375 dn->dn_bonustype = newtype; in dnode_setbonus_type()
376 dn->dn_next_bonustype[tx->tx_txg & TXG_MASK] = dn->dn_bonustype; in dnode_setbonus_type()
377 rw_exit(&dn->dn_struct_rwlock); in dnode_setbonus_type()
381 dnode_rm_spill(dnode_t *dn, dmu_tx_t *tx) in dnode_rm_spill() argument
383 ASSERT3U(refcount_count(&dn->dn_holds), >=, 1); in dnode_rm_spill()
384 ASSERT(RW_WRITE_HELD(&dn->dn_struct_rwlock)); in dnode_rm_spill()
385 dnode_setdirty(dn, tx); in dnode_rm_spill()
386 dn->dn_rm_spillblk[tx->tx_txg&TXG_MASK] = DN_KILL_SPILLBLK; in dnode_rm_spill()
387 dn->dn_have_spill = B_FALSE; in dnode_rm_spill()
391 dnode_setdblksz(dnode_t *dn, int size) in dnode_setdblksz() argument
397 1<<(sizeof (dn->dn_phys->dn_datablkszsec) * 8)); in dnode_setdblksz()
398 dn->dn_datablksz = size; in dnode_setdblksz()
399 dn->dn_datablkszsec = size >> SPA_MINBLOCKSHIFT; in dnode_setdblksz()
400 dn->dn_datablkshift = ISP2(size) ? highbit64(size - 1) : 0; in dnode_setdblksz()
407 dnode_t *dn; in dnode_create() local
409 dn = kmem_cache_alloc(dnode_cache, KM_SLEEP); in dnode_create()
410 ASSERT(!POINTER_IS_VALID(dn->dn_objset)); in dnode_create()
411 dn->dn_moved = 0; in dnode_create()
417 dn->dn_object = object; in dnode_create()
418 dn->dn_dbuf = db; in dnode_create()
419 dn->dn_handle = dnh; in dnode_create()
420 dn->dn_phys = dnp; in dnode_create()
423 dnode_setdblksz(dn, dnp->dn_datablkszsec << SPA_MINBLOCKSHIFT); in dnode_create()
425 dn->dn_datablksz = 0; in dnode_create()
426 dn->dn_datablkszsec = 0; in dnode_create()
427 dn->dn_datablkshift = 0; in dnode_create()
429 dn->dn_indblkshift = dnp->dn_indblkshift; in dnode_create()
430 dn->dn_nlevels = dnp->dn_nlevels; in dnode_create()
431 dn->dn_type = dnp->dn_type; in dnode_create()
432 dn->dn_nblkptr = dnp->dn_nblkptr; in dnode_create()
433 dn->dn_checksum = dnp->dn_checksum; in dnode_create()
434 dn->dn_compress = dnp->dn_compress; in dnode_create()
435 dn->dn_bonustype = dnp->dn_bonustype; in dnode_create()
436 dn->dn_bonuslen = dnp->dn_bonuslen; in dnode_create()
437 dn->dn_maxblkid = dnp->dn_maxblkid; in dnode_create()
438 dn->dn_have_spill = ((dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) != 0); in dnode_create()
439 dn->dn_id_flags = 0; in dnode_create()
441 dmu_zfetch_init(&dn->dn_zfetch, dn); in dnode_create()
443 ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type)); in dnode_create()
449 kmem_cache_free(dnode_cache, dn); in dnode_create()
461 list_insert_head(&os->os_dnodes, dn); in dnode_create()
468 dn->dn_objset = os; in dnode_create()
470 dnh->dnh_dnode = dn; in dnode_create()
474 return (dn); in dnode_create()
481 dnode_destroy(dnode_t *dn) in dnode_destroy() argument
483 objset_t *os = dn->dn_objset; in dnode_destroy()
486 ASSERT((dn->dn_id_flags & DN_ID_NEW_EXIST) == 0); in dnode_destroy()
489 POINTER_INVALIDATE(&dn->dn_objset); in dnode_destroy()
490 if (!DMU_OBJECT_IS_SPECIAL(dn->dn_object)) { in dnode_destroy()
491 list_remove(&os->os_dnodes, dn); in dnode_destroy()
499 zrl_remove(&dn->dn_handle->dnh_zrlock); in dnode_destroy()
501 dn->dn_allocated_txg = 0; in dnode_destroy()
502 dn->dn_free_txg = 0; in dnode_destroy()
503 dn->dn_assigned_txg = 0; in dnode_destroy()
505 dn->dn_dirtyctx = 0; in dnode_destroy()
506 if (dn->dn_dirtyctx_firstset != NULL) { in dnode_destroy()
507 kmem_free(dn->dn_dirtyctx_firstset, 1); in dnode_destroy()
508 dn->dn_dirtyctx_firstset = NULL; in dnode_destroy()
510 if (dn->dn_bonus != NULL) { in dnode_destroy()
511 mutex_enter(&dn->dn_bonus->db_mtx); in dnode_destroy()
512 dbuf_evict(dn->dn_bonus); in dnode_destroy()
513 dn->dn_bonus = NULL; in dnode_destroy()
515 dn->dn_zio = NULL; in dnode_destroy()
517 dn->dn_have_spill = B_FALSE; in dnode_destroy()
518 dn->dn_oldused = 0; in dnode_destroy()
519 dn->dn_oldflags = 0; in dnode_destroy()
520 dn->dn_olduid = 0; in dnode_destroy()
521 dn->dn_oldgid = 0; in dnode_destroy()
522 dn->dn_newuid = 0; in dnode_destroy()
523 dn->dn_newgid = 0; in dnode_destroy()
524 dn->dn_id_flags = 0; in dnode_destroy()
525 dn->dn_unlisted_l0_blkid = 0; in dnode_destroy()
527 dmu_zfetch_fini(&dn->dn_zfetch); in dnode_destroy()
528 kmem_cache_free(dnode_cache, dn); in dnode_destroy()
536 dnode_allocate(dnode_t *dn, dmu_object_type_t ot, int blocksize, int ibs, in dnode_allocate() argument
542 spa_maxblocksize(dmu_objset_spa(dn->dn_objset))); in dnode_allocate()
553 dprintf("os=%p obj=%llu txg=%llu blocksize=%d ibs=%d\n", dn->dn_objset, in dnode_allocate()
554 dn->dn_object, tx->tx_txg, blocksize, ibs); in dnode_allocate()
556 ASSERT(dn->dn_type == DMU_OT_NONE); in dnode_allocate()
557 ASSERT(bcmp(dn->dn_phys, &dnode_phys_zero, sizeof (dnode_phys_t)) == 0); in dnode_allocate()
558 ASSERT(dn->dn_phys->dn_type == DMU_OT_NONE); in dnode_allocate()
566 ASSERT(dn->dn_type == DMU_OT_NONE); in dnode_allocate()
567 ASSERT0(dn->dn_maxblkid); in dnode_allocate()
568 ASSERT0(dn->dn_allocated_txg); in dnode_allocate()
569 ASSERT0(dn->dn_assigned_txg); in dnode_allocate()
570 ASSERT(refcount_is_zero(&dn->dn_tx_holds)); in dnode_allocate()
571 ASSERT3U(refcount_count(&dn->dn_holds), <=, 1); in dnode_allocate()
572 ASSERT(avl_is_empty(&dn->dn_dbufs)); in dnode_allocate()
575 ASSERT0(dn->dn_next_nblkptr[i]); in dnode_allocate()
576 ASSERT0(dn->dn_next_nlevels[i]); in dnode_allocate()
577 ASSERT0(dn->dn_next_indblkshift[i]); in dnode_allocate()
578 ASSERT0(dn->dn_next_bonuslen[i]); in dnode_allocate()
579 ASSERT0(dn->dn_next_bonustype[i]); in dnode_allocate()
580 ASSERT0(dn->dn_rm_spillblk[i]); in dnode_allocate()
581 ASSERT0(dn->dn_next_blksz[i]); in dnode_allocate()
582 ASSERT(!list_link_active(&dn->dn_dirty_link[i])); in dnode_allocate()
583 ASSERT3P(list_head(&dn->dn_dirty_records[i]), ==, NULL); in dnode_allocate()
584 ASSERT3P(dn->dn_free_ranges[i], ==, NULL); in dnode_allocate()
587 dn->dn_type = ot; in dnode_allocate()
588 dnode_setdblksz(dn, blocksize); in dnode_allocate()
589 dn->dn_indblkshift = ibs; in dnode_allocate()
590 dn->dn_nlevels = 1; in dnode_allocate()
592 dn->dn_nblkptr = 1; in dnode_allocate()
594 dn->dn_nblkptr = 1 + in dnode_allocate()
596 dn->dn_bonustype = bonustype; in dnode_allocate()
597 dn->dn_bonuslen = bonuslen; in dnode_allocate()
598 dn->dn_checksum = ZIO_CHECKSUM_INHERIT; in dnode_allocate()
599 dn->dn_compress = ZIO_COMPRESS_INHERIT; in dnode_allocate()
600 dn->dn_dirtyctx = 0; in dnode_allocate()
602 dn->dn_free_txg = 0; in dnode_allocate()
603 if (dn->dn_dirtyctx_firstset) { in dnode_allocate()
604 kmem_free(dn->dn_dirtyctx_firstset, 1); in dnode_allocate()
605 dn->dn_dirtyctx_firstset = NULL; in dnode_allocate()
608 dn->dn_allocated_txg = tx->tx_txg; in dnode_allocate()
609 dn->dn_id_flags = 0; in dnode_allocate()
611 dnode_setdirty(dn, tx); in dnode_allocate()
612 dn->dn_next_indblkshift[tx->tx_txg & TXG_MASK] = ibs; in dnode_allocate()
613 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = dn->dn_bonuslen; in dnode_allocate()
614 dn->dn_next_bonustype[tx->tx_txg & TXG_MASK] = dn->dn_bonustype; in dnode_allocate()
615 dn->dn_next_blksz[tx->tx_txg & TXG_MASK] = dn->dn_datablksz; in dnode_allocate()
619 dnode_reallocate(dnode_t *dn, dmu_object_type_t ot, int blocksize, in dnode_reallocate() argument
626 spa_maxblocksize(dmu_objset_spa(dn->dn_objset))); in dnode_reallocate()
628 ASSERT(dn->dn_object != DMU_META_DNODE_OBJECT || dmu_tx_private_ok(tx)); in dnode_reallocate()
637 dnode_evict_dbufs(dn); in dnode_reallocate()
639 dn->dn_id_flags = 0; in dnode_reallocate()
641 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_reallocate()
642 dnode_setdirty(dn, tx); in dnode_reallocate()
643 if (dn->dn_datablksz != blocksize) { in dnode_reallocate()
645 ASSERT(dn->dn_maxblkid == 0 && in dnode_reallocate()
646 (BP_IS_HOLE(&dn->dn_phys->dn_blkptr[0]) || in dnode_reallocate()
647 dnode_block_freed(dn, 0))); in dnode_reallocate()
648 dnode_setdblksz(dn, blocksize); in dnode_reallocate()
649 dn->dn_next_blksz[tx->tx_txg&TXG_MASK] = blocksize; in dnode_reallocate()
651 if (dn->dn_bonuslen != bonuslen) in dnode_reallocate()
652 dn->dn_next_bonuslen[tx->tx_txg&TXG_MASK] = bonuslen; in dnode_reallocate()
658 if (dn->dn_bonustype != bonustype) in dnode_reallocate()
659 dn->dn_next_bonustype[tx->tx_txg&TXG_MASK] = bonustype; in dnode_reallocate()
660 if (dn->dn_nblkptr != nblkptr) in dnode_reallocate()
661 dn->dn_next_nblkptr[tx->tx_txg&TXG_MASK] = nblkptr; in dnode_reallocate()
662 if (dn->dn_phys->dn_flags & DNODE_FLAG_SPILL_BLKPTR) { in dnode_reallocate()
663 dbuf_rm_spill(dn, tx); in dnode_reallocate()
664 dnode_rm_spill(dn, tx); in dnode_reallocate()
666 rw_exit(&dn->dn_struct_rwlock); in dnode_reallocate()
669 dn->dn_type = ot; in dnode_reallocate()
672 mutex_enter(&dn->dn_mtx); in dnode_reallocate()
673 dn->dn_bonustype = bonustype; in dnode_reallocate()
674 dn->dn_bonuslen = bonuslen; in dnode_reallocate()
675 dn->dn_nblkptr = nblkptr; in dnode_reallocate()
676 dn->dn_checksum = ZIO_CHECKSUM_INHERIT; in dnode_reallocate()
677 dn->dn_compress = ZIO_COMPRESS_INHERIT; in dnode_reallocate()
678 ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR); in dnode_reallocate()
681 if (dn->dn_bonus) { in dnode_reallocate()
682 dn->dn_bonus->db.db_size = in dnode_reallocate()
683 DN_MAX_BONUSLEN - (dn->dn_nblkptr-1) * sizeof (blkptr_t); in dnode_reallocate()
684 ASSERT(dn->dn_bonuslen <= dn->dn_bonus->db.db_size); in dnode_reallocate()
687 dn->dn_allocated_txg = tx->tx_txg; in dnode_reallocate()
688 mutex_exit(&dn->dn_mtx); in dnode_reallocate()
987 dnode_t *dn = dnh->dnh_dnode; in dnode_special_close() local
995 while (refcount_count(&dn->dn_holds) > 0) in dnode_special_close()
997 ASSERT(dn->dn_dbuf == NULL || in dnode_special_close()
998 dmu_buf_get_user(&dn->dn_dbuf->db) == NULL); in dnode_special_close()
1000 dnode_destroy(dn); /* implicit zrl_remove() */ in dnode_special_close()
1009 dnode_t *dn; in dnode_special_open() local
1011 dn = dnode_create(os, dnp, NULL, object, dnh); in dnode_special_open()
1013 DNODE_VERIFY(dn); in dnode_special_open()
1024 dnode_t *dn; in dnode_buf_evict_async() local
1037 dn = dnh->dnh_dnode; in dnode_buf_evict_async()
1044 ASSERT(refcount_is_zero(&dn->dn_holds)); in dnode_buf_evict_async()
1045 ASSERT(refcount_is_zero(&dn->dn_tx_holds)); in dnode_buf_evict_async()
1047 dnode_destroy(dn); /* implicit zrl_remove() */ in dnode_buf_evict_async()
1069 dnode_t *mdn, *dn; in dnode_hold_impl() local
1085 dn = (object == DMU_USERUSED_OBJECT) ? in dnode_hold_impl()
1087 if (dn == NULL) in dnode_hold_impl()
1089 type = dn->dn_type; in dnode_hold_impl()
1094 DNODE_VERIFY(dn); in dnode_hold_impl()
1095 (void) refcount_add(&dn->dn_holds, tag); in dnode_hold_impl()
1096 *dnp = dn; in dnode_hold_impl()
1161 dn = dnh->dnh_dnode; in dnode_hold_impl()
1162 if (dn == NULL) { in dnode_hold_impl()
1165 dn = dnode_create(os, phys, db, object, dnh); in dnode_hold_impl()
1168 mutex_enter(&dn->dn_mtx); in dnode_hold_impl()
1169 type = dn->dn_type; in dnode_hold_impl()
1170 if (dn->dn_free_txg || in dnode_hold_impl()
1173 (type != DMU_OT_NONE || !refcount_is_zero(&dn->dn_holds)))) { in dnode_hold_impl()
1174 mutex_exit(&dn->dn_mtx); in dnode_hold_impl()
1179 if (refcount_add(&dn->dn_holds, tag) == 1) in dnode_hold_impl()
1181 mutex_exit(&dn->dn_mtx); in dnode_hold_impl()
1186 DNODE_VERIFY(dn); in dnode_hold_impl()
1187 ASSERT3P(dn->dn_dbuf, ==, db); in dnode_hold_impl()
1188 ASSERT3U(dn->dn_object, ==, object); in dnode_hold_impl()
1191 *dnp = dn; in dnode_hold_impl()
1210 dnode_add_ref(dnode_t *dn, void *tag) in dnode_add_ref() argument
1212 mutex_enter(&dn->dn_mtx); in dnode_add_ref()
1213 if (refcount_is_zero(&dn->dn_holds)) { in dnode_add_ref()
1214 mutex_exit(&dn->dn_mtx); in dnode_add_ref()
1217 VERIFY(1 < refcount_add(&dn->dn_holds, tag)); in dnode_add_ref()
1218 mutex_exit(&dn->dn_mtx); in dnode_add_ref()
1223 dnode_rele(dnode_t *dn, void *tag) in dnode_rele() argument
1225 mutex_enter(&dn->dn_mtx); in dnode_rele()
1226 dnode_rele_and_unlock(dn, tag); in dnode_rele()
1230 dnode_rele_and_unlock(dnode_t *dn, void *tag) in dnode_rele_and_unlock() argument
1234 dmu_buf_impl_t *db = dn->dn_dbuf; in dnode_rele_and_unlock()
1235 dnode_handle_t *dnh = dn->dn_handle; in dnode_rele_and_unlock()
1237 refs = refcount_remove(&dn->dn_holds, tag); in dnode_rele_and_unlock()
1238 mutex_exit(&dn->dn_mtx); in dnode_rele_and_unlock()
1266 dnode_setdirty(dnode_t *dn, dmu_tx_t *tx) in dnode_setdirty() argument
1268 objset_t *os = dn->dn_objset; in dnode_setdirty()
1271 if (DMU_OBJECT_IS_SPECIAL(dn->dn_object)) { in dnode_setdirty()
1276 DNODE_VERIFY(dn); in dnode_setdirty()
1279 mutex_enter(&dn->dn_mtx); in dnode_setdirty()
1280 ASSERT(dn->dn_phys->dn_type || dn->dn_allocated_txg); in dnode_setdirty()
1281 ASSERT(dn->dn_free_txg == 0 || dn->dn_free_txg >= txg); in dnode_setdirty()
1282 mutex_exit(&dn->dn_mtx); in dnode_setdirty()
1288 dmu_objset_userquota_get_ids(dn, B_TRUE, tx); in dnode_setdirty()
1295 if (list_link_active(&dn->dn_dirty_link[txg & TXG_MASK])) { in dnode_setdirty()
1300 ASSERT(!refcount_is_zero(&dn->dn_holds) || in dnode_setdirty()
1301 !avl_is_empty(&dn->dn_dbufs)); in dnode_setdirty()
1302 ASSERT(dn->dn_datablksz != 0); in dnode_setdirty()
1303 ASSERT0(dn->dn_next_bonuslen[txg&TXG_MASK]); in dnode_setdirty()
1304 ASSERT0(dn->dn_next_blksz[txg&TXG_MASK]); in dnode_setdirty()
1305 ASSERT0(dn->dn_next_bonustype[txg&TXG_MASK]); in dnode_setdirty()
1308 dn->dn_object, txg); in dnode_setdirty()
1310 if (dn->dn_free_txg > 0 && dn->dn_free_txg <= txg) { in dnode_setdirty()
1311 list_insert_tail(&os->os_free_dnodes[txg&TXG_MASK], dn); in dnode_setdirty()
1313 list_insert_tail(&os->os_dirty_dnodes[txg&TXG_MASK], dn); in dnode_setdirty()
1327 VERIFY(dnode_add_ref(dn, (void *)(uintptr_t)tx->tx_txg)); in dnode_setdirty()
1329 (void) dbuf_dirty(dn->dn_dbuf, tx); in dnode_setdirty()
1335 dnode_free(dnode_t *dn, dmu_tx_t *tx) in dnode_free() argument
1339 dprintf("dn=%p txg=%llu\n", dn, tx->tx_txg); in dnode_free()
1344 mutex_enter(&dn->dn_mtx); in dnode_free()
1345 if (dn->dn_type == DMU_OT_NONE || dn->dn_free_txg) { in dnode_free()
1346 mutex_exit(&dn->dn_mtx); in dnode_free()
1349 dn->dn_free_txg = tx->tx_txg; in dnode_free()
1350 mutex_exit(&dn->dn_mtx); in dnode_free()
1356 mutex_enter(&dn->dn_objset->os_lock); in dnode_free()
1357 if (list_link_active(&dn->dn_dirty_link[txgoff])) { in dnode_free()
1358 list_remove(&dn->dn_objset->os_dirty_dnodes[txgoff], dn); in dnode_free()
1359 list_insert_tail(&dn->dn_objset->os_free_dnodes[txgoff], dn); in dnode_free()
1360 mutex_exit(&dn->dn_objset->os_lock); in dnode_free()
1362 mutex_exit(&dn->dn_objset->os_lock); in dnode_free()
1363 dnode_setdirty(dn, tx); in dnode_free()
1372 dnode_set_blksz(dnode_t *dn, uint64_t size, int ibs, dmu_tx_t *tx) in dnode_set_blksz() argument
1377 ASSERT3U(size, <=, spa_maxblocksize(dmu_objset_spa(dn->dn_objset))); in dnode_set_blksz()
1383 if (ibs == dn->dn_indblkshift) in dnode_set_blksz()
1386 if (size >> SPA_MINBLOCKSHIFT == dn->dn_datablkszsec && ibs == 0) in dnode_set_blksz()
1389 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_set_blksz()
1392 if (dn->dn_maxblkid != 0) in dnode_set_blksz()
1395 mutex_enter(&dn->dn_dbufs_mtx); in dnode_set_blksz()
1396 for (db = avl_first(&dn->dn_dbufs); db != NULL; in dnode_set_blksz()
1397 db = AVL_NEXT(&dn->dn_dbufs, db)) { in dnode_set_blksz()
1400 mutex_exit(&dn->dn_dbufs_mtx); in dnode_set_blksz()
1404 mutex_exit(&dn->dn_dbufs_mtx); in dnode_set_blksz()
1406 if (ibs && dn->dn_nlevels != 1) in dnode_set_blksz()
1410 err = dbuf_hold_impl(dn, 0, 0, TRUE, FALSE, FTAG, &db); in dnode_set_blksz()
1416 dnode_setdblksz(dn, size); in dnode_set_blksz()
1417 dnode_setdirty(dn, tx); in dnode_set_blksz()
1418 dn->dn_next_blksz[tx->tx_txg&TXG_MASK] = size; in dnode_set_blksz()
1420 dn->dn_indblkshift = ibs; in dnode_set_blksz()
1421 dn->dn_next_indblkshift[tx->tx_txg&TXG_MASK] = ibs; in dnode_set_blksz()
1427 rw_exit(&dn->dn_struct_rwlock); in dnode_set_blksz()
1431 rw_exit(&dn->dn_struct_rwlock); in dnode_set_blksz()
1437 dnode_new_blkid(dnode_t *dn, uint64_t blkid, dmu_tx_t *tx, boolean_t have_read) in dnode_new_blkid() argument
1446 RW_READ_HELD(&dn->dn_struct_rwlock) : in dnode_new_blkid()
1447 RW_WRITE_HELD(&dn->dn_struct_rwlock)); in dnode_new_blkid()
1454 if (blkid <= dn->dn_maxblkid) in dnode_new_blkid()
1457 if (!rw_tryupgrade(&dn->dn_struct_rwlock)) { in dnode_new_blkid()
1458 rw_exit(&dn->dn_struct_rwlock); in dnode_new_blkid()
1459 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_new_blkid()
1463 if (blkid <= dn->dn_maxblkid) in dnode_new_blkid()
1466 dn->dn_maxblkid = blkid; in dnode_new_blkid()
1472 epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT; in dnode_new_blkid()
1473 for (sz = dn->dn_nblkptr; in dnode_new_blkid()
1474 sz <= blkid && sz >= dn->dn_nblkptr; sz <<= epbs) in dnode_new_blkid()
1477 if (new_nlevels > dn->dn_nlevels) { in dnode_new_blkid()
1478 int old_nlevels = dn->dn_nlevels; in dnode_new_blkid()
1483 dn->dn_nlevels = new_nlevels; in dnode_new_blkid()
1485 ASSERT3U(new_nlevels, >, dn->dn_next_nlevels[txgoff]); in dnode_new_blkid()
1486 dn->dn_next_nlevels[txgoff] = new_nlevels; in dnode_new_blkid()
1489 db = dbuf_hold_level(dn, old_nlevels, 0, FTAG); in dnode_new_blkid()
1495 mutex_enter(&dn->dn_mtx); in dnode_new_blkid()
1497 list = &dn->dn_dirty_records[txgoff]; in dnode_new_blkid()
1499 dr_next = list_next(&dn->dn_dirty_records[txgoff], dr); in dnode_new_blkid()
1504 list_remove(&dn->dn_dirty_records[txgoff], dr); in dnode_new_blkid()
1510 mutex_exit(&dn->dn_mtx); in dnode_new_blkid()
1515 rw_downgrade(&dn->dn_struct_rwlock); in dnode_new_blkid()
1519 dnode_dirty_l1(dnode_t *dn, uint64_t l1blkid, dmu_tx_t *tx) in dnode_dirty_l1() argument
1521 dmu_buf_impl_t *db = dbuf_hold_level(dn, 1, l1blkid, FTAG); in dnode_dirty_l1()
1529 dnode_free_range(dnode_t *dn, uint64_t off, uint64_t len, dmu_tx_t *tx) in dnode_free_range() argument
1537 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_free_range()
1538 blksz = dn->dn_datablksz; in dnode_free_range()
1539 blkshift = dn->dn_datablkshift; in dnode_free_range()
1540 epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT; in dnode_free_range()
1553 if ((off >> blkshift) > dn->dn_maxblkid) in dnode_free_range()
1556 ASSERT(dn->dn_maxblkid == 0); in dnode_free_range()
1583 if (dbuf_hold_impl(dn, 0, dbuf_whichblock(dn, 0, off), in dnode_free_range()
1590 rw_exit(&dn->dn_struct_rwlock); in dnode_free_range()
1592 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_free_range()
1607 if ((off >> blkshift) > dn->dn_maxblkid) in dnode_free_range()
1621 if (dbuf_hold_impl(dn, 0, dbuf_whichblock(dn, 0, off+len), in dnode_free_range()
1626 rw_exit(&dn->dn_struct_rwlock); in dnode_free_range()
1628 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_free_range()
1667 if (dn->dn_nlevels > 1) { in dnode_free_range()
1671 dnode_dirty_l1(dn, first, tx); in dnode_free_range()
1673 last = dn->dn_maxblkid >> epbs; in dnode_free_range()
1677 dnode_dirty_l1(dn, last, tx); in dnode_free_range()
1679 int shift = dn->dn_datablkshift + dn->dn_indblkshift - in dnode_free_range()
1689 int err = dnode_next_offset(dn, DNODE_FIND_HAVELOCK, in dnode_free_range()
1708 dnode_dirty_l1(dn, i, tx); in dnode_free_range()
1717 mutex_enter(&dn->dn_mtx); in dnode_free_range()
1719 if (dn->dn_free_ranges[txgoff] == NULL) { in dnode_free_range()
1720 dn->dn_free_ranges[txgoff] = in dnode_free_range()
1721 range_tree_create(NULL, NULL, &dn->dn_mtx); in dnode_free_range()
1723 range_tree_clear(dn->dn_free_ranges[txgoff], blkid, nblks); in dnode_free_range()
1724 range_tree_add(dn->dn_free_ranges[txgoff], blkid, nblks); in dnode_free_range()
1725 dprintf_dnode(dn, "blkid=%llu nblks=%llu txg=%llu\n", in dnode_free_range()
1727 mutex_exit(&dn->dn_mtx); in dnode_free_range()
1729 dbuf_free_range(dn, blkid, blkid + nblks - 1, tx); in dnode_free_range()
1730 dnode_setdirty(dn, tx); in dnode_free_range()
1733 rw_exit(&dn->dn_struct_rwlock); in dnode_free_range()
1737 dnode_spill_freed(dnode_t *dn) in dnode_spill_freed() argument
1741 mutex_enter(&dn->dn_mtx); in dnode_spill_freed()
1743 if (dn->dn_rm_spillblk[i] == DN_KILL_SPILLBLK) in dnode_spill_freed()
1746 mutex_exit(&dn->dn_mtx); in dnode_spill_freed()
1752 dnode_block_freed(dnode_t *dn, uint64_t blkid) in dnode_block_freed() argument
1754 void *dp = spa_get_dsl(dn->dn_objset->os_spa); in dnode_block_freed()
1767 if (dn->dn_free_txg) in dnode_block_freed()
1771 return (dnode_spill_freed(dn)); in dnode_block_freed()
1773 mutex_enter(&dn->dn_mtx); in dnode_block_freed()
1775 if (dn->dn_free_ranges[i] != NULL && in dnode_block_freed()
1776 range_tree_contains(dn->dn_free_ranges[i], blkid, 1)) in dnode_block_freed()
1779 mutex_exit(&dn->dn_mtx); in dnode_block_freed()
1785 dnode_diduse_space(dnode_t *dn, int64_t delta) in dnode_diduse_space() argument
1788 dprintf_dnode(dn, "dn=%p dnp=%p used=%llu delta=%lld\n", in dnode_diduse_space()
1789 dn, dn->dn_phys, in dnode_diduse_space()
1790 (u_longlong_t)dn->dn_phys->dn_used, in dnode_diduse_space()
1793 mutex_enter(&dn->dn_mtx); in dnode_diduse_space()
1794 space = DN_USED_BYTES(dn->dn_phys); in dnode_diduse_space()
1801 if (spa_version(dn->dn_objset->os_spa) < SPA_VERSION_DNODE_BYTES) { in dnode_diduse_space()
1802 ASSERT((dn->dn_phys->dn_flags & DNODE_FLAG_USED_BYTES) == 0); in dnode_diduse_space()
1804 dn->dn_phys->dn_used = space >> DEV_BSHIFT; in dnode_diduse_space()
1806 dn->dn_phys->dn_used = space; in dnode_diduse_space()
1807 dn->dn_phys->dn_flags |= DNODE_FLAG_USED_BYTES; in dnode_diduse_space()
1809 mutex_exit(&dn->dn_mtx); in dnode_diduse_space()
1817 dnode_willuse_space(dnode_t *dn, int64_t space, dmu_tx_t *tx) in dnode_willuse_space() argument
1819 objset_t *os = dn->dn_objset; in dnode_willuse_space()
1850 dnode_next_offset_level(dnode_t *dn, int flags, uint64_t *offset, in dnode_next_offset_level() argument
1855 uint64_t epbs = dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT; in dnode_next_offset_level()
1862 dn->dn_object, *offset, lvl, dn->dn_phys->dn_nlevels); in dnode_next_offset_level()
1868 if (lvl == dn->dn_phys->dn_nlevels) { in dnode_next_offset_level()
1870 epb = dn->dn_phys->dn_nblkptr; in dnode_next_offset_level()
1871 data = dn->dn_phys->dn_blkptr; in dnode_next_offset_level()
1873 uint64_t blkid = dbuf_whichblock(dn, lvl, *offset); in dnode_next_offset_level()
1874 error = dbuf_hold_impl(dn, lvl, blkid, TRUE, FALSE, FTAG, &db); in dnode_next_offset_level()
1909 ASSERT(dn->dn_type == DMU_OT_DNODE); in dnode_next_offset_level()
1922 span = (lvl - 1) * epbs + dn->dn_datablkshift; in dnode_next_offset_level()
1983 dnode_next_offset(dnode_t *dn, int flags, uint64_t *offset, in dnode_next_offset() argument
1991 rw_enter(&dn->dn_struct_rwlock, RW_READER); in dnode_next_offset()
1993 if (dn->dn_phys->dn_nlevels == 0) { in dnode_next_offset()
1998 if (dn->dn_datablkshift == 0) { in dnode_next_offset()
1999 if (*offset < dn->dn_datablksz) { in dnode_next_offset()
2001 *offset = dn->dn_datablksz; in dnode_next_offset()
2008 maxlvl = dn->dn_phys->dn_nlevels; in dnode_next_offset()
2011 error = dnode_next_offset_level(dn, in dnode_next_offset()
2018 error = dnode_next_offset_level(dn, in dnode_next_offset()
2036 rw_exit(&dn->dn_struct_rwlock); in dnode_next_offset()