• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-13-stable/sys/contrib/openzfs/module/zfs/

Lines Matching defs:dn

115 	dnode_t *dn = arg;
118 rw_init(&dn->dn_struct_rwlock, NULL, RW_NOLOCKDEP, NULL);
119 mutex_init(&dn->dn_mtx, NULL, MUTEX_DEFAULT, NULL);
120 mutex_init(&dn->dn_dbufs_mtx, NULL, MUTEX_DEFAULT, NULL);
121 cv_init(&dn->dn_notxholds, NULL, CV_DEFAULT, NULL);
122 cv_init(&dn->dn_nodnholds, NULL, CV_DEFAULT, NULL);
128 zfs_refcount_create_untracked(&dn->dn_holds);
129 zfs_refcount_create(&dn->dn_tx_holds);
130 list_link_init(&dn->dn_link);
132 bzero(&dn->dn_next_nblkptr[0], sizeof (dn->dn_next_nblkptr));
133 bzero(&dn->dn_next_nlevels[0], sizeof (dn->dn_next_nlevels));
134 bzero(&dn->dn_next_indblkshift[0], sizeof (dn->dn_next_indblkshift));
135 bzero(&dn->dn_next_bonustype[0], sizeof (dn->dn_next_bonustype));
136 bzero(&dn->dn_rm_spillblk[0], sizeof (dn->dn_rm_spillblk));
137 bzero(&dn->dn_next_bonuslen[0], sizeof (dn->dn_next_bonuslen));
138 bzero(&dn->dn_next_blksz[0], sizeof (dn->dn_next_blksz));
139 bzero(&dn->dn_next_maxblkid[0], sizeof (dn->dn_next_maxblkid));
142 multilist_link_init(&dn->dn_dirty_link[i]);
143 dn->dn_free_ranges[i] = NULL;
144 list_create(&dn->dn_dirty_records[i],
149 dn->dn_allocated_txg = 0;
150 dn->dn_free_txg = 0;
151 dn->dn_assigned_txg = 0;
152 dn->dn_dirty_txg = 0;
153 dn->dn_dirtyctx = 0;
154 dn->dn_dirtyctx_firstset = NULL;
155 dn->dn_bonus = NULL;
156 dn->dn_have_spill = B_FALSE;
157 dn->dn_zio = NULL;
158 dn->dn_oldused = 0;
159 dn->dn_oldflags = 0;
160 dn->dn_olduid = 0;
161 dn->dn_oldgid = 0;
162 dn->dn_oldprojid = ZFS_DEFAULT_PROJID;
163 dn->dn_newuid = 0;
164 dn->dn_newgid = 0;
165 dn->dn_newprojid = ZFS_DEFAULT_PROJID;
166 dn->dn_id_flags = 0;
168 dn->dn_dbufs_count = 0;
169 avl_create(&dn->dn_dbufs, dbuf_compare, sizeof (dmu_buf_impl_t),
172 dn->dn_moved = 0;
181 dnode_t *dn = arg;
183 rw_destroy(&dn->dn_struct_rwlock);
184 mutex_destroy(&dn->dn_mtx);
185 mutex_destroy(&dn->dn_dbufs_mtx);
186 cv_destroy(&dn->dn_notxholds);
187 cv_destroy(&dn->dn_nodnholds);
188 zfs_refcount_destroy(&dn->dn_holds);
189 zfs_refcount_destroy(&dn->dn_tx_holds);
190 ASSERT(!list_link_active(&dn->dn_link));
193 ASSERT(!multilist_link_active(&dn->dn_dirty_link[i]));
194 ASSERT3P(dn->dn_free_ranges[i], ==, NULL);
195 list_destroy(&dn->dn_dirty_records[i]);
196 ASSERT0(dn->dn_next_nblkptr[i]);
197 ASSERT0(dn->dn_next_nlevels[i]);
198 ASSERT0(dn->dn_next_indblkshift[i]);
199 ASSERT0(dn->dn_next_bonustype[i]);
200 ASSERT0(dn->dn_rm_spillblk[i]);
201 ASSERT0(dn->dn_next_bonuslen[i]);
202 ASSERT0(dn->dn_next_blksz[i]);
203 ASSERT0(dn->dn_next_maxblkid[i]);
206 ASSERT0(dn->dn_allocated_txg);
207 ASSERT0(dn->dn_free_txg);
208 ASSERT0(dn->dn_assigned_txg);
209 ASSERT0(dn->dn_dirty_txg);
210 ASSERT0(dn->dn_dirtyctx);
211 ASSERT3P(dn->dn_dirtyctx_firstset, ==, NULL);
212 ASSERT3P(dn->dn_bonus, ==, NULL);
213 ASSERT(!dn->dn_have_spill);
214 ASSERT3P(dn->dn_zio, ==, NULL);
215 ASSERT0(dn->dn_oldused);
216 ASSERT0(dn->dn_oldflags);
217 ASSERT0(dn->dn_olduid);
218 ASSERT0(dn->dn_oldgid);
219 ASSERT0(dn->dn_oldprojid);
220 ASSERT0(dn->dn_newuid);
221 ASSERT0(dn->dn_newgid);
222 ASSERT0(dn->dn_newprojid);
223 ASSERT0(dn->dn_id_flags);
225 ASSERT0(dn->dn_dbufs_count);
226 avl_destroy(&dn->dn_dbufs);
261 dnode_verify(dnode_t *dn)
265 ASSERT(dn->dn_phys);
266 ASSERT(dn->dn_objset);
267 ASSERT(dn->dn_handle->dnh_dnode == dn);
269 ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type));
274 if (!RW_WRITE_HELD(&dn->dn_struct_rwlock)) {
275 rw_enter(&dn->dn_struct_rwlock, RW_READER);
278 if (dn->dn_phys->dn_type != DMU_OT_NONE || dn->dn_allocated_txg != 0) {
280 int max_bonuslen = DN_SLOTS_TO_BONUSLEN(dn->dn_num_slots);
281 ASSERT3U(dn->dn_indblkshift, <=, SPA_MAXBLOCKSHIFT);
282 if (dn->dn_datablkshift) {
283 ASSERT3U(dn->dn_datablkshift, >=, SPA_MINBLOCKSHIFT);
284 ASSERT3U(dn->dn_datablkshift, <=, SPA_MAXBLOCKSHIFT);
285 ASSERT3U(1<<dn->dn_datablkshift, ==, dn->dn_datablksz);
287 ASSERT3U(dn->dn_nlevels, <=, 30);
288 ASSERT(DMU_OT_IS_VALID(dn->dn_type));
289 ASSERT3U(dn->dn_nblkptr, >=, 1);
290 ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR);
291 ASSERT3U(dn->dn_bonuslen, <=, max_bonuslen);
292 ASSERT3U(dn->dn_datablksz, ==,
293 dn->dn_datablkszsec << SPA_MINBLOCKSHIFT);
294 ASSERT3U(ISP2(dn->dn_datablksz), ==, dn->dn_datablkshift != 0);
295 ASSERT3U((dn->dn_nblkptr - 1) * sizeof (blkptr_t) +
296 dn->dn_bonuslen, <=, max_bonuslen);
298 ASSERT3U(dn->dn_next_nlevels[i], <=, dn->dn_nlevels);
301 if (dn->dn_phys->dn_type != DMU_OT_NONE)
302 ASSERT3U(dn->dn_phys->dn_nlevels, <=, dn->dn_nlevels);
303 ASSERT(DMU_OBJECT_IS_SPECIAL(dn->dn_object) || dn->dn_dbuf != NULL);
304 if (dn->dn_dbuf != NULL) {
305 ASSERT3P(dn->dn_phys, ==,
306 (dnode_phys_t *)dn->dn_dbuf->db.db_data +
307 (dn->dn_object % (dn->dn_dbuf->db.db_size >> DNODE_SHIFT)));
310 rw_exit(&dn->dn_struct_rwlock);
386 dnode_setbonuslen(dnode_t *dn, int newsize, dmu_tx_t *tx)
388 ASSERT3U(zfs_refcount_count(&dn->dn_holds), >=, 1);
390 dnode_setdirty(dn, tx);
391 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
392 ASSERT3U(newsize, <=, DN_SLOTS_TO_BONUSLEN(dn->dn_num_slots) -
393 (dn->dn_nblkptr-1) * sizeof (blkptr_t));
395 if (newsize < dn->dn_bonuslen) {
397 size_t diff = dn->dn_bonuslen - newsize;
398 char *data_end = ((char *)dn->dn_bonus->db.db_data) + newsize;
402 dn->dn_bonuslen = newsize;
404 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = DN_ZERO_BONUSLEN;
406 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = dn->dn_bonuslen;
407 rw_exit(&dn->dn_struct_rwlock);
411 dnode_setbonus_type(dnode_t *dn, dmu_object_type_t newtype, dmu_tx_t *tx)
413 ASSERT3U(zfs_refcount_count(&dn->dn_holds), >=, 1);
414 dnode_setdirty(dn, tx);
415 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
416 dn->dn_bonustype = newtype;
417 dn->dn_next_bonustype[tx->tx_txg & TXG_MASK] = dn->dn_bonustype;
418 rw_exit(&dn->dn_struct_rwlock);
422 dnode_rm_spill(dnode_t *dn, dmu_tx_t *tx)
424 ASSERT3U(zfs_refcount_count(&dn->dn_holds), >=, 1);
425 ASSERT(RW_WRITE_HELD(&dn->dn_struct_rwlock));
426 dnode_setdirty(dn, tx);
427 dn->dn_rm_spillblk[tx->tx_txg & TXG_MASK] = DN_KILL_SPILLBLK;
428 dn->dn_have_spill = B_FALSE;
432 dnode_setdblksz(dnode_t *dn, int size)
438 1<<(sizeof (dn->dn_phys->dn_datablkszsec) * 8));
439 dn->dn_datablksz = size;
440 dn->dn_datablkszsec = size >> SPA_MINBLOCKSHIFT;
441 dn->dn_datablkshift = ISP2(size) ? highbit64(size - 1) : 0;
448 dnode_t *dn;
450 dn = kmem_cache_alloc(dnode_cache, KM_SLEEP);
451 dn->dn_moved = 0;
457 dn->dn_object = object;
458 dn->dn_dbuf = db;
459 dn->dn_handle = dnh;
460 dn->dn_phys = dnp;
463 dnode_setdblksz(dn, dnp->dn_datablkszsec << SPA_MINBLOCKSHIFT);
465 dn->dn_datablksz = 0;
466 dn->dn_datablkszsec = 0;
467 dn->dn_datablkshift = 0;
469 dn->dn_indblkshift = dnp->dn_indblkshift;
470 dn->dn_nlevels = dnp->dn_nlevels;
471 dn->dn_type = dnp->dn_type;
472 dn->dn_nblkptr = dnp->dn_nblkptr;
473 dn->dn_checksum = dnp->dn_checksum;
474 dn->dn_compress = dnp->dn_compress;
475 dn->dn_bonustype = dnp->dn_bonustype;
476 dn->dn_bonuslen = dnp->dn_bonuslen;
477 dn->dn_num_slots = dnp->dn_extra_slots + 1;
478 dn->dn_maxblkid = dnp->dn_maxblkid;
479 dn->dn_have_spill = ((dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) != 0);
480 dn->dn_id_flags = 0;
482 dmu_zfetch_init(&dn->dn_zfetch, dn);
484 ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type));
498 list_insert_head(&os->os_dnodes, dn);
505 dn->dn_objset = os;
507 dnh->dnh_dnode = dn;
512 return (dn);
519 dnode_destroy(dnode_t *dn)
521 objset_t *os = dn->dn_objset;
524 ASSERT((dn->dn_id_flags & DN_ID_NEW_EXIST) == 0);
527 POINTER_INVALIDATE(&dn->dn_objset);
528 if (!DMU_OBJECT_IS_SPECIAL(dn->dn_object)) {
529 list_remove(&os->os_dnodes, dn);
537 if (!zrl_is_locked(&dn->dn_handle->dnh_zrlock))
538 zrl_remove(&dn->dn_handle->dnh_zrlock);
540 dn->dn_allocated_txg = 0;
541 dn->dn_free_txg = 0;
542 dn->dn_assigned_txg = 0;
543 dn->dn_dirty_txg = 0;
545 dn->dn_dirtyctx = 0;
546 dn->dn_dirtyctx_firstset = NULL;
547 if (dn->dn_bonus != NULL) {
548 mutex_enter(&dn->dn_bonus->db_mtx);
549 dbuf_destroy(dn->dn_bonus);
550 dn->dn_bonus = NULL;
552 dn->dn_zio = NULL;
554 dn->dn_have_spill = B_FALSE;
555 dn->dn_oldused = 0;
556 dn->dn_oldflags = 0;
557 dn->dn_olduid = 0;
558 dn->dn_oldgid = 0;
559 dn->dn_oldprojid = ZFS_DEFAULT_PROJID;
560 dn->dn_newuid = 0;
561 dn->dn_newgid = 0;
562 dn->dn_newprojid = ZFS_DEFAULT_PROJID;
563 dn->dn_id_flags = 0;
565 dmu_zfetch_fini(&dn->dn_zfetch);
566 kmem_cache_free(dnode_cache, dn);
574 dnode_allocate(dnode_t *dn, dmu_object_type_t ot, int blocksize, int ibs,
581 spa_maxdnodesize(dmu_objset_spa(dn->dn_objset)));
583 spa_maxblocksize(dmu_objset_spa(dn->dn_objset)));
595 dn->dn_objset, dn->dn_object, tx->tx_txg, blocksize, ibs, dn_slots);
598 ASSERT(dn->dn_type == DMU_OT_NONE);
599 ASSERT(bcmp(dn->dn_phys, &dnode_phys_zero, sizeof (dnode_phys_t)) == 0);
600 ASSERT(dn->dn_phys->dn_type == DMU_OT_NONE);
608 ASSERT(dn->dn_type == DMU_OT_NONE);
609 ASSERT0(dn->dn_maxblkid);
610 ASSERT0(dn->dn_allocated_txg);
611 ASSERT0(dn->dn_assigned_txg);
612 ASSERT(zfs_refcount_is_zero(&dn->dn_tx_holds));
613 ASSERT3U(zfs_refcount_count(&dn->dn_holds), <=, 1);
614 ASSERT(avl_is_empty(&dn->dn_dbufs));
617 ASSERT0(dn->dn_next_nblkptr[i]);
618 ASSERT0(dn->dn_next_nlevels[i]);
619 ASSERT0(dn->dn_next_indblkshift[i]);
620 ASSERT0(dn->dn_next_bonuslen[i]);
621 ASSERT0(dn->dn_next_bonustype[i]);
622 ASSERT0(dn->dn_rm_spillblk[i]);
623 ASSERT0(dn->dn_next_blksz[i]);
624 ASSERT0(dn->dn_next_maxblkid[i]);
625 ASSERT(!multilist_link_active(&dn->dn_dirty_link[i]));
626 ASSERT3P(list_head(&dn->dn_dirty_records[i]), ==, NULL);
627 ASSERT3P(dn->dn_free_ranges[i], ==, NULL);
630 dn->dn_type = ot;
631 dnode_setdblksz(dn, blocksize);
632 dn->dn_indblkshift = ibs;
633 dn->dn_nlevels = 1;
634 dn->dn_num_slots = dn_slots;
636 dn->dn_nblkptr = 1;
638 dn->dn_nblkptr = MIN(DN_MAX_NBLKPTR,
643 dn->dn_bonustype = bonustype;
644 dn->dn_bonuslen = bonuslen;
645 dn->dn_checksum = ZIO_CHECKSUM_INHERIT;
646 dn->dn_compress = ZIO_COMPRESS_INHERIT;
647 dn->dn_dirtyctx = 0;
649 dn->dn_free_txg = 0;
650 dn->dn_dirtyctx_firstset = NULL;
651 dn->dn_dirty_txg = 0;
653 dn->dn_allocated_txg = tx->tx_txg;
654 dn->dn_id_flags = 0;
656 dnode_setdirty(dn, tx);
657 dn->dn_next_indblkshift[tx->tx_txg & TXG_MASK] = ibs;
658 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = dn->dn_bonuslen;
659 dn->dn_next_bonustype[tx->tx_txg & TXG_MASK] = dn->dn_bonustype;
660 dn->dn_next_blksz[tx->tx_txg & TXG_MASK] = dn->dn_datablksz;
664 dnode_reallocate(dnode_t *dn, dmu_object_type_t ot, int blocksize,
672 spa_maxblocksize(dmu_objset_spa(dn->dn_objset)));
674 ASSERT(dn->dn_object != DMU_META_DNODE_OBJECT || dmu_tx_private_ok(tx));
681 DN_BONUS_SIZE(spa_maxdnodesize(dmu_objset_spa(dn->dn_objset))));
684 dnode_free_interior_slots(dn);
688 dnode_evict_dbufs(dn);
690 dn->dn_id_flags = 0;
692 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
693 dnode_setdirty(dn, tx);
694 if (dn->dn_datablksz != blocksize) {
696 ASSERT0(dn->dn_maxblkid);
697 ASSERT(BP_IS_HOLE(&dn->dn_phys->dn_blkptr[0]) ||
698 dnode_block_freed(dn, 0));
700 dnode_setdblksz(dn, blocksize);
701 dn->dn_next_blksz[tx->tx_txg & TXG_MASK] = blocksize;
703 if (dn->dn_bonuslen != bonuslen)
704 dn->dn_next_bonuslen[tx->tx_txg & TXG_MASK] = bonuslen;
712 if (dn->dn_bonustype != bonustype)
713 dn->dn_next_bonustype[tx->tx_txg & TXG_MASK] = bonustype;
714 if (dn->dn_nblkptr != nblkptr)
715 dn->dn_next_nblkptr[tx->tx_txg & TXG_MASK] = nblkptr;
716 if (dn->dn_phys->dn_flags & DNODE_FLAG_SPILL_BLKPTR && !keep_spill) {
717 dbuf_rm_spill(dn, tx);
718 dnode_rm_spill(dn, tx);
721 rw_exit(&dn->dn_struct_rwlock);
724 dn->dn_type = ot;
727 mutex_enter(&dn->dn_mtx);
728 dn->dn_bonustype = bonustype;
729 dn->dn_bonuslen = bonuslen;
730 dn->dn_num_slots = dn_slots;
731 dn->dn_nblkptr = nblkptr;
732 dn->dn_checksum = ZIO_CHECKSUM_INHERIT;
733 dn->dn_compress = ZIO_COMPRESS_INHERIT;
734 ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR);
737 if (dn->dn_bonus) {
738 dn->dn_bonus->db.db_size =
739 DN_SLOTS_TO_BONUSLEN(dn->dn_num_slots) -
740 (dn->dn_nblkptr-1) * sizeof (blkptr_t);
741 ASSERT(dn->dn_bonuslen <= dn->dn_bonus->db.db_size);
744 dn->dn_allocated_txg = tx->tx_txg;
745 mutex_exit(&dn->dn_mtx);
1101 dnode_t *dn = dnh->dnh_dnode;
1103 if (dn == DN_SLOT_FREE) {
1105 } else if (DN_SLOT_IS_PTR(dn)) {
1106 mutex_enter(&dn->dn_mtx);
1107 boolean_t can_free = (dn->dn_type == DMU_OT_NONE &&
1108 zfs_refcount_is_zero(&dn->dn_holds) &&
1109 !DNODE_IS_DIRTY(dn));
1110 mutex_exit(&dn->dn_mtx);
1143 dnode_free_interior_slots(dnode_t *dn)
1145 dnode_children_t *children = dmu_buf_get_user(&dn->dn_dbuf->db);
1146 int epb = dn->dn_dbuf->db.db_size >> DNODE_SHIFT;
1147 int idx = (dn->dn_object & (epb - 1)) + 1;
1148 int slots = dn->dn_num_slots - 1;
1167 dnode_t *dn = dnh->dnh_dnode;
1173 mutex_enter(&dn->dn_mtx);
1174 if (zfs_refcount_count(&dn->dn_holds) > 0)
1175 cv_wait(&dn->dn_nodnholds, &dn->dn_mtx);
1176 mutex_exit(&dn->dn_mtx);
1177 ASSERT3U(zfs_refcount_count(&dn->dn_holds), ==, 0);
1179 ASSERT(dn->dn_dbuf == NULL ||
1180 dmu_buf_get_user(&dn->dn_dbuf->db) == NULL);
1182 dnode_destroy(dn); /* implicit zrl_remove() */
1191 dnode_t *dn;
1196 dn = dnode_create(os, dnp, NULL, object, dnh);
1197 DNODE_VERIFY(dn);
1211 dnode_t *dn;
1225 dn = dnh->dnh_dnode;
1232 ASSERT(zfs_refcount_is_zero(&dn->dn_holds));
1233 ASSERT(zfs_refcount_is_zero(&dn->dn_tx_holds));
1235 dnode_destroy(dn); /* implicit zrl_remove() for first slot */
1280 dnode_t *mdn, *dn;
1305 dn = DMU_USERUSED_DNODE(os);
1307 dn = DMU_GROUPUSED_DNODE(os);
1309 dn = DMU_PROJECTUSED_DNODE(os);
1310 if (dn == NULL)
1312 type = dn->dn_type;
1317 DNODE_VERIFY(dn);
1320 (void) zfs_refcount_add(&dn->dn_holds, tag);
1321 *dnp = dn;
1423 dn = dnh->dnh_dnode;
1448 dn = dnh->dnh_dnode;
1450 dn = dnode_create(os, dn_block + idx, db,
1455 mutex_enter(&dn->dn_mtx);
1456 if (dn->dn_type == DMU_OT_NONE || dn->dn_free_txg != 0) {
1458 mutex_exit(&dn->dn_mtx);
1466 mutex_exit(&dn->dn_mtx);
1514 dn = dnh->dnh_dnode;
1516 dn = dnode_create(os, dn_block + idx, db,
1520 mutex_enter(&dn->dn_mtx);
1521 if (!zfs_refcount_is_zero(&dn->dn_holds) || dn->dn_free_txg) {
1523 mutex_exit(&dn->dn_mtx);
1531 mutex_exit(&dn->dn_mtx);
1544 ASSERT0(dn->dn_free_txg);
1546 if (zfs_refcount_add(&dn->dn_holds, tag) == 1)
1549 mutex_exit(&dn->dn_mtx);
1554 DNODE_VERIFY(dn);
1556 ASSERT3P(dn->dn_dbuf, ==, db);
1557 ASSERT3U(dn->dn_object, ==, object);
1560 *dnp = dn;
1580 dnode_add_ref(dnode_t *dn, void *tag)
1582 mutex_enter(&dn->dn_mtx);
1583 if (zfs_refcount_is_zero(&dn->dn_holds)) {
1584 mutex_exit(&dn->dn_mtx);
1587 VERIFY(1 < zfs_refcount_add(&dn->dn_holds, tag));
1588 mutex_exit(&dn->dn_mtx);
1593 dnode_rele(dnode_t *dn, void *tag)
1595 mutex_enter(&dn->dn_mtx);
1596 dnode_rele_and_unlock(dn, tag, B_FALSE);
1600 dnode_rele_and_unlock(dnode_t *dn, void *tag, boolean_t evicting)
1604 dmu_buf_impl_t *db = dn->dn_dbuf;
1605 dnode_handle_t *dnh = dn->dn_handle;
1607 refs = zfs_refcount_remove(&dn->dn_holds, tag);
1609 cv_broadcast(&dn->dn_nodnholds);
1610 mutex_exit(&dn->dn_mtx);
1650 dnode_setdirty(dnode_t *dn, dmu_tx_t *tx)
1652 objset_t *os = dn->dn_objset;
1655 if (DMU_OBJECT_IS_SPECIAL(dn->dn_object)) {
1660 DNODE_VERIFY(dn);
1663 mutex_enter(&dn->dn_mtx);
1664 ASSERT(dn->dn_phys->dn_type || dn->dn_allocated_txg);
1665 ASSERT(dn->dn_free_txg == 0 || dn->dn_free_txg >= txg);
1666 mutex_exit(&dn->dn_mtx);
1672 dmu_objset_userquota_get_ids(dn, B_TRUE, tx);
1675 multilist_sublist_t *mls = multilist_sublist_lock_obj(dirtylist, dn);
1680 if (multilist_link_active(&dn->dn_dirty_link[txg & TXG_MASK])) {
1685 ASSERT(!zfs_refcount_is_zero(&dn->dn_holds) ||
1686 !avl_is_empty(&dn->dn_dbufs));
1687 ASSERT(dn->dn_datablksz != 0);
1688 ASSERT0(dn->dn_next_bonuslen[txg & TXG_MASK]);
1689 ASSERT0(dn->dn_next_blksz[txg & TXG_MASK]);
1690 ASSERT0(dn->dn_next_bonustype[txg & TXG_MASK]);
1693 dn->dn_object, txg);
1695 multilist_sublist_insert_head(mls, dn);
1708 VERIFY(dnode_add_ref(dn, (void *)(uintptr_t)tx->tx_txg));
1710 (void) dbuf_dirty(dn->dn_dbuf, tx);
1716 dnode_free(dnode_t *dn, dmu_tx_t *tx)
1718 mutex_enter(&dn->dn_mtx);
1719 if (dn->dn_type == DMU_OT_NONE || dn->dn_free_txg) {
1720 mutex_exit(&dn->dn_mtx);
1723 dn->dn_free_txg = tx->tx_txg;
1724 mutex_exit(&dn->dn_mtx);
1726 dnode_setdirty(dn, tx);
1734 dnode_set_blksz(dnode_t *dn, uint64_t size, int ibs, dmu_tx_t *tx)
1739 ASSERT3U(size, <=, spa_maxblocksize(dmu_objset_spa(dn->dn_objset)));
1745 if (ibs == dn->dn_indblkshift)
1748 if (size >> SPA_MINBLOCKSHIFT == dn->dn_datablkszsec && ibs == 0)
1751 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
1754 if (dn->dn_maxblkid != 0)
1757 mutex_enter(&dn->dn_dbufs_mtx);
1758 for (db = avl_first(&dn->dn_dbufs); db != NULL;
1759 db = AVL_NEXT(&dn->dn_dbufs, db)) {
1762 mutex_exit(&dn->dn_dbufs_mtx);
1766 mutex_exit(&dn->dn_dbufs_mtx);
1768 if (ibs && dn->dn_nlevels != 1)
1772 err = dbuf_hold_impl(dn, 0, 0, TRUE, FALSE, FTAG, &db);
1779 dnode_setdblksz(dn, size);
1780 dnode_setdirty(dn, tx);
1781 dn->dn_next_blksz[tx->tx_txg&TXG_MASK] = size;
1783 dn->dn_indblkshift = ibs;
1784 dn->dn_next_indblkshift[tx->tx_txg&TXG_MASK] = ibs;
1790 rw_exit(&dn->dn_struct_rwlock);
1794 rw_exit(&dn->dn_struct_rwlock);
1799 dnode_set_nlevels_impl(dnode_t *dn, int new_nlevels, dmu_tx_t *tx)
1802 int old_nlevels = dn->dn_nlevels;
1807 ASSERT(RW_WRITE_HELD(&dn->dn_struct_rwlock));
1809 ASSERT3U(new_nlevels, >, dn->dn_nlevels);
1810 dn->dn_nlevels = new_nlevels;
1812 ASSERT3U(new_nlevels, >, dn->dn_next_nlevels[txgoff]);
1813 dn->dn_next_nlevels[txgoff] = new_nlevels;
1816 db = dbuf_hold_level(dn, old_nlevels, 0, FTAG);
1822 mutex_enter(&dn->dn_mtx);
1824 list = &dn->dn_dirty_records[txgoff];
1826 dr_next = list_next(&dn->dn_dirty_records[txgoff], dr);
1833 list_remove(&dn->dn_dirty_records[txgoff], dr);
1839 mutex_exit(&dn->dn_mtx);
1843 dnode_set_nlevels(dnode_t *dn, int nlevels, dmu_tx_t *tx)
1847 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
1849 if (dn->dn_nlevels == nlevels) {
1852 } else if (nlevels < dn->dn_nlevels) {
1857 dnode_set_nlevels_impl(dn, nlevels, tx);
1860 rw_exit(&dn->dn_struct_rwlock);
1866 dnode_new_blkid(dnode_t *dn, uint64_t blkid, dmu_tx_t *tx, boolean_t have_read,
1875 RW_READ_HELD(&dn->dn_struct_rwlock) :
1876 RW_WRITE_HELD(&dn->dn_struct_rwlock));
1883 if (blkid <= dn->dn_maxblkid)
1886 if (!rw_tryupgrade(&dn->dn_struct_rwlock)) {
1887 rw_exit(&dn->dn_struct_rwlock);
1888 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
1896 if (!force && blkid <= dn->dn_maxblkid)
1904 dn->dn_maxblkid = blkid;
1905 dn->dn_next_maxblkid[tx->tx_txg & TXG_MASK] =
1913 epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT;
1914 for (sz = dn->dn_nblkptr;
1915 sz <= blkid && sz >= dn->dn_nblkptr; sz <<= epbs)
1921 if (new_nlevels > dn->dn_nlevels)
1922 dnode_set_nlevels_impl(dn, new_nlevels, tx);
1924 ASSERT3U(dn->dn_nlevels, >=, new_nlevels);
1929 rw_downgrade(&dn->dn_struct_rwlock);
1933 dnode_dirty_l1(dnode_t *dn, uint64_t l1blkid, dmu_tx_t *tx)
1935 dmu_buf_impl_t *db = dbuf_hold_level(dn, 1, l1blkid, FTAG);
1947 dnode_dirty_l1range(dnode_t *dn, uint64_t start_blkid, uint64_t end_blkid,
1956 mutex_enter(&dn->dn_dbufs_mtx);
1963 db = avl_find(&dn->dn_dbufs, db_search, &where);
1965 db = avl_nearest(&dn->dn_dbufs, where, AVL_AFTER);
1986 mutex_exit(&dn->dn_dbufs_mtx);
1987 dnode_dirty_l1(dn, db->db_blkid, tx);
1988 mutex_enter(&dn->dn_dbufs_mtx);
1998 db = avl_find(&dn->dn_dbufs, db_search, &where);
2000 db = avl_nearest(&dn->dn_dbufs, where, AVL_AFTER);
2001 for (; db != NULL; db = AVL_NEXT(&dn->dn_dbufs, db)) {
2009 mutex_exit(&dn->dn_dbufs_mtx);
2013 dnode_set_dirtyctx(dnode_t *dn, dmu_tx_t *tx, void *tag)
2019 if (dn->dn_dirtyctx == DN_UNDIRTIED) {
2020 dsl_dataset_t *ds = dn->dn_objset->os_dsl_dataset;
2025 if (!BP_IS_HOLE(dn->dn_objset->os_rootbp)) {
2027 dn->dn_dirtyctx = DN_DIRTY_SYNC;
2029 dn->dn_dirtyctx = DN_DIRTY_OPEN;
2030 dn->dn_dirtyctx_firstset = tag;
2039 dnode_free_range(dnode_t *dn, uint64_t off, uint64_t len, dmu_tx_t *tx)
2047 blksz = dn->dn_datablksz;
2048 blkshift = dn->dn_datablkshift;
2049 epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT;
2062 if ((off >> blkshift) > dn->dn_maxblkid)
2065 ASSERT(dn->dn_maxblkid == 0);
2072 if (dn->dn_nlevels > 1) {
2073 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
2074 dnode_dirty_l1(dn, 0, tx);
2075 rw_exit(&dn->dn_struct_rwlock);
2094 rw_enter(&dn->dn_struct_rwlock, RW_READER);
2095 res = dbuf_hold_impl(dn, 0, dbuf_whichblock(dn, 0, off),
2097 rw_exit(&dn->dn_struct_rwlock);
2124 if ((off >> blkshift) > dn->dn_maxblkid)
2139 rw_enter(&dn->dn_struct_rwlock, RW_READER);
2140 res = dbuf_hold_impl(dn, 0, dbuf_whichblock(dn, 0, off+len),
2142 rw_exit(&dn->dn_struct_rwlock);
2191 if (dn->dn_nlevels > 1) {
2192 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
2196 dnode_dirty_l1(dn, first, tx);
2198 last = dn->dn_maxblkid >> epbs;
2202 dnode_dirty_l1(dn, last, tx);
2204 dnode_dirty_l1range(dn, first, last, tx);
2206 int shift = dn->dn_datablkshift + dn->dn_indblkshift -
2216 int err = dnode_next_offset(dn, DNODE_FIND_HAVELOCK,
2235 dnode_dirty_l1(dn, i, tx);
2237 rw_exit(&dn->dn_struct_rwlock);
2245 mutex_enter(&dn->dn_mtx);
2248 if (dn->dn_free_ranges[txgoff] == NULL) {
2249 dn->dn_free_ranges[txgoff] = range_tree_create(NULL,
2252 range_tree_clear(dn->dn_free_ranges[txgoff], blkid, nblks);
2253 range_tree_add(dn->dn_free_ranges[txgoff], blkid, nblks);
2255 dprintf_dnode(dn, "blkid=%llu nblks=%llu txg=%llu\n",
2257 mutex_exit(&dn->dn_mtx);
2259 dbuf_free_range(dn, blkid, blkid + nblks - 1, tx);
2260 dnode_setdirty(dn, tx);
2264 dnode_spill_freed(dnode_t *dn)
2268 mutex_enter(&dn->dn_mtx);
2270 if (dn->dn_rm_spillblk[i] == DN_KILL_SPILLBLK)
2273 mutex_exit(&dn->dn_mtx);
2279 dnode_block_freed(dnode_t *dn, uint64_t blkid)
2281 void *dp = spa_get_dsl(dn->dn_objset->os_spa);
2294 if (dn->dn_free_txg)
2298 return (dnode_spill_freed(dn));
2300 mutex_enter(&dn->dn_mtx);
2302 if (dn->dn_free_ranges[i] != NULL &&
2303 range_tree_contains(dn->dn_free_ranges[i], blkid, 1))
2306 mutex_exit(&dn->dn_mtx);
2312 dnode_diduse_space(dnode_t *dn, int64_t delta)
2315 dprintf_dnode(dn, "dn=%p dnp=%p used=%llu delta=%lld\n",
2316 dn, dn->dn_phys,
2317 (u_longlong_t)dn->dn_phys->dn_used,
2320 mutex_enter(&dn->dn_mtx);
2321 space = DN_USED_BYTES(dn->dn_phys);
2328 if (spa_version(dn->dn_objset->os_spa) < SPA_VERSION_DNODE_BYTES) {
2329 ASSERT((dn->dn_phys->dn_flags & DNODE_FLAG_USED_BYTES) == 0);
2331 dn->dn_phys->dn_used = space >> DEV_BSHIFT;
2333 dn->dn_phys->dn_used = space;
2334 dn->dn_phys->dn_flags |= DNODE_FLAG_USED_BYTES;
2336 mutex_exit(&dn->dn_mtx);
2358 dnode_next_offset_level(dnode_t *dn, int flags, uint64_t *offset,
2363 uint64_t epbs = dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT;
2369 ASSERT(RW_LOCK_HELD(&dn->dn_struct_rwlock));
2375 if (lvl == dn->dn_phys->dn_nlevels) {
2377 epb = dn->dn_phys->dn_nblkptr;
2378 data = dn->dn_phys->dn_blkptr;
2380 uint64_t blkid = dbuf_whichblock(dn, lvl, *offset);
2381 error = dbuf_hold_impl(dn, lvl, blkid, TRUE, FALSE, FTAG, &db);
2418 ASSERT(dn->dn_type == DMU_OT_DNODE);
2435 span = (lvl - 1) * epbs + dn->dn_datablkshift;
2446 ASSERT3U((lvl - 1), ==, dn->dn_phys->dn_nlevels - 1);
2496 * dnode_next_offset(dn, flags, offset, 1, 1, 0);
2511 dnode_next_offset(dnode_t *dn, int flags, uint64_t *offset,
2519 rw_enter(&dn->dn_struct_rwlock, RW_READER);
2521 if (dn->dn_phys->dn_nlevels == 0) {
2526 if (dn->dn_datablkshift == 0) {
2527 if (*offset < dn->dn_datablksz) {
2529 *offset = dn->dn_datablksz;
2536 maxlvl = dn->dn_phys->dn_nlevels;
2539 error = dnode_next_offset_level(dn,
2546 error = dnode_next_offset_level(dn,
2564 rw_exit(&dn->dn_struct_rwlock);