Lines Matching refs:dn
107 dnode_t *dn = arg; in dnode_cons() local
110 rw_init(&dn->dn_struct_rwlock, NULL, RW_DEFAULT, NULL); in dnode_cons()
111 mutex_init(&dn->dn_mtx, NULL, MUTEX_DEFAULT, NULL); in dnode_cons()
112 mutex_init(&dn->dn_dbufs_mtx, NULL, MUTEX_DEFAULT, NULL); in dnode_cons()
113 cv_init(&dn->dn_notxholds, NULL, CV_DEFAULT, NULL); in dnode_cons()
119 refcount_create_untracked(&dn->dn_holds); in dnode_cons()
120 refcount_create(&dn->dn_tx_holds); in dnode_cons()
121 list_link_init(&dn->dn_link); in dnode_cons()
123 bzero(&dn->dn_next_nblkptr[0], sizeof (dn->dn_next_nblkptr)); in dnode_cons()
124 bzero(&dn->dn_next_nlevels[0], sizeof (dn->dn_next_nlevels)); in dnode_cons()
125 bzero(&dn->dn_next_indblkshift[0], sizeof (dn->dn_next_indblkshift)); in dnode_cons()
126 bzero(&dn->dn_next_bonustype[0], sizeof (dn->dn_next_bonustype)); in dnode_cons()
127 bzero(&dn->dn_rm_spillblk[0], sizeof (dn->dn_rm_spillblk)); in dnode_cons()
128 bzero(&dn->dn_next_bonuslen[0], sizeof (dn->dn_next_bonuslen)); in dnode_cons()
129 bzero(&dn->dn_next_blksz[0], sizeof (dn->dn_next_blksz)); in dnode_cons()
132 list_link_init(&dn->dn_dirty_link[i]); in dnode_cons()
133 dn->dn_free_ranges[i] = NULL; in dnode_cons()
134 list_create(&dn->dn_dirty_records[i], in dnode_cons()
139 dn->dn_allocated_txg = 0; in dnode_cons()
140 dn->dn_free_txg = 0; in dnode_cons()
141 dn->dn_assigned_txg = 0; in dnode_cons()
142 dn->dn_dirtyctx = 0; in dnode_cons()
143 dn->dn_dirtyctx_firstset = NULL; in dnode_cons()
144 dn->dn_bonus = NULL; in dnode_cons()
145 dn->dn_have_spill = B_FALSE; in dnode_cons()
146 dn->dn_zio = NULL; in dnode_cons()
147 dn->dn_oldused = 0; in dnode_cons()
148 dn->dn_oldflags = 0; in dnode_cons()
149 dn->dn_olduid = 0; in dnode_cons()
150 dn->dn_oldgid = 0; in dnode_cons()
151 dn->dn_newuid = 0; in dnode_cons()
152 dn->dn_newgid = 0; in dnode_cons()
153 dn->dn_id_flags = 0; in dnode_cons()
155 dn->dn_dbufs_count = 0; in dnode_cons()
156 avl_create(&dn->dn_dbufs, dbuf_compare, sizeof (dmu_buf_impl_t), in dnode_cons()
159 dn->dn_moved = 0; in dnode_cons()
160 POINTER_INVALIDATE(&dn->dn_objset); in dnode_cons()
169 dnode_t *dn = arg; in dnode_dest() local
171 rw_destroy(&dn->dn_struct_rwlock); in dnode_dest()
172 mutex_destroy(&dn->dn_mtx); in dnode_dest()
173 mutex_destroy(&dn->dn_dbufs_mtx); in dnode_dest()
174 cv_destroy(&dn->dn_notxholds); in dnode_dest()
175 refcount_destroy(&dn->dn_holds); in dnode_dest()
176 refcount_destroy(&dn->dn_tx_holds); in dnode_dest()
177 ASSERT(!list_link_active(&dn->dn_link)); in dnode_dest()
180 ASSERT(!list_link_active(&dn->dn_dirty_link[i])); in dnode_dest()
181 ASSERT3P(dn->dn_free_ranges[i], ==, NULL); in dnode_dest()
182 list_destroy(&dn->dn_dirty_records[i]); in dnode_dest()
183 ASSERT0(dn->dn_next_nblkptr[i]); in dnode_dest()
184 ASSERT0(dn->dn_next_nlevels[i]); in dnode_dest()
185 ASSERT0(dn->dn_next_indblkshift[i]); in dnode_dest()
186 ASSERT0(dn->dn_next_bonustype[i]); in dnode_dest()
187 ASSERT0(dn->dn_rm_spillblk[i]); in dnode_dest()
188 ASSERT0(dn->dn_next_bonuslen[i]); in dnode_dest()
189 ASSERT0(dn->dn_next_blksz[i]); in dnode_dest()
192 ASSERT0(dn->dn_allocated_txg); in dnode_dest()
193 ASSERT0(dn->dn_free_txg); in dnode_dest()
194 ASSERT0(dn->dn_assigned_txg); in dnode_dest()
195 ASSERT0(dn->dn_dirtyctx); in dnode_dest()
196 ASSERT3P(dn->dn_dirtyctx_firstset, ==, NULL); in dnode_dest()
197 ASSERT3P(dn->dn_bonus, ==, NULL); in dnode_dest()
198 ASSERT(!dn->dn_have_spill); in dnode_dest()
199 ASSERT3P(dn->dn_zio, ==, NULL); in dnode_dest()
200 ASSERT0(dn->dn_oldused); in dnode_dest()
201 ASSERT0(dn->dn_oldflags); in dnode_dest()
202 ASSERT0(dn->dn_olduid); in dnode_dest()
203 ASSERT0(dn->dn_oldgid); in dnode_dest()
204 ASSERT0(dn->dn_newuid); in dnode_dest()
205 ASSERT0(dn->dn_newgid); in dnode_dest()
206 ASSERT0(dn->dn_id_flags); in dnode_dest()
208 ASSERT0(dn->dn_dbufs_count); in dnode_dest()
209 avl_destroy(&dn->dn_dbufs); in dnode_dest()
232 dnode_verify(dnode_t *dn) in dnode_verify() argument
236 ASSERT(dn->dn_phys); in dnode_verify()
237 ASSERT(dn->dn_objset); in dnode_verify()
238 ASSERT(dn->dn_handle->dnh_dnode == dn); in dnode_verify()
240 ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type)); in dnode_verify()
245 if (!RW_WRITE_HELD(&dn->dn_struct_rwlock)) { in dnode_verify()
246 rw_enter(&dn->dn_struct_rwlock, RW_READER); in dnode_verify()
249 if (dn->dn_phys->dn_type != DMU_OT_NONE || dn->dn_allocated_txg != 0) { in dnode_verify()
251 ASSERT3U(dn->dn_indblkshift, >=, 0); in dnode_verify()
252 ASSERT3U(dn->dn_indblkshift, <=, SPA_MAXBLOCKSHIFT); in dnode_verify()
253 if (dn->dn_datablkshift) { in dnode_verify()
254 ASSERT3U(dn->dn_datablkshift, >=, SPA_MINBLOCKSHIFT); in dnode_verify()
255 ASSERT3U(dn->dn_datablkshift, <=, SPA_MAXBLOCKSHIFT); in dnode_verify()
256 ASSERT3U(1<<dn->dn_datablkshift, ==, dn->dn_datablksz); in dnode_verify()
258 ASSERT3U(dn->dn_nlevels, <=, 30); in dnode_verify()
259 ASSERT(DMU_OT_IS_VALID(dn->dn_type)); in dnode_verify()
260 ASSERT3U(dn->dn_nblkptr, >=, 1); in dnode_verify()
261 ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR); in dnode_verify()
262 ASSERT3U(dn->dn_bonuslen, <=, DN_MAX_BONUSLEN); in dnode_verify()
263 ASSERT3U(dn->dn_datablksz, ==, in dnode_verify()
264 dn->dn_datablkszsec << SPA_MINBLOCKSHIFT); in dnode_verify()
265 ASSERT3U(ISP2(dn->dn_datablksz), ==, dn->dn_datablkshift != 0); in dnode_verify()
266 ASSERT3U((dn->dn_nblkptr - 1) * sizeof (blkptr_t) + in dnode_verify()
267 dn->dn_bonuslen, <=, DN_MAX_BONUSLEN); in dnode_verify()
269 ASSERT3U(dn->dn_next_nlevels[i], <=, dn->dn_nlevels); in dnode_verify()
272 if (dn->dn_phys->dn_type != DMU_OT_NONE) in dnode_verify()
273 ASSERT3U(dn->dn_phys->dn_nlevels, <=, dn->dn_nlevels); in dnode_verify()
274 ASSERT(DMU_OBJECT_IS_SPECIAL(dn->dn_object) || dn->dn_dbuf != NULL); in dnode_verify()
275 if (dn->dn_dbuf != NULL) { in dnode_verify()
276 ASSERT3P(dn->dn_phys, ==, in dnode_verify()
277 (dnode_phys_t *)dn->dn_dbuf->db.db_data + in dnode_verify()
278 (dn->dn_object % (dn->dn_dbuf->db.db_size >> DNODE_SHIFT))); in dnode_verify()
281 rw_exit(&dn->dn_struct_rwlock); in dnode_verify()
354 dnode_setbonuslen(dnode_t *dn, int newsize, dmu_tx_t *tx) in dnode_setbonuslen() argument
356 ASSERT3U(refcount_count(&dn->dn_holds), >=, 1); in dnode_setbonuslen()
358 dnode_setdirty(dn, tx); in dnode_setbonuslen()
359 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_setbonuslen()
361 (dn->dn_nblkptr-1) * sizeof (blkptr_t)); in dnode_setbonuslen()
362 dn->dn_bonuslen = newsize; in dnode_setbonuslen()
364 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = DN_ZERO_BONUSLEN; in dnode_setbonuslen()
366 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = dn->dn_bonuslen; in dnode_setbonuslen()
367 rw_exit(&dn->dn_struct_rwlock); in dnode_setbonuslen()
371 dnode_setbonus_type(dnode_t *dn, dmu_object_type_t newtype, dmu_tx_t *tx) in dnode_setbonus_type() argument
373 ASSERT3U(refcount_count(&dn->dn_holds), >=, 1); in dnode_setbonus_type()
374 dnode_setdirty(dn, tx); in dnode_setbonus_type()
375 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_setbonus_type()
376 dn->dn_bonustype = newtype; in dnode_setbonus_type()
377 dn->dn_next_bonustype[tx->tx_txg & TXG_MASK] = dn->dn_bonustype; in dnode_setbonus_type()
378 rw_exit(&dn->dn_struct_rwlock); in dnode_setbonus_type()
382 dnode_rm_spill(dnode_t *dn, dmu_tx_t *tx) in dnode_rm_spill() argument
384 ASSERT3U(refcount_count(&dn->dn_holds), >=, 1); in dnode_rm_spill()
385 ASSERT(RW_WRITE_HELD(&dn->dn_struct_rwlock)); in dnode_rm_spill()
386 dnode_setdirty(dn, tx); in dnode_rm_spill()
387 dn->dn_rm_spillblk[tx->tx_txg&TXG_MASK] = DN_KILL_SPILLBLK; in dnode_rm_spill()
388 dn->dn_have_spill = B_FALSE; in dnode_rm_spill()
392 dnode_setdblksz(dnode_t *dn, int size) in dnode_setdblksz() argument
398 1<<(sizeof (dn->dn_phys->dn_datablkszsec) * 8)); in dnode_setdblksz()
399 dn->dn_datablksz = size; in dnode_setdblksz()
400 dn->dn_datablkszsec = size >> SPA_MINBLOCKSHIFT; in dnode_setdblksz()
401 dn->dn_datablkshift = ISP2(size) ? highbit64(size - 1) : 0; in dnode_setdblksz()
408 dnode_t *dn; in dnode_create() local
410 dn = kmem_cache_alloc(dnode_cache, KM_SLEEP); in dnode_create()
411 ASSERT(!POINTER_IS_VALID(dn->dn_objset)); in dnode_create()
412 dn->dn_moved = 0; in dnode_create()
418 dn->dn_object = object; in dnode_create()
419 dn->dn_dbuf = db; in dnode_create()
420 dn->dn_handle = dnh; in dnode_create()
421 dn->dn_phys = dnp; in dnode_create()
424 dnode_setdblksz(dn, dnp->dn_datablkszsec << SPA_MINBLOCKSHIFT); in dnode_create()
426 dn->dn_datablksz = 0; in dnode_create()
427 dn->dn_datablkszsec = 0; in dnode_create()
428 dn->dn_datablkshift = 0; in dnode_create()
430 dn->dn_indblkshift = dnp->dn_indblkshift; in dnode_create()
431 dn->dn_nlevels = dnp->dn_nlevels; in dnode_create()
432 dn->dn_type = dnp->dn_type; in dnode_create()
433 dn->dn_nblkptr = dnp->dn_nblkptr; in dnode_create()
434 dn->dn_checksum = dnp->dn_checksum; in dnode_create()
435 dn->dn_compress = dnp->dn_compress; in dnode_create()
436 dn->dn_bonustype = dnp->dn_bonustype; in dnode_create()
437 dn->dn_bonuslen = dnp->dn_bonuslen; in dnode_create()
438 dn->dn_maxblkid = dnp->dn_maxblkid; in dnode_create()
439 dn->dn_have_spill = ((dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) != 0); in dnode_create()
440 dn->dn_id_flags = 0; in dnode_create()
442 dmu_zfetch_init(&dn->dn_zfetch, dn); in dnode_create()
444 ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type)); in dnode_create()
451 dmu_zfetch_fini(&dn->dn_zfetch); in dnode_create()
453 kmem_cache_free(dnode_cache, dn); in dnode_create()
465 list_insert_head(&os->os_dnodes, dn); in dnode_create()
472 dn->dn_objset = os; in dnode_create()
474 dnh->dnh_dnode = dn; in dnode_create()
478 return (dn); in dnode_create()
485 dnode_destroy(dnode_t *dn) in dnode_destroy() argument
487 objset_t *os = dn->dn_objset; in dnode_destroy()
490 ASSERT((dn->dn_id_flags & DN_ID_NEW_EXIST) == 0); in dnode_destroy()
493 POINTER_INVALIDATE(&dn->dn_objset); in dnode_destroy()
494 if (!DMU_OBJECT_IS_SPECIAL(dn->dn_object)) { in dnode_destroy()
495 list_remove(&os->os_dnodes, dn); in dnode_destroy()
503 zrl_remove(&dn->dn_handle->dnh_zrlock); in dnode_destroy()
505 dn->dn_allocated_txg = 0; in dnode_destroy()
506 dn->dn_free_txg = 0; in dnode_destroy()
507 dn->dn_assigned_txg = 0; in dnode_destroy()
509 dn->dn_dirtyctx = 0; in dnode_destroy()
510 if (dn->dn_dirtyctx_firstset != NULL) { in dnode_destroy()
511 kmem_free(dn->dn_dirtyctx_firstset, 1); in dnode_destroy()
512 dn->dn_dirtyctx_firstset = NULL; in dnode_destroy()
514 if (dn->dn_bonus != NULL) { in dnode_destroy()
515 mutex_enter(&dn->dn_bonus->db_mtx); in dnode_destroy()
516 dbuf_destroy(dn->dn_bonus); in dnode_destroy()
517 dn->dn_bonus = NULL; in dnode_destroy()
519 dn->dn_zio = NULL; in dnode_destroy()
521 dn->dn_have_spill = B_FALSE; in dnode_destroy()
522 dn->dn_oldused = 0; in dnode_destroy()
523 dn->dn_oldflags = 0; in dnode_destroy()
524 dn->dn_olduid = 0; in dnode_destroy()
525 dn->dn_oldgid = 0; in dnode_destroy()
526 dn->dn_newuid = 0; in dnode_destroy()
527 dn->dn_newgid = 0; in dnode_destroy()
528 dn->dn_id_flags = 0; in dnode_destroy()
530 dmu_zfetch_fini(&dn->dn_zfetch); in dnode_destroy()
531 kmem_cache_free(dnode_cache, dn); in dnode_destroy()
539 dnode_allocate(dnode_t *dn, dmu_object_type_t ot, int blocksize, int ibs, in dnode_allocate() argument
545 spa_maxblocksize(dmu_objset_spa(dn->dn_objset))); in dnode_allocate()
556 dprintf("os=%p obj=%llu txg=%llu blocksize=%d ibs=%d\n", dn->dn_objset, in dnode_allocate()
557 dn->dn_object, tx->tx_txg, blocksize, ibs); in dnode_allocate()
559 ASSERT(dn->dn_type == DMU_OT_NONE); in dnode_allocate()
560 ASSERT(bcmp(dn->dn_phys, &dnode_phys_zero, sizeof (dnode_phys_t)) == 0); in dnode_allocate()
561 ASSERT(dn->dn_phys->dn_type == DMU_OT_NONE); in dnode_allocate()
569 ASSERT(dn->dn_type == DMU_OT_NONE); in dnode_allocate()
570 ASSERT0(dn->dn_maxblkid); in dnode_allocate()
571 ASSERT0(dn->dn_allocated_txg); in dnode_allocate()
572 ASSERT0(dn->dn_assigned_txg); in dnode_allocate()
573 ASSERT(refcount_is_zero(&dn->dn_tx_holds)); in dnode_allocate()
574 ASSERT3U(refcount_count(&dn->dn_holds), <=, 1); in dnode_allocate()
575 ASSERT(avl_is_empty(&dn->dn_dbufs)); in dnode_allocate()
578 ASSERT0(dn->dn_next_nblkptr[i]); in dnode_allocate()
579 ASSERT0(dn->dn_next_nlevels[i]); in dnode_allocate()
580 ASSERT0(dn->dn_next_indblkshift[i]); in dnode_allocate()
581 ASSERT0(dn->dn_next_bonuslen[i]); in dnode_allocate()
582 ASSERT0(dn->dn_next_bonustype[i]); in dnode_allocate()
583 ASSERT0(dn->dn_rm_spillblk[i]); in dnode_allocate()
584 ASSERT0(dn->dn_next_blksz[i]); in dnode_allocate()
585 ASSERT(!list_link_active(&dn->dn_dirty_link[i])); in dnode_allocate()
586 ASSERT3P(list_head(&dn->dn_dirty_records[i]), ==, NULL); in dnode_allocate()
587 ASSERT3P(dn->dn_free_ranges[i], ==, NULL); in dnode_allocate()
590 dn->dn_type = ot; in dnode_allocate()
591 dnode_setdblksz(dn, blocksize); in dnode_allocate()
592 dn->dn_indblkshift = ibs; in dnode_allocate()
593 dn->dn_nlevels = 1; in dnode_allocate()
595 dn->dn_nblkptr = 1; in dnode_allocate()
597 dn->dn_nblkptr = 1 + in dnode_allocate()
599 dn->dn_bonustype = bonustype; in dnode_allocate()
600 dn->dn_bonuslen = bonuslen; in dnode_allocate()
601 dn->dn_checksum = ZIO_CHECKSUM_INHERIT; in dnode_allocate()
602 dn->dn_compress = ZIO_COMPRESS_INHERIT; in dnode_allocate()
603 dn->dn_dirtyctx = 0; in dnode_allocate()
605 dn->dn_free_txg = 0; in dnode_allocate()
606 if (dn->dn_dirtyctx_firstset) { in dnode_allocate()
607 kmem_free(dn->dn_dirtyctx_firstset, 1); in dnode_allocate()
608 dn->dn_dirtyctx_firstset = NULL; in dnode_allocate()
611 dn->dn_allocated_txg = tx->tx_txg; in dnode_allocate()
612 dn->dn_id_flags = 0; in dnode_allocate()
614 dnode_setdirty(dn, tx); in dnode_allocate()
615 dn->dn_next_indblkshift[tx->tx_txg & TXG_MASK] = ibs; in dnode_allocate()
616 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = dn->dn_bonuslen; in dnode_allocate()
617 dn->dn_next_bonustype[tx->tx_txg & TXG_MASK] = dn->dn_bonustype; in dnode_allocate()
618 dn->dn_next_blksz[tx->tx_txg & TXG_MASK] = dn->dn_datablksz; in dnode_allocate()
622 dnode_reallocate(dnode_t *dn, dmu_object_type_t ot, int blocksize, in dnode_reallocate() argument
629 spa_maxblocksize(dmu_objset_spa(dn->dn_objset))); in dnode_reallocate()
631 ASSERT(dn->dn_object != DMU_META_DNODE_OBJECT || dmu_tx_private_ok(tx)); in dnode_reallocate()
640 dnode_evict_dbufs(dn); in dnode_reallocate()
642 dn->dn_id_flags = 0; in dnode_reallocate()
644 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_reallocate()
645 dnode_setdirty(dn, tx); in dnode_reallocate()
646 if (dn->dn_datablksz != blocksize) { in dnode_reallocate()
648 ASSERT(dn->dn_maxblkid == 0 && in dnode_reallocate()
649 (BP_IS_HOLE(&dn->dn_phys->dn_blkptr[0]) || in dnode_reallocate()
650 dnode_block_freed(dn, 0))); in dnode_reallocate()
651 dnode_setdblksz(dn, blocksize); in dnode_reallocate()
652 dn->dn_next_blksz[tx->tx_txg&TXG_MASK] = blocksize; in dnode_reallocate()
654 if (dn->dn_bonuslen != bonuslen) in dnode_reallocate()
655 dn->dn_next_bonuslen[tx->tx_txg&TXG_MASK] = bonuslen; in dnode_reallocate()
661 if (dn->dn_bonustype != bonustype) in dnode_reallocate()
662 dn->dn_next_bonustype[tx->tx_txg&TXG_MASK] = bonustype; in dnode_reallocate()
663 if (dn->dn_nblkptr != nblkptr) in dnode_reallocate()
664 dn->dn_next_nblkptr[tx->tx_txg&TXG_MASK] = nblkptr; in dnode_reallocate()
665 if (dn->dn_phys->dn_flags & DNODE_FLAG_SPILL_BLKPTR) { in dnode_reallocate()
666 dbuf_rm_spill(dn, tx); in dnode_reallocate()
667 dnode_rm_spill(dn, tx); in dnode_reallocate()
669 rw_exit(&dn->dn_struct_rwlock); in dnode_reallocate()
672 dn->dn_type = ot; in dnode_reallocate()
675 mutex_enter(&dn->dn_mtx); in dnode_reallocate()
676 dn->dn_bonustype = bonustype; in dnode_reallocate()
677 dn->dn_bonuslen = bonuslen; in dnode_reallocate()
678 dn->dn_nblkptr = nblkptr; in dnode_reallocate()
679 dn->dn_checksum = ZIO_CHECKSUM_INHERIT; in dnode_reallocate()
680 dn->dn_compress = ZIO_COMPRESS_INHERIT; in dnode_reallocate()
681 ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR); in dnode_reallocate()
684 if (dn->dn_bonus) { in dnode_reallocate()
685 dn->dn_bonus->db.db_size = in dnode_reallocate()
686 DN_MAX_BONUSLEN - (dn->dn_nblkptr-1) * sizeof (blkptr_t); in dnode_reallocate()
687 ASSERT(dn->dn_bonuslen <= dn->dn_bonus->db.db_size); in dnode_reallocate()
690 dn->dn_allocated_txg = tx->tx_txg; in dnode_reallocate()
691 mutex_exit(&dn->dn_mtx); in dnode_reallocate()
990 dnode_t *dn = dnh->dnh_dnode; in dnode_special_close() local
998 while (refcount_count(&dn->dn_holds) > 0) in dnode_special_close()
1000 ASSERT(dn->dn_dbuf == NULL || in dnode_special_close()
1001 dmu_buf_get_user(&dn->dn_dbuf->db) == NULL); in dnode_special_close()
1003 dnode_destroy(dn); /* implicit zrl_remove() */ in dnode_special_close()
1012 dnode_t *dn; in dnode_special_open() local
1014 dn = dnode_create(os, dnp, NULL, object, dnh); in dnode_special_open()
1016 DNODE_VERIFY(dn); in dnode_special_open()
1027 dnode_t *dn; in dnode_buf_evict_async() local
1040 dn = dnh->dnh_dnode; in dnode_buf_evict_async()
1047 ASSERT(refcount_is_zero(&dn->dn_holds)); in dnode_buf_evict_async()
1048 ASSERT(refcount_is_zero(&dn->dn_tx_holds)); in dnode_buf_evict_async()
1050 dnode_destroy(dn); /* implicit zrl_remove() */ in dnode_buf_evict_async()
1072 dnode_t *mdn, *dn; in dnode_hold_impl() local
1088 dn = (object == DMU_USERUSED_OBJECT) ? in dnode_hold_impl()
1090 if (dn == NULL) in dnode_hold_impl()
1092 type = dn->dn_type; in dnode_hold_impl()
1097 DNODE_VERIFY(dn); in dnode_hold_impl()
1098 (void) refcount_add(&dn->dn_holds, tag); in dnode_hold_impl()
1099 *dnp = dn; in dnode_hold_impl()
1164 dn = dnh->dnh_dnode; in dnode_hold_impl()
1165 if (dn == NULL) { in dnode_hold_impl()
1168 dn = dnode_create(os, phys, db, object, dnh); in dnode_hold_impl()
1171 mutex_enter(&dn->dn_mtx); in dnode_hold_impl()
1172 type = dn->dn_type; in dnode_hold_impl()
1173 if (dn->dn_free_txg || in dnode_hold_impl()
1176 (type != DMU_OT_NONE || !refcount_is_zero(&dn->dn_holds)))) { in dnode_hold_impl()
1177 mutex_exit(&dn->dn_mtx); in dnode_hold_impl()
1182 if (refcount_add(&dn->dn_holds, tag) == 1) in dnode_hold_impl()
1184 mutex_exit(&dn->dn_mtx); in dnode_hold_impl()
1189 DNODE_VERIFY(dn); in dnode_hold_impl()
1190 ASSERT3P(dn->dn_dbuf, ==, db); in dnode_hold_impl()
1191 ASSERT3U(dn->dn_object, ==, object); in dnode_hold_impl()
1194 *dnp = dn; in dnode_hold_impl()
1213 dnode_add_ref(dnode_t *dn, void *tag) in dnode_add_ref() argument
1215 mutex_enter(&dn->dn_mtx); in dnode_add_ref()
1216 if (refcount_is_zero(&dn->dn_holds)) { in dnode_add_ref()
1217 mutex_exit(&dn->dn_mtx); in dnode_add_ref()
1220 VERIFY(1 < refcount_add(&dn->dn_holds, tag)); in dnode_add_ref()
1221 mutex_exit(&dn->dn_mtx); in dnode_add_ref()
1226 dnode_rele(dnode_t *dn, void *tag) in dnode_rele() argument
1228 mutex_enter(&dn->dn_mtx); in dnode_rele()
1229 dnode_rele_and_unlock(dn, tag); in dnode_rele()
1233 dnode_rele_and_unlock(dnode_t *dn, void *tag) in dnode_rele_and_unlock() argument
1237 dmu_buf_impl_t *db = dn->dn_dbuf; in dnode_rele_and_unlock()
1238 dnode_handle_t *dnh = dn->dn_handle; in dnode_rele_and_unlock()
1240 refs = refcount_remove(&dn->dn_holds, tag); in dnode_rele_and_unlock()
1241 mutex_exit(&dn->dn_mtx); in dnode_rele_and_unlock()
1269 dnode_setdirty(dnode_t *dn, dmu_tx_t *tx) in dnode_setdirty() argument
1271 objset_t *os = dn->dn_objset; in dnode_setdirty()
1274 if (DMU_OBJECT_IS_SPECIAL(dn->dn_object)) { in dnode_setdirty()
1279 DNODE_VERIFY(dn); in dnode_setdirty()
1282 mutex_enter(&dn->dn_mtx); in dnode_setdirty()
1283 ASSERT(dn->dn_phys->dn_type || dn->dn_allocated_txg); in dnode_setdirty()
1284 ASSERT(dn->dn_free_txg == 0 || dn->dn_free_txg >= txg); in dnode_setdirty()
1285 mutex_exit(&dn->dn_mtx); in dnode_setdirty()
1291 dmu_objset_userquota_get_ids(dn, B_TRUE, tx); in dnode_setdirty()
1298 if (list_link_active(&dn->dn_dirty_link[txg & TXG_MASK])) { in dnode_setdirty()
1303 ASSERT(!refcount_is_zero(&dn->dn_holds) || in dnode_setdirty()
1304 !avl_is_empty(&dn->dn_dbufs)); in dnode_setdirty()
1305 ASSERT(dn->dn_datablksz != 0); in dnode_setdirty()
1306 ASSERT0(dn->dn_next_bonuslen[txg&TXG_MASK]); in dnode_setdirty()
1307 ASSERT0(dn->dn_next_blksz[txg&TXG_MASK]); in dnode_setdirty()
1308 ASSERT0(dn->dn_next_bonustype[txg&TXG_MASK]); in dnode_setdirty()
1311 dn->dn_object, txg); in dnode_setdirty()
1313 if (dn->dn_free_txg > 0 && dn->dn_free_txg <= txg) { in dnode_setdirty()
1314 list_insert_tail(&os->os_free_dnodes[txg&TXG_MASK], dn); in dnode_setdirty()
1316 list_insert_tail(&os->os_dirty_dnodes[txg&TXG_MASK], dn); in dnode_setdirty()
1330 VERIFY(dnode_add_ref(dn, (void *)(uintptr_t)tx->tx_txg)); in dnode_setdirty()
1332 (void) dbuf_dirty(dn->dn_dbuf, tx); in dnode_setdirty()
1338 dnode_free(dnode_t *dn, dmu_tx_t *tx) in dnode_free() argument
1342 dprintf("dn=%p txg=%llu\n", dn, tx->tx_txg); in dnode_free()
1347 mutex_enter(&dn->dn_mtx); in dnode_free()
1348 if (dn->dn_type == DMU_OT_NONE || dn->dn_free_txg) { in dnode_free()
1349 mutex_exit(&dn->dn_mtx); in dnode_free()
1352 dn->dn_free_txg = tx->tx_txg; in dnode_free()
1353 mutex_exit(&dn->dn_mtx); in dnode_free()
1359 mutex_enter(&dn->dn_objset->os_lock); in dnode_free()
1360 if (list_link_active(&dn->dn_dirty_link[txgoff])) { in dnode_free()
1361 list_remove(&dn->dn_objset->os_dirty_dnodes[txgoff], dn); in dnode_free()
1362 list_insert_tail(&dn->dn_objset->os_free_dnodes[txgoff], dn); in dnode_free()
1363 mutex_exit(&dn->dn_objset->os_lock); in dnode_free()
1365 mutex_exit(&dn->dn_objset->os_lock); in dnode_free()
1366 dnode_setdirty(dn, tx); in dnode_free()
1375 dnode_set_blksz(dnode_t *dn, uint64_t size, int ibs, dmu_tx_t *tx) in dnode_set_blksz() argument
1380 ASSERT3U(size, <=, spa_maxblocksize(dmu_objset_spa(dn->dn_objset))); in dnode_set_blksz()
1386 if (ibs == dn->dn_indblkshift) in dnode_set_blksz()
1389 if (size >> SPA_MINBLOCKSHIFT == dn->dn_datablkszsec && ibs == 0) in dnode_set_blksz()
1392 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_set_blksz()
1395 if (dn->dn_maxblkid != 0) in dnode_set_blksz()
1398 mutex_enter(&dn->dn_dbufs_mtx); in dnode_set_blksz()
1399 for (db = avl_first(&dn->dn_dbufs); db != NULL; in dnode_set_blksz()
1400 db = AVL_NEXT(&dn->dn_dbufs, db)) { in dnode_set_blksz()
1403 mutex_exit(&dn->dn_dbufs_mtx); in dnode_set_blksz()
1407 mutex_exit(&dn->dn_dbufs_mtx); in dnode_set_blksz()
1409 if (ibs && dn->dn_nlevels != 1) in dnode_set_blksz()
1413 err = dbuf_hold_impl(dn, 0, 0, TRUE, FALSE, FTAG, &db); in dnode_set_blksz()
1419 dnode_setdblksz(dn, size); in dnode_set_blksz()
1420 dnode_setdirty(dn, tx); in dnode_set_blksz()
1421 dn->dn_next_blksz[tx->tx_txg&TXG_MASK] = size; in dnode_set_blksz()
1423 dn->dn_indblkshift = ibs; in dnode_set_blksz()
1424 dn->dn_next_indblkshift[tx->tx_txg&TXG_MASK] = ibs; in dnode_set_blksz()
1430 rw_exit(&dn->dn_struct_rwlock); in dnode_set_blksz()
1434 rw_exit(&dn->dn_struct_rwlock); in dnode_set_blksz()
1440 dnode_new_blkid(dnode_t *dn, uint64_t blkid, dmu_tx_t *tx, boolean_t have_read) in dnode_new_blkid() argument
1449 RW_READ_HELD(&dn->dn_struct_rwlock) : in dnode_new_blkid()
1450 RW_WRITE_HELD(&dn->dn_struct_rwlock)); in dnode_new_blkid()
1457 if (blkid <= dn->dn_maxblkid) in dnode_new_blkid()
1460 if (!rw_tryupgrade(&dn->dn_struct_rwlock)) { in dnode_new_blkid()
1461 rw_exit(&dn->dn_struct_rwlock); in dnode_new_blkid()
1462 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_new_blkid()
1466 if (blkid <= dn->dn_maxblkid) in dnode_new_blkid()
1469 dn->dn_maxblkid = blkid; in dnode_new_blkid()
1475 epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT; in dnode_new_blkid()
1476 for (sz = dn->dn_nblkptr; in dnode_new_blkid()
1477 sz <= blkid && sz >= dn->dn_nblkptr; sz <<= epbs) in dnode_new_blkid()
1480 if (new_nlevels > dn->dn_nlevels) { in dnode_new_blkid()
1481 int old_nlevels = dn->dn_nlevels; in dnode_new_blkid()
1486 dn->dn_nlevels = new_nlevels; in dnode_new_blkid()
1488 ASSERT3U(new_nlevels, >, dn->dn_next_nlevels[txgoff]); in dnode_new_blkid()
1489 dn->dn_next_nlevels[txgoff] = new_nlevels; in dnode_new_blkid()
1492 db = dbuf_hold_level(dn, old_nlevels, 0, FTAG); in dnode_new_blkid()
1498 mutex_enter(&dn->dn_mtx); in dnode_new_blkid()
1500 list = &dn->dn_dirty_records[txgoff]; in dnode_new_blkid()
1502 dr_next = list_next(&dn->dn_dirty_records[txgoff], dr); in dnode_new_blkid()
1507 list_remove(&dn->dn_dirty_records[txgoff], dr); in dnode_new_blkid()
1513 mutex_exit(&dn->dn_mtx); in dnode_new_blkid()
1518 rw_downgrade(&dn->dn_struct_rwlock); in dnode_new_blkid()
1522 dnode_dirty_l1(dnode_t *dn, uint64_t l1blkid, dmu_tx_t *tx) in dnode_dirty_l1() argument
1524 dmu_buf_impl_t *db = dbuf_hold_level(dn, 1, l1blkid, FTAG); in dnode_dirty_l1()
1532 dnode_free_range(dnode_t *dn, uint64_t off, uint64_t len, dmu_tx_t *tx) in dnode_free_range() argument
1540 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_free_range()
1541 blksz = dn->dn_datablksz; in dnode_free_range()
1542 blkshift = dn->dn_datablkshift; in dnode_free_range()
1543 epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT; in dnode_free_range()
1556 if ((off >> blkshift) > dn->dn_maxblkid) in dnode_free_range()
1559 ASSERT(dn->dn_maxblkid == 0); in dnode_free_range()
1586 if (dbuf_hold_impl(dn, 0, dbuf_whichblock(dn, 0, off), in dnode_free_range()
1593 rw_exit(&dn->dn_struct_rwlock); in dnode_free_range()
1595 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_free_range()
1610 if ((off >> blkshift) > dn->dn_maxblkid) in dnode_free_range()
1624 if (dbuf_hold_impl(dn, 0, dbuf_whichblock(dn, 0, off+len), in dnode_free_range()
1629 rw_exit(&dn->dn_struct_rwlock); in dnode_free_range()
1631 rw_enter(&dn->dn_struct_rwlock, RW_WRITER); in dnode_free_range()
1670 if (dn->dn_nlevels > 1) { in dnode_free_range()
1674 dnode_dirty_l1(dn, first, tx); in dnode_free_range()
1676 last = dn->dn_maxblkid >> epbs; in dnode_free_range()
1680 dnode_dirty_l1(dn, last, tx); in dnode_free_range()
1682 int shift = dn->dn_datablkshift + dn->dn_indblkshift - in dnode_free_range()
1692 int err = dnode_next_offset(dn, DNODE_FIND_HAVELOCK, in dnode_free_range()
1711 dnode_dirty_l1(dn, i, tx); in dnode_free_range()
1720 mutex_enter(&dn->dn_mtx); in dnode_free_range()
1722 if (dn->dn_free_ranges[txgoff] == NULL) { in dnode_free_range()
1723 dn->dn_free_ranges[txgoff] = in dnode_free_range()
1724 range_tree_create(NULL, NULL, &dn->dn_mtx); in dnode_free_range()
1726 range_tree_clear(dn->dn_free_ranges[txgoff], blkid, nblks); in dnode_free_range()
1727 range_tree_add(dn->dn_free_ranges[txgoff], blkid, nblks); in dnode_free_range()
1728 dprintf_dnode(dn, "blkid=%llu nblks=%llu txg=%llu\n", in dnode_free_range()
1730 mutex_exit(&dn->dn_mtx); in dnode_free_range()
1732 dbuf_free_range(dn, blkid, blkid + nblks - 1, tx); in dnode_free_range()
1733 dnode_setdirty(dn, tx); in dnode_free_range()
1736 rw_exit(&dn->dn_struct_rwlock); in dnode_free_range()
1740 dnode_spill_freed(dnode_t *dn) in dnode_spill_freed() argument
1744 mutex_enter(&dn->dn_mtx); in dnode_spill_freed()
1746 if (dn->dn_rm_spillblk[i] == DN_KILL_SPILLBLK) in dnode_spill_freed()
1749 mutex_exit(&dn->dn_mtx); in dnode_spill_freed()
1755 dnode_block_freed(dnode_t *dn, uint64_t blkid) in dnode_block_freed() argument
1757 void *dp = spa_get_dsl(dn->dn_objset->os_spa); in dnode_block_freed()
1770 if (dn->dn_free_txg) in dnode_block_freed()
1774 return (dnode_spill_freed(dn)); in dnode_block_freed()
1776 mutex_enter(&dn->dn_mtx); in dnode_block_freed()
1778 if (dn->dn_free_ranges[i] != NULL && in dnode_block_freed()
1779 range_tree_contains(dn->dn_free_ranges[i], blkid, 1)) in dnode_block_freed()
1782 mutex_exit(&dn->dn_mtx); in dnode_block_freed()
1788 dnode_diduse_space(dnode_t *dn, int64_t delta) in dnode_diduse_space() argument
1791 dprintf_dnode(dn, "dn=%p dnp=%p used=%llu delta=%lld\n", in dnode_diduse_space()
1792 dn, dn->dn_phys, in dnode_diduse_space()
1793 (u_longlong_t)dn->dn_phys->dn_used, in dnode_diduse_space()
1796 mutex_enter(&dn->dn_mtx); in dnode_diduse_space()
1797 space = DN_USED_BYTES(dn->dn_phys); in dnode_diduse_space()
1804 if (spa_version(dn->dn_objset->os_spa) < SPA_VERSION_DNODE_BYTES) { in dnode_diduse_space()
1805 ASSERT((dn->dn_phys->dn_flags & DNODE_FLAG_USED_BYTES) == 0); in dnode_diduse_space()
1807 dn->dn_phys->dn_used = space >> DEV_BSHIFT; in dnode_diduse_space()
1809 dn->dn_phys->dn_used = space; in dnode_diduse_space()
1810 dn->dn_phys->dn_flags |= DNODE_FLAG_USED_BYTES; in dnode_diduse_space()
1812 mutex_exit(&dn->dn_mtx); in dnode_diduse_space()
1820 dnode_willuse_space(dnode_t *dn, int64_t space, dmu_tx_t *tx) in dnode_willuse_space() argument
1822 objset_t *os = dn->dn_objset; in dnode_willuse_space()
1853 dnode_next_offset_level(dnode_t *dn, int flags, uint64_t *offset, in dnode_next_offset_level() argument
1858 uint64_t epbs = dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT; in dnode_next_offset_level()
1865 dn->dn_object, *offset, lvl, dn->dn_phys->dn_nlevels); in dnode_next_offset_level()
1871 if (lvl == dn->dn_phys->dn_nlevels) { in dnode_next_offset_level()
1873 epb = dn->dn_phys->dn_nblkptr; in dnode_next_offset_level()
1874 data = dn->dn_phys->dn_blkptr; in dnode_next_offset_level()
1876 uint64_t blkid = dbuf_whichblock(dn, lvl, *offset); in dnode_next_offset_level()
1877 error = dbuf_hold_impl(dn, lvl, blkid, TRUE, FALSE, FTAG, &db); in dnode_next_offset_level()
1912 ASSERT(dn->dn_type == DMU_OT_DNODE); in dnode_next_offset_level()
1925 span = (lvl - 1) * epbs + dn->dn_datablkshift; in dnode_next_offset_level()
1986 dnode_next_offset(dnode_t *dn, int flags, uint64_t *offset, in dnode_next_offset() argument
1994 rw_enter(&dn->dn_struct_rwlock, RW_READER); in dnode_next_offset()
1996 if (dn->dn_phys->dn_nlevels == 0) { in dnode_next_offset()
2001 if (dn->dn_datablkshift == 0) { in dnode_next_offset()
2002 if (*offset < dn->dn_datablksz) { in dnode_next_offset()
2004 *offset = dn->dn_datablksz; in dnode_next_offset()
2011 maxlvl = dn->dn_phys->dn_nlevels; in dnode_next_offset()
2014 error = dnode_next_offset_level(dn, in dnode_next_offset()
2021 error = dnode_next_offset_level(dn, in dnode_next_offset()
2039 rw_exit(&dn->dn_struct_rwlock); in dnode_next_offset()