Lines Matching defs:dn
125 dnode_t *dn = arg;
127 rw_init(&dn->dn_struct_rwlock, NULL, RW_NOLOCKDEP, NULL);
128 mutex_init(&dn->dn_mtx, NULL, MUTEX_DEFAULT, NULL);
129 mutex_init(&dn->dn_dbufs_mtx, NULL, MUTEX_DEFAULT, NULL);
130 cv_init(&dn->dn_notxholds, NULL, CV_DEFAULT, NULL);
131 cv_init(&dn->dn_nodnholds, NULL, CV_DEFAULT, NULL);
137 zfs_refcount_create_untracked(&dn->dn_holds);
138 zfs_refcount_create(&dn->dn_tx_holds);
139 list_link_init(&dn->dn_link);
141 memset(dn->dn_next_type, 0, sizeof (dn->dn_next_type));
142 memset(dn->dn_next_nblkptr, 0, sizeof (dn->dn_next_nblkptr));
143 memset(dn->dn_next_nlevels, 0, sizeof (dn->dn_next_nlevels));
144 memset(dn->dn_next_indblkshift, 0, sizeof (dn->dn_next_indblkshift));
145 memset(dn->dn_next_bonustype, 0, sizeof (dn->dn_next_bonustype));
146 memset(dn->dn_rm_spillblk, 0, sizeof (dn->dn_rm_spillblk));
147 memset(dn->dn_next_bonuslen, 0, sizeof (dn->dn_next_bonuslen));
148 memset(dn->dn_next_blksz, 0, sizeof (dn->dn_next_blksz));
149 memset(dn->dn_next_maxblkid, 0, sizeof (dn->dn_next_maxblkid));
152 multilist_link_init(&dn->dn_dirty_link[i]);
153 dn->dn_free_ranges[i] = NULL;
154 list_create(&dn->dn_dirty_records[i],
159 dn->dn_allocated_txg = 0;
160 dn->dn_free_txg = 0;
161 dn->dn_assigned_txg = 0;
162 dn->dn_dirty_txg = 0;
163 dn->dn_dirtyctx = 0;
164 dn->dn_dirtyctx_firstset = NULL;
165 dn->dn_bonus = NULL;
166 dn->dn_have_spill = B_FALSE;
167 dn->dn_zio = NULL;
168 dn->dn_oldused = 0;
169 dn->dn_oldflags = 0;
170 dn->dn_olduid = 0;
171 dn->dn_oldgid = 0;
172 dn->dn_oldprojid = ZFS_DEFAULT_PROJID;
173 dn->dn_newuid = 0;
174 dn->dn_newgid = 0;
175 dn->dn_newprojid = ZFS_DEFAULT_PROJID;
176 dn->dn_id_flags = 0;
178 dn->dn_dbufs_count = 0;
179 avl_create(&dn->dn_dbufs, dbuf_compare, sizeof (dmu_buf_impl_t),
182 dn->dn_moved = 0;
190 dnode_t *dn = arg;
192 rw_destroy(&dn->dn_struct_rwlock);
193 mutex_destroy(&dn->dn_mtx);
194 mutex_destroy(&dn->dn_dbufs_mtx);
195 cv_destroy(&dn->dn_notxholds);
196 cv_destroy(&dn->dn_nodnholds);
197 zfs_refcount_destroy(&dn->dn_holds);
198 zfs_refcount_destroy(&dn->dn_tx_holds);
199 ASSERT(!list_link_active(&dn->dn_link));
202 ASSERT(!multilist_link_active(&dn->dn_dirty_link[i]));
203 ASSERT3P(dn->dn_free_ranges[i], ==, NULL);
204 list_destroy(&dn->dn_dirty_records[i]);
205 ASSERT0(dn->dn_next_nblkptr[i]);
206 ASSERT0(dn->dn_next_nlevels[i]);
207 ASSERT0(dn->dn_next_indblkshift[i]);
208 ASSERT0(dn->dn_next_bonustype[i]);
209 ASSERT0(dn->dn_rm_spillblk[i]);
210 ASSERT0(dn->dn_next_bonuslen[i]);
211 ASSERT0(dn->dn_next_blksz[i]);
212 ASSERT0(dn->dn_next_maxblkid[i]);
215 ASSERT0(dn->dn_allocated_txg);
216 ASSERT0(dn->dn_free_txg);
217 ASSERT0(dn->dn_assigned_txg);
218 ASSERT0(dn->dn_dirty_txg);
219 ASSERT0(dn->dn_dirtyctx);
220 ASSERT3P(dn->dn_dirtyctx_firstset, ==, NULL);
221 ASSERT3P(dn->dn_bonus, ==, NULL);
222 ASSERT(!dn->dn_have_spill);
223 ASSERT3P(dn->dn_zio, ==, NULL);
224 ASSERT0(dn->dn_oldused);
225 ASSERT0(dn->dn_oldflags);
226 ASSERT0(dn->dn_olduid);
227 ASSERT0(dn->dn_oldgid);
228 ASSERT0(dn->dn_oldprojid);
229 ASSERT0(dn->dn_newuid);
230 ASSERT0(dn->dn_newgid);
231 ASSERT0(dn->dn_newprojid);
232 ASSERT0(dn->dn_id_flags);
234 ASSERT0(dn->dn_dbufs_count);
235 avl_destroy(&dn->dn_dbufs);
395 dnode_verify(dnode_t *dn)
399 ASSERT(dn->dn_phys);
400 ASSERT(dn->dn_objset);
401 ASSERT(dn->dn_handle->dnh_dnode == dn);
403 ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type));
408 if (!RW_WRITE_HELD(&dn->dn_struct_rwlock)) {
409 rw_enter(&dn->dn_struct_rwlock, RW_READER);
412 if (dn->dn_phys->dn_type != DMU_OT_NONE || dn->dn_allocated_txg != 0) {
414 int max_bonuslen = DN_SLOTS_TO_BONUSLEN(dn->dn_num_slots);
415 ASSERT3U(dn->dn_indblkshift, <=, SPA_MAXBLOCKSHIFT);
416 if (dn->dn_datablkshift) {
417 ASSERT3U(dn->dn_datablkshift, >=, SPA_MINBLOCKSHIFT);
418 ASSERT3U(dn->dn_datablkshift, <=, SPA_MAXBLOCKSHIFT);
419 ASSERT3U(1<<dn->dn_datablkshift, ==, dn->dn_datablksz);
421 ASSERT3U(dn->dn_nlevels, <=, 30);
422 ASSERT(DMU_OT_IS_VALID(dn->dn_type));
423 ASSERT3U(dn->dn_nblkptr, >=, 1);
424 ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR);
425 ASSERT3U(dn->dn_bonuslen, <=, max_bonuslen);
426 ASSERT3U(dn->dn_datablksz, ==,
427 dn->dn_datablkszsec << SPA_MINBLOCKSHIFT);
428 ASSERT3U(ISP2(dn->dn_datablksz), ==, dn->dn_datablkshift != 0);
429 ASSERT3U((dn->dn_nblkptr - 1) * sizeof (blkptr_t) +
430 dn->dn_bonuslen, <=, max_bonuslen);
432 ASSERT3U(dn->dn_next_nlevels[i], <=, dn->dn_nlevels);
435 if (dn->dn_phys->dn_type != DMU_OT_NONE)
436 ASSERT3U(dn->dn_phys->dn_nlevels, <=, dn->dn_nlevels);
437 ASSERT(DMU_OBJECT_IS_SPECIAL(dn->dn_object) || dn->dn_dbuf != NULL);
438 if (dn->dn_dbuf != NULL) {
439 ASSERT3P(dn->dn_phys, ==,
440 (dnode_phys_t *)dn->dn_dbuf->db.db_data +
441 (dn->dn_object % (dn->dn_dbuf->db.db_size >> DNODE_SHIFT)));
444 rw_exit(&dn->dn_struct_rwlock);
511 dnode_setbonuslen(dnode_t *dn, int newsize, dmu_tx_t *tx)
513 ASSERT3U(zfs_refcount_count(&dn->dn_holds), >=, 1);
515 dnode_setdirty(dn, tx);
516 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
517 ASSERT3U(newsize, <=, DN_SLOTS_TO_BONUSLEN(dn->dn_num_slots) -
518 (dn->dn_nblkptr-1) * sizeof (blkptr_t));
520 if (newsize < dn->dn_bonuslen) {
522 size_t diff = dn->dn_bonuslen - newsize;
523 char *data_end = ((char *)dn->dn_bonus->db.db_data) + newsize;
527 dn->dn_bonuslen = newsize;
529 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = DN_ZERO_BONUSLEN;
531 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = dn->dn_bonuslen;
532 rw_exit(&dn->dn_struct_rwlock);
536 dnode_setbonus_type(dnode_t *dn, dmu_object_type_t newtype, dmu_tx_t *tx)
538 ASSERT3U(zfs_refcount_count(&dn->dn_holds), >=, 1);
539 dnode_setdirty(dn, tx);
540 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
541 dn->dn_bonustype = newtype;
542 dn->dn_next_bonustype[tx->tx_txg & TXG_MASK] = dn->dn_bonustype;
543 rw_exit(&dn->dn_struct_rwlock);
547 dnode_set_storage_type(dnode_t *dn, dmu_object_type_t newtype)
553 ASSERT3U(zfs_refcount_count(&dn->dn_holds), >=, 1);
554 dn->dn_storage_type = newtype;
558 dnode_rm_spill(dnode_t *dn, dmu_tx_t *tx)
560 ASSERT3U(zfs_refcount_count(&dn->dn_holds), >=, 1);
561 ASSERT(RW_WRITE_HELD(&dn->dn_struct_rwlock));
562 dnode_setdirty(dn, tx);
563 dn->dn_rm_spillblk[tx->tx_txg & TXG_MASK] = DN_KILL_SPILLBLK;
564 dn->dn_have_spill = B_FALSE;
568 dnode_setdblksz(dnode_t *dn, int size)
574 1<<(sizeof (dn->dn_phys->dn_datablkszsec) * 8));
575 dn->dn_datablksz = size;
576 dn->dn_datablkszsec = size >> SPA_MINBLOCKSHIFT;
577 dn->dn_datablkshift = ISP2(size) ? highbit64(size - 1) : 0;
584 dnode_t *dn;
586 dn = kmem_cache_alloc(dnode_cache, KM_SLEEP);
587 dn->dn_moved = 0;
593 dn->dn_object = object;
594 dn->dn_dbuf = db;
595 dn->dn_handle = dnh;
596 dn->dn_phys = dnp;
599 dnode_setdblksz(dn, dnp->dn_datablkszsec << SPA_MINBLOCKSHIFT);
601 dn->dn_datablksz = 0;
602 dn->dn_datablkszsec = 0;
603 dn->dn_datablkshift = 0;
605 dn->dn_indblkshift = dnp->dn_indblkshift;
606 dn->dn_nlevels = dnp->dn_nlevels;
607 dn->dn_type = dnp->dn_type;
608 dn->dn_nblkptr = dnp->dn_nblkptr;
609 dn->dn_checksum = dnp->dn_checksum;
610 dn->dn_compress = dnp->dn_compress;
611 dn->dn_bonustype = dnp->dn_bonustype;
612 dn->dn_bonuslen = dnp->dn_bonuslen;
613 dn->dn_num_slots = dnp->dn_extra_slots + 1;
614 dn->dn_maxblkid = dnp->dn_maxblkid;
615 dn->dn_have_spill = ((dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) != 0);
616 dn->dn_id_flags = 0;
618 dn->dn_storage_type = DMU_OT_NONE;
620 dmu_zfetch_init(&dn->dn_zfetch, dn);
622 ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type));
636 list_insert_head(&os->os_dnodes, dn);
643 dn->dn_objset = os;
645 dnh->dnh_dnode = dn;
650 return (dn);
657 dnode_destroy(dnode_t *dn)
659 objset_t *os = dn->dn_objset;
662 ASSERT((dn->dn_id_flags & DN_ID_NEW_EXIST) == 0);
665 POINTER_INVALIDATE(&dn->dn_objset);
666 if (!DMU_OBJECT_IS_SPECIAL(dn->dn_object)) {
667 list_remove(&os->os_dnodes, dn);
675 if (!zrl_is_locked(&dn->dn_handle->dnh_zrlock))
676 zrl_remove(&dn->dn_handle->dnh_zrlock);
678 dn->dn_allocated_txg = 0;
679 dn->dn_free_txg = 0;
680 dn->dn_assigned_txg = 0;
681 dn->dn_dirty_txg = 0;
683 dn->dn_dirtyctx = 0;
684 dn->dn_dirtyctx_firstset = NULL;
685 if (dn->dn_bonus != NULL) {
686 mutex_enter(&dn->dn_bonus->db_mtx);
687 dbuf_destroy(dn->dn_bonus);
688 dn->dn_bonus = NULL;
690 dn->dn_zio = NULL;
692 dn->dn_have_spill = B_FALSE;
693 dn->dn_oldused = 0;
694 dn->dn_oldflags = 0;
695 dn->dn_olduid = 0;
696 dn->dn_oldgid = 0;
697 dn->dn_oldprojid = ZFS_DEFAULT_PROJID;
698 dn->dn_newuid = 0;
699 dn->dn_newgid = 0;
700 dn->dn_newprojid = ZFS_DEFAULT_PROJID;
701 dn->dn_id_flags = 0;
703 dn->dn_storage_type = DMU_OT_NONE;
705 dmu_zfetch_fini(&dn->dn_zfetch);
706 kmem_cache_free(dnode_cache, dn);
714 dnode_allocate(dnode_t *dn, dmu_object_type_t ot, int blocksize, int ibs,
721 spa_maxdnodesize(dmu_objset_spa(dn->dn_objset)));
723 spa_maxblocksize(dmu_objset_spa(dn->dn_objset)));
735 dn->dn_objset, (u_longlong_t)dn->dn_object,
739 ASSERT(dn->dn_type == DMU_OT_NONE);
740 ASSERT0(memcmp(dn->dn_phys, &dnode_phys_zero, sizeof (dnode_phys_t)));
741 ASSERT(dn->dn_phys->dn_type == DMU_OT_NONE);
750 ASSERT(dn->dn_type == DMU_OT_NONE);
751 ASSERT0(dn->dn_maxblkid);
752 ASSERT0(dn->dn_allocated_txg);
753 ASSERT0(dn->dn_assigned_txg);
754 ASSERT(zfs_refcount_is_zero(&dn->dn_tx_holds));
755 ASSERT3U(zfs_refcount_count(&dn->dn_holds), <=, 1);
756 ASSERT(avl_is_empty(&dn->dn_dbufs));
759 ASSERT0(dn->dn_next_nblkptr[i]);
760 ASSERT0(dn->dn_next_nlevels[i]);
761 ASSERT0(dn->dn_next_indblkshift[i]);
762 ASSERT0(dn->dn_next_bonuslen[i]);
763 ASSERT0(dn->dn_next_bonustype[i]);
764 ASSERT0(dn->dn_rm_spillblk[i]);
765 ASSERT0(dn->dn_next_blksz[i]);
766 ASSERT0(dn->dn_next_maxblkid[i]);
767 ASSERT(!multilist_link_active(&dn->dn_dirty_link[i]));
768 ASSERT3P(list_head(&dn->dn_dirty_records[i]), ==, NULL);
769 ASSERT3P(dn->dn_free_ranges[i], ==, NULL);
772 dn->dn_type = ot;
773 dnode_setdblksz(dn, blocksize);
774 dn->dn_indblkshift = ibs;
775 dn->dn_nlevels = 1;
776 dn->dn_num_slots = dn_slots;
778 dn->dn_nblkptr = 1;
780 dn->dn_nblkptr = MIN(DN_MAX_NBLKPTR,
785 dn->dn_bonustype = bonustype;
786 dn->dn_bonuslen = bonuslen;
787 dn->dn_checksum = ZIO_CHECKSUM_INHERIT;
788 dn->dn_compress = ZIO_COMPRESS_INHERIT;
789 dn->dn_dirtyctx = 0;
791 dn->dn_free_txg = 0;
792 dn->dn_dirtyctx_firstset = NULL;
793 dn->dn_dirty_txg = 0;
795 dn->dn_allocated_txg = tx->tx_txg;
796 dn->dn_id_flags = 0;
798 dnode_setdirty(dn, tx);
799 dn->dn_next_indblkshift[tx->tx_txg & TXG_MASK] = ibs;
800 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = dn->dn_bonuslen;
801 dn->dn_next_bonustype[tx->tx_txg & TXG_MASK] = dn->dn_bonustype;
802 dn->dn_next_blksz[tx->tx_txg & TXG_MASK] = dn->dn_datablksz;
806 dnode_reallocate(dnode_t *dn, dmu_object_type_t ot, int blocksize,
814 spa_maxblocksize(dmu_objset_spa(dn->dn_objset)));
816 ASSERT(dn->dn_object != DMU_META_DNODE_OBJECT || dmu_tx_private_ok(tx));
823 DN_BONUS_SIZE(spa_maxdnodesize(dmu_objset_spa(dn->dn_objset))));
826 dnode_free_interior_slots(dn);
830 dnode_evict_dbufs(dn);
832 dn->dn_id_flags = 0;
834 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
835 dnode_setdirty(dn, tx);
836 if (dn->dn_datablksz != blocksize) {
838 ASSERT0(dn->dn_maxblkid);
839 ASSERT(BP_IS_HOLE(&dn->dn_phys->dn_blkptr[0]) ||
840 dnode_block_freed(dn, 0));
842 dnode_setdblksz(dn, blocksize);
843 dn->dn_next_blksz[tx->tx_txg & TXG_MASK] = blocksize;
845 if (dn->dn_bonuslen != bonuslen)
846 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = bonuslen;
854 if (dn->dn_bonustype != bonustype)
855 dn->dn_next_bonustype[tx->tx_txg & TXG_MASK] = bonustype;
856 if (dn->dn_nblkptr != nblkptr)
857 dn->dn_next_nblkptr[tx->tx_txg & TXG_MASK] = nblkptr;
858 if (dn->dn_phys->dn_flags & DNODE_FLAG_SPILL_BLKPTR && !keep_spill) {
859 dbuf_rm_spill(dn, tx);
860 dnode_rm_spill(dn, tx);
863 rw_exit(&dn->dn_struct_rwlock);
866 dn->dn_type = ot;
869 mutex_enter(&dn->dn_mtx);
870 dn->dn_bonustype = bonustype;
871 dn->dn_bonuslen = bonuslen;
872 dn->dn_num_slots = dn_slots;
873 dn->dn_nblkptr = nblkptr;
874 dn->dn_checksum = ZIO_CHECKSUM_INHERIT;
875 dn->dn_compress = ZIO_COMPRESS_INHERIT;
876 ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR);
879 if (dn->dn_bonus) {
880 dn->dn_bonus->db.db_size =
881 DN_SLOTS_TO_BONUSLEN(dn->dn_num_slots) -
882 (dn->dn_nblkptr-1) * sizeof (blkptr_t);
883 ASSERT(dn->dn_bonuslen <= dn->dn_bonus->db.db_size);
886 dn->dn_allocated_txg = tx->tx_txg;
887 mutex_exit(&dn->dn_mtx);
1255 dnode_t *dn = dnh->dnh_dnode;
1257 if (dn == DN_SLOT_FREE) {
1259 } else if (DN_SLOT_IS_PTR(dn)) {
1260 mutex_enter(&dn->dn_mtx);
1261 boolean_t can_free = (dn->dn_type == DMU_OT_NONE &&
1262 zfs_refcount_is_zero(&dn->dn_holds) &&
1263 !DNODE_IS_DIRTY(dn));
1264 mutex_exit(&dn->dn_mtx);
1302 dnode_free_interior_slots(dnode_t *dn)
1304 dnode_children_t *children = dmu_buf_get_user(&dn->dn_dbuf->db);
1305 int epb = dn->dn_dbuf->db.db_size >> DNODE_SHIFT;
1306 int idx = (dn->dn_object & (epb - 1)) + 1;
1307 int slots = dn->dn_num_slots - 1;
1326 dnode_t *dn = dnh->dnh_dnode;
1332 mutex_enter(&dn->dn_mtx);
1333 if (zfs_refcount_count(&dn->dn_holds) > 0)
1334 cv_wait(&dn->dn_nodnholds, &dn->dn_mtx);
1335 mutex_exit(&dn->dn_mtx);
1336 ASSERT3U(zfs_refcount_count(&dn->dn_holds), ==, 0);
1338 ASSERT(dn->dn_dbuf == NULL ||
1339 dmu_buf_get_user(&dn->dn_dbuf->db) == NULL);
1341 dnode_destroy(dn); /* implicit zrl_remove() */
1350 dnode_t *dn;
1355 dn = dnode_create(os, dnp, NULL, object, dnh);
1356 DNODE_VERIFY(dn);
1370 dnode_t *dn;
1384 dn = dnh->dnh_dnode;
1391 ASSERT(zfs_refcount_is_zero(&dn->dn_holds));
1392 ASSERT(zfs_refcount_is_zero(&dn->dn_tx_holds));
1394 dnode_destroy(dn); /* implicit zrl_remove() for first slot */
1439 dnode_t *mdn, *dn;
1464 dn = DMU_USERUSED_DNODE(os);
1466 dn = DMU_GROUPUSED_DNODE(os);
1468 dn = DMU_PROJECTUSED_DNODE(os);
1469 if (dn == NULL)
1471 type = dn->dn_type;
1476 DNODE_VERIFY(dn);
1479 (void) zfs_refcount_add(&dn->dn_holds, tag);
1480 *dnp = dn;
1582 dn = dnh->dnh_dnode;
1607 dn = dnh->dnh_dnode;
1609 dn = dnode_create(os, dn_block + idx, db,
1616 mutex_enter(&dn->dn_mtx);
1617 if (dn->dn_type == DMU_OT_NONE || dn->dn_free_txg != 0) {
1619 mutex_exit(&dn->dn_mtx);
1627 mutex_exit(&dn->dn_mtx);
1680 dn = dnh->dnh_dnode;
1682 dn = dnode_create(os, dn_block + idx, db,
1687 mutex_enter(&dn->dn_mtx);
1688 if (!zfs_refcount_is_zero(&dn->dn_holds) || dn->dn_free_txg) {
1690 mutex_exit(&dn->dn_mtx);
1698 mutex_exit(&dn->dn_mtx);
1711 ASSERT0(dn->dn_free_txg);
1713 if (zfs_refcount_add(&dn->dn_holds, tag) == 1)
1716 mutex_exit(&dn->dn_mtx);
1721 DNODE_VERIFY(dn);
1723 ASSERT3P(dn->dn_dbuf, ==, db);
1724 ASSERT3U(dn->dn_object, ==, object);
1727 *dnp = dn;
1747 dnode_add_ref(dnode_t *dn, const void *tag)
1749 mutex_enter(&dn->dn_mtx);
1750 if (zfs_refcount_is_zero(&dn->dn_holds)) {
1751 mutex_exit(&dn->dn_mtx);
1754 VERIFY(1 < zfs_refcount_add(&dn->dn_holds, tag));
1755 mutex_exit(&dn->dn_mtx);
1760 dnode_rele(dnode_t *dn, const void *tag)
1762 mutex_enter(&dn->dn_mtx);
1763 dnode_rele_and_unlock(dn, tag, B_FALSE);
1767 dnode_rele_and_unlock(dnode_t *dn, const void *tag, boolean_t evicting)
1771 dmu_buf_impl_t *db = dn->dn_dbuf;
1772 dnode_handle_t *dnh = dn->dn_handle;
1774 refs = zfs_refcount_remove(&dn->dn_holds, tag);
1776 cv_broadcast(&dn->dn_nodnholds);
1777 mutex_exit(&dn->dn_mtx);
1829 dnode_is_dirty(dnode_t *dn)
1831 mutex_enter(&dn->dn_mtx);
1834 if (multilist_link_active(&dn->dn_dirty_link[i]) ||
1835 !list_is_empty(&dn->dn_dirty_records[i])) {
1836 mutex_exit(&dn->dn_mtx);
1841 mutex_exit(&dn->dn_mtx);
1847 dnode_setdirty(dnode_t *dn, dmu_tx_t *tx)
1849 objset_t *os = dn->dn_objset;
1852 if (DMU_OBJECT_IS_SPECIAL(dn->dn_object)) {
1857 DNODE_VERIFY(dn);
1860 mutex_enter(&dn->dn_mtx);
1861 ASSERT(dn->dn_phys->dn_type || dn->dn_allocated_txg);
1862 ASSERT(dn->dn_free_txg == 0 || dn->dn_free_txg >= txg);
1863 mutex_exit(&dn->dn_mtx);
1869 dmu_objset_userquota_get_ids(dn, B_TRUE, tx);
1872 multilist_sublist_t *mls = multilist_sublist_lock_obj(dirtylist, dn);
1877 if (multilist_link_active(&dn->dn_dirty_link[txg & TXG_MASK])) {
1882 ASSERT(!zfs_refcount_is_zero(&dn->dn_holds) ||
1883 !avl_is_empty(&dn->dn_dbufs));
1884 ASSERT(dn->dn_datablksz != 0);
1885 ASSERT0(dn->dn_next_bonuslen[txg & TXG_MASK]);
1886 ASSERT0(dn->dn_next_blksz[txg & TXG_MASK]);
1887 ASSERT0(dn->dn_next_bonustype[txg & TXG_MASK]);
1890 (u_longlong_t)dn->dn_object, (u_longlong_t)txg);
1892 multilist_sublist_insert_head(mls, dn);
1905 VERIFY(dnode_add_ref(dn, (void *)(uintptr_t)tx->tx_txg));
1907 (void) dbuf_dirty(dn->dn_dbuf, tx);
1913 dnode_free(dnode_t *dn, dmu_tx_t *tx)
1915 mutex_enter(&dn->dn_mtx);
1916 if (dn->dn_type == DMU_OT_NONE || dn->dn_free_txg) {
1917 mutex_exit(&dn->dn_mtx);
1920 dn->dn_free_txg = tx->tx_txg;
1921 mutex_exit(&dn->dn_mtx);
1923 dnode_setdirty(dn, tx);
1931 dnode_set_blksz(dnode_t *dn, uint64_t size, int ibs, dmu_tx_t *tx)
1936 ASSERT3U(size, <=, spa_maxblocksize(dmu_objset_spa(dn->dn_objset)));
1942 if (ibs == dn->dn_indblkshift)
1945 if (size == dn->dn_datablksz && ibs == 0)
1948 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
1951 if (dn->dn_maxblkid != 0)
1954 mutex_enter(&dn->dn_dbufs_mtx);
1955 for (db = avl_first(&dn->dn_dbufs); db != NULL;
1956 db = AVL_NEXT(&dn->dn_dbufs, db)) {
1959 mutex_exit(&dn->dn_dbufs_mtx);
1963 mutex_exit(&dn->dn_dbufs_mtx);
1965 if (ibs && dn->dn_nlevels != 1)
1968 dnode_setdirty(dn, tx);
1969 if (size != dn->dn_datablksz) {
1971 err = dbuf_hold_impl(dn, 0, 0, TRUE, FALSE, FTAG, &db);
1978 dnode_setdblksz(dn, size);
1979 dn->dn_next_blksz[tx->tx_txg & TXG_MASK] = size;
1984 dn->dn_indblkshift = ibs;
1985 dn->dn_next_indblkshift[tx->tx_txg & TXG_MASK] = ibs;
1988 rw_exit(&dn->dn_struct_rwlock);
1992 rw_exit(&dn->dn_struct_rwlock);
1997 dnode_set_nlevels_impl(dnode_t *dn, int new_nlevels, dmu_tx_t *tx)
2000 int old_nlevels = dn->dn_nlevels;
2005 ASSERT(RW_WRITE_HELD(&dn->dn_struct_rwlock));
2007 ASSERT3U(new_nlevels, >, dn->dn_nlevels);
2008 dn->dn_nlevels = new_nlevels;
2010 ASSERT3U(new_nlevels, >, dn->dn_next_nlevels[txgoff]);
2011 dn->dn_next_nlevels[txgoff] = new_nlevels;
2014 db = dbuf_hold_level(dn, old_nlevels, 0, FTAG);
2020 mutex_enter(&dn->dn_mtx);
2022 list = &dn->dn_dirty_records[txgoff];
2024 dr_next = list_next(&dn->dn_dirty_records[txgoff], dr);
2031 list_remove(&dn->dn_dirty_records[txgoff], dr);
2037 mutex_exit(&dn->dn_mtx);
2041 dnode_set_nlevels(dnode_t *dn, int nlevels, dmu_tx_t *tx)
2045 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
2047 if (dn->dn_nlevels == nlevels) {
2050 } else if (nlevels < dn->dn_nlevels) {
2055 dnode_set_nlevels_impl(dn, nlevels, tx);
2058 rw_exit(&dn->dn_struct_rwlock);
2064 dnode_new_blkid(dnode_t *dn, uint64_t blkid, dmu_tx_t *tx, boolean_t have_read,
2073 RW_READ_HELD(&dn->dn_struct_rwlock) :
2074 RW_WRITE_HELD(&dn->dn_struct_rwlock));
2081 if (blkid <= dn->dn_maxblkid)
2084 if (!rw_tryupgrade(&dn->dn_struct_rwlock)) {
2085 rw_exit(&dn->dn_struct_rwlock);
2086 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
2094 if (!force && blkid <= dn->dn_maxblkid)
2102 dn->dn_maxblkid = blkid;
2103 dn->dn_next_maxblkid[tx->tx_txg & TXG_MASK] =
2111 epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT;
2112 for (sz = dn->dn_nblkptr;
2113 sz <= blkid && sz >= dn->dn_nblkptr; sz <<= epbs)
2119 if (new_nlevels > dn->dn_nlevels)
2120 dnode_set_nlevels_impl(dn, new_nlevels, tx);
2122 ASSERT3U(dn->dn_nlevels, >=, new_nlevels);
2127 rw_downgrade(&dn->dn_struct_rwlock);
2131 dnode_dirty_l1(dnode_t *dn, uint64_t l1blkid, dmu_tx_t *tx)
2133 dmu_buf_impl_t *db = dbuf_hold_level(dn, 1, l1blkid, FTAG);
2145 dnode_dirty_l1range(dnode_t *dn, uint64_t start_blkid, uint64_t end_blkid,
2154 mutex_enter(&dn->dn_dbufs_mtx);
2161 db = avl_find(&dn->dn_dbufs, db_search, &where);
2163 db = avl_nearest(&dn->dn_dbufs, where, AVL_AFTER);
2184 mutex_exit(&dn->dn_dbufs_mtx);
2185 dnode_dirty_l1(dn, db->db_blkid, tx);
2186 mutex_enter(&dn->dn_dbufs_mtx);
2196 db = avl_find(&dn->dn_dbufs, db_search, &where);
2198 db = avl_nearest(&dn->dn_dbufs, where, AVL_AFTER);
2199 for (; db != NULL; db = AVL_NEXT(&dn->dn_dbufs, db)) {
2207 mutex_exit(&dn->dn_dbufs_mtx);
2211 dnode_set_dirtyctx(dnode_t *dn, dmu_tx_t *tx, const void *tag)
2217 if (dn->dn_dirtyctx == DN_UNDIRTIED) {
2218 dsl_dataset_t *ds = dn->dn_objset->os_dsl_dataset;
2223 if (!BP_IS_HOLE(dn->dn_objset->os_rootbp)) {
2225 dn->dn_dirtyctx = DN_DIRTY_SYNC;
2227 dn->dn_dirtyctx = DN_DIRTY_OPEN;
2228 dn->dn_dirtyctx_firstset = tag;
2237 dnode_partial_zero(dnode_t *dn, uint64_t off, uint64_t blkoff, uint64_t len,
2243 rw_enter(&dn->dn_struct_rwlock, RW_READER);
2244 res = dbuf_hold_impl(dn, 0, dbuf_whichblock(dn, 0, off), TRUE, FALSE,
2246 rw_exit(&dn->dn_struct_rwlock);
2268 dnode_free_range(dnode_t *dn, uint64_t off, uint64_t len, dmu_tx_t *tx)
2275 blksz = dn->dn_datablksz;
2276 blkshift = dn->dn_datablkshift;
2277 epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT;
2290 if ((off >> blkshift) > dn->dn_maxblkid)
2293 ASSERT(dn->dn_maxblkid == 0);
2300 if (dn->dn_nlevels > 1) {
2301 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
2302 dnode_dirty_l1(dn, 0, tx);
2303 rw_exit(&dn->dn_struct_rwlock);
2321 dnode_partial_zero(dn, off, blkoff, head, tx);
2331 if ((off >> blkshift) > dn->dn_maxblkid)
2345 dnode_partial_zero(dn, off + len, 0, tail, tx);
2380 if (dn->dn_nlevels > 1) {
2381 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
2385 dnode_dirty_l1(dn, first, tx);
2387 last = dn->dn_maxblkid >> epbs;
2391 dnode_dirty_l1(dn, last, tx);
2393 dnode_dirty_l1range(dn, first, last, tx);
2395 int shift = dn->dn_datablkshift + dn->dn_indblkshift -
2405 int err = dnode_next_offset(dn, DNODE_FIND_HAVELOCK,
2424 dnode_dirty_l1(dn, i, tx);
2426 rw_exit(&dn->dn_struct_rwlock);
2434 mutex_enter(&dn->dn_mtx);
2437 if (dn->dn_free_ranges[txgoff] == NULL) {
2438 dn->dn_free_ranges[txgoff] = range_tree_create(NULL,
2441 range_tree_clear(dn->dn_free_ranges[txgoff], blkid, nblks);
2442 range_tree_add(dn->dn_free_ranges[txgoff], blkid, nblks);
2444 dprintf_dnode(dn, "blkid=%llu nblks=%llu txg=%llu\n",
2447 mutex_exit(&dn->dn_mtx);
2449 dbuf_free_range(dn, blkid, blkid + nblks - 1, tx);
2450 dnode_setdirty(dn, tx);
2454 dnode_spill_freed(dnode_t *dn)
2458 mutex_enter(&dn->dn_mtx);
2460 if (dn->dn_rm_spillblk[i] == DN_KILL_SPILLBLK)
2463 mutex_exit(&dn->dn_mtx);
2469 dnode_block_freed(dnode_t *dn, uint64_t blkid)
2476 if (dn->dn_free_txg)
2480 return (dnode_spill_freed(dn));
2482 mutex_enter(&dn->dn_mtx);
2484 if (dn->dn_free_ranges[i] != NULL &&
2485 range_tree_contains(dn->dn_free_ranges[i], blkid, 1))
2488 mutex_exit(&dn->dn_mtx);
2494 dnode_diduse_space(dnode_t *dn, int64_t delta)
2497 dprintf_dnode(dn, "dn=%p dnp=%p used=%llu delta=%lld\n",
2498 dn, dn->dn_phys,
2499 (u_longlong_t)dn->dn_phys->dn_used,
2502 mutex_enter(&dn->dn_mtx);
2503 space = DN_USED_BYTES(dn->dn_phys);
2510 if (spa_version(dn->dn_objset->os_spa) < SPA_VERSION_DNODE_BYTES) {
2511 ASSERT((dn->dn_phys->dn_flags & DNODE_FLAG_USED_BYTES) == 0);
2513 dn->dn_phys->dn_used = space >> DEV_BSHIFT;
2515 dn->dn_phys->dn_used = space;
2516 dn->dn_phys->dn_flags |= DNODE_FLAG_USED_BYTES;
2518 mutex_exit(&dn->dn_mtx);
2540 dnode_next_offset_level(dnode_t *dn, int flags, uint64_t *offset,
2545 uint64_t epbs = dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT;
2551 ASSERT(RW_LOCK_HELD(&dn->dn_struct_rwlock));
2557 if (lvl == dn->dn_phys->dn_nlevels) {
2559 epb = dn->dn_phys->dn_nblkptr;
2560 data = dn->dn_phys->dn_blkptr;
2562 uint64_t blkid = dbuf_whichblock(dn, lvl, *offset);
2563 error = dbuf_hold_impl(dn, lvl, blkid, TRUE, FALSE, FTAG, &db);
2600 ASSERT(dn->dn_type == DMU_OT_DNODE);
2617 span = (lvl - 1) * epbs + dn->dn_datablkshift;
2628 ASSERT3U((lvl - 1), ==, dn->dn_phys->dn_nlevels - 1);
2679 * dnode_next_offset(dn, flags, offset, 1, 1, 0);
2694 dnode_next_offset(dnode_t *dn, int flags, uint64_t *offset,
2702 rw_enter(&dn->dn_struct_rwlock, RW_READER);
2704 if (dn->dn_phys->dn_nlevels == 0) {
2709 if (dn->dn_datablkshift == 0) {
2710 if (*offset < dn->dn_datablksz) {
2712 *offset = dn->dn_datablksz;
2719 maxlvl = dn->dn_phys->dn_nlevels;
2722 error = dnode_next_offset_level(dn,
2729 error = dnode_next_offset_level(dn,
2747 rw_exit(&dn->dn_struct_rwlock);