Lines Matching defs:dn

42 dnode_increase_indirection(dnode_t *dn, dmu_tx_t *tx)
46 int nblkptr = dn->dn_phys->dn_nblkptr;
47 int old_toplvl = dn->dn_phys->dn_nlevels - 1;
48 int new_level = dn->dn_next_nlevels[txgoff];
51 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
54 ASSERT(dn->dn_phys->dn_type != DMU_OT_NONE);
55 ASSERT(new_level > 1 && dn->dn_phys->dn_nlevels > 0);
57 db = dbuf_hold_level(dn, dn->dn_phys->dn_nlevels, 0, FTAG);
60 dn->dn_phys->dn_nlevels = new_level;
61 dprintf("os=%p obj=%llu, increase to %d\n", dn->dn_objset,
62 (u_longlong_t)dn->dn_object, dn->dn_phys->dn_nlevels);
73 children[i] = dbuf_find(dn->dn_objset, dn->dn_object,
79 if (dn->dn_dbuf != NULL)
80 rw_enter(&dn->dn_dbuf->db_rwlock, RW_WRITER);
85 memcpy(db->db.db_data, dn->dn_phys->dn_blkptr,
97 ASSERT3P(DB_DNODE(child), ==, dn);
100 if (child->db_parent && child->db_parent != dn->dn_dbuf) {
103 &dn->dn_phys->dn_blkptr[child->db_blkid]);
108 child->db_parent == dn->dn_dbuf);
122 memset(dn->dn_phys->dn_blkptr, 0, sizeof (blkptr_t) * nblkptr);
125 if (dn->dn_dbuf != NULL)
126 rw_exit(&dn->dn_dbuf->db_rwlock);
130 rw_exit(&dn->dn_struct_rwlock);
134 free_blocks(dnode_t *dn, blkptr_t *bp, int num, dmu_tx_t *tx)
136 dsl_dataset_t *ds = dn->dn_objset->os_dsl_dataset;
139 dprintf("ds=%p obj=%llx num=%d\n", ds, (u_longlong_t)dn->dn_object,
147 ASSERT3U(bytesfreed, <=, DN_USED_BYTES(dn->dn_phys));
163 if (spa_feature_is_active(dn->dn_objset->os_spa,
171 dnode_diduse_space(dn, -bytesfreed);
182 dnode_t *dn;
185 dn = DB_DNODE(db);
186 epbs = dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT;
190 ASSERT3U(dn->dn_phys->dn_indblkshift, >=, SPA_BLKPTRSHIFT);
194 ASSERT3U(db->db.db_size, ==, 1 << dn->dn_phys->dn_indblkshift);
205 rw_enter(&dn->dn_struct_rwlock, RW_READER);
206 err = dbuf_hold_impl(dn, db->db_level - 1,
208 rw_exit(&dn->dn_struct_rwlock);
276 dnode_t *dn;
315 dn = DB_DNODE(db);
316 epbs = dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT;
336 free_blocks(dn, bp, end - start + 1, tx);
342 rw_enter(&dn->dn_struct_rwlock, RW_READER);
343 VERIFY0(dbuf_hold_impl(dn, db->db_level - 1,
345 rw_exit(&dn->dn_struct_rwlock);
358 free_blocks(dn, db->db_blkptr, 1, tx);
371 dnode_sync_free_range_impl(dnode_t *dn, uint64_t blkid, uint64_t nblks,
374 blkptr_t *bp = dn->dn_phys->dn_blkptr;
375 int dnlevel = dn->dn_phys->dn_nlevels;
378 if (blkid > dn->dn_phys->dn_maxblkid)
381 ASSERT(dn->dn_phys->dn_maxblkid < UINT64_MAX);
382 if (blkid + nblks > dn->dn_phys->dn_maxblkid) {
383 nblks = dn->dn_phys->dn_maxblkid - blkid + 1;
389 if (blkid >= dn->dn_phys->dn_nblkptr) {
393 ASSERT3U(blkid + nblks, <=, dn->dn_phys->dn_nblkptr);
394 free_blocks(dn, bp + blkid, nblks, tx);
397 (dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT);
402 ASSERT(start < dn->dn_phys->dn_nblkptr);
407 rw_enter(&dn->dn_struct_rwlock, RW_READER);
408 VERIFY0(dbuf_hold_impl(dn, dnlevel - 1, i,
410 rw_exit(&dn->dn_struct_rwlock);
430 if (trunc && !dn->dn_objset->os_raw_receive) {
432 dn->dn_phys->dn_maxblkid = blkid == 0 ? 0 : blkid - 1;
434 off = (dn->dn_phys->dn_maxblkid + 1) *
435 (dn->dn_phys->dn_datablkszsec << SPA_MINBLOCKSHIFT);
436 ASSERT(off < dn->dn_phys->dn_maxblkid ||
437 dn->dn_phys->dn_maxblkid == 0 ||
438 dnode_next_offset(dn, 0, &off, 1, 1, 0) != 0);
452 dnode_t *dn = dsfra->dsfra_dnode;
454 mutex_exit(&dn->dn_mtx);
455 dnode_sync_free_range_impl(dn, blkid, nblks,
457 mutex_enter(&dn->dn_mtx);
464 dnode_evict_dbufs(dnode_t *dn)
471 mutex_enter(&dn->dn_dbufs_mtx);
472 for (db = avl_first(&dn->dn_dbufs); db != NULL; db = db_next) {
476 ASSERT3P(DB_DNODE(db), ==, dn);
493 avl_insert_here(&dn->dn_dbufs, db_marker, db,
511 db_next = AVL_NEXT(&dn->dn_dbufs, db_marker);
512 avl_remove(&dn->dn_dbufs, db_marker);
516 db_next = AVL_NEXT(&dn->dn_dbufs, db);
519 mutex_exit(&dn->dn_dbufs_mtx);
523 dnode_evict_bonus(dn);
527 dnode_evict_bonus(dnode_t *dn)
529 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
530 if (dn->dn_bonus != NULL) {
531 if (zfs_refcount_is_zero(&dn->dn_bonus->db_holds)) {
532 mutex_enter(&dn->dn_bonus->db_mtx);
533 dbuf_destroy(dn->dn_bonus);
534 dn->dn_bonus = NULL;
536 dn->dn_bonus->db_pending_evict = TRUE;
539 rw_exit(&dn->dn_struct_rwlock);
575 dnode_sync_free(dnode_t *dn, dmu_tx_t *tx)
585 ASSERT0(DN_USED_BYTES(dn->dn_phys));
586 ASSERT(BP_IS_HOLE(dn->dn_phys->dn_blkptr));
588 dnode_undirty_dbufs(&dn->dn_dirty_records[txgoff]);
589 dnode_evict_dbufs(dn);
598 * ASSERT3U(zfs_refcount_count(&dn->dn_holds), ==, 1);
602 dn->dn_next_nlevels[txgoff] = 0;
603 dn->dn_next_indblkshift[txgoff] = 0;
604 dn->dn_next_blksz[txgoff] = 0;
605 dn->dn_next_maxblkid[txgoff] = 0;
608 ASSERT(dn->dn_phys->dn_type != DMU_OT_NONE);
609 ASSERT(dn->dn_type != DMU_OT_NONE);
611 ASSERT(dn->dn_free_txg > 0);
612 if (dn->dn_allocated_txg != dn->dn_free_txg)
613 dmu_buf_will_dirty(&dn->dn_dbuf->db, tx);
614 memset(dn->dn_phys, 0, sizeof (dnode_phys_t) * dn->dn_num_slots);
615 dnode_free_interior_slots(dn);
617 mutex_enter(&dn->dn_mtx);
618 dn->dn_type = DMU_OT_NONE;
619 dn->dn_maxblkid = 0;
620 dn->dn_allocated_txg = 0;
621 dn->dn_free_txg = 0;
622 dn->dn_have_spill = B_FALSE;
623 dn->dn_num_slots = 1;
624 mutex_exit(&dn->dn_mtx);
626 ASSERT(dn->dn_object != DMU_META_DNODE_OBJECT);
628 dnode_rele(dn, (void *)(uintptr_t)tx->tx_txg);
640 dnode_sync(dnode_t *dn, dmu_tx_t *tx)
642 objset_t *os = dn->dn_objset;
643 dnode_phys_t *dnp = dn->dn_phys;
645 list_t *list = &dn->dn_dirty_records[txgoff];
650 ASSERT(dnp->dn_type != DMU_OT_NONE || dn->dn_allocated_txg);
653 DNODE_VERIFY(dn);
655 ASSERT(dn->dn_dbuf == NULL || arc_released(dn->dn_dbuf->db_buf));
662 !DMU_OBJECT_IS_SPECIAL(dn->dn_object) &&
664 mutex_enter(&dn->dn_mtx);
665 dn->dn_oldused = DN_USED_BYTES(dn->dn_phys);
666 dn->dn_oldflags = dn->dn_phys->dn_flags;
667 dn->dn_phys->dn_flags |= DNODE_FLAG_USERUSED_ACCOUNTED;
668 if (dmu_objset_userobjused_enabled(dn->dn_objset))
669 dn->dn_phys->dn_flags |=
671 mutex_exit(&dn->dn_mtx);
672 dmu_objset_userquota_get_ids(dn, B_FALSE, tx);
680 ASSERT(!(dn->dn_phys->dn_flags &
682 ASSERT(!(dn->dn_phys->dn_flags &
686 mutex_enter(&dn->dn_mtx);
687 if (dn->dn_allocated_txg == tx->tx_txg) {
692 dnp->dn_nblkptr = dn->dn_nblkptr;
695 dnp->dn_type = dn->dn_type;
696 dnp->dn_bonustype = dn->dn_bonustype;
697 dnp->dn_bonuslen = dn->dn_bonuslen;
700 dnp->dn_extra_slots = dn->dn_num_slots - 1;
711 if (dn->dn_next_type[txgoff] != 0) {
712 dnp->dn_type = dn->dn_type;
713 dn->dn_next_type[txgoff] = 0;
716 if (dn->dn_next_blksz[txgoff] != 0) {
717 ASSERT(P2PHASE(dn->dn_next_blksz[txgoff],
720 dn->dn_maxblkid == 0 || list_head(list) != NULL ||
721 dn->dn_next_blksz[txgoff] >> SPA_MINBLOCKSHIFT ==
723 !range_tree_is_empty(dn->dn_free_ranges[txgoff]));
725 dn->dn_next_blksz[txgoff] >> SPA_MINBLOCKSHIFT;
726 dn->dn_next_blksz[txgoff] = 0;
729 if (dn->dn_next_bonuslen[txgoff] != 0) {
730 if (dn->dn_next_bonuslen[txgoff] == DN_ZERO_BONUSLEN)
733 dnp->dn_bonuslen = dn->dn_next_bonuslen[txgoff];
736 dn->dn_next_bonuslen[txgoff] = 0;
739 if (dn->dn_next_bonustype[txgoff] != 0) {
740 ASSERT(DMU_OT_IS_VALID(dn->dn_next_bonustype[txgoff]));
741 dnp->dn_bonustype = dn->dn_next_bonustype[txgoff];
742 dn->dn_next_bonustype[txgoff] = 0;
745 boolean_t freeing_dnode = dn->dn_free_txg > 0 &&
746 dn->dn_free_txg <= tx->tx_txg;
752 if (dn->dn_rm_spillblk[txgoff] || freeing_dnode) {
755 dn->dn_rm_spillblk[txgoff] = 0;
758 if (dn->dn_next_indblkshift[txgoff] != 0) {
760 dnp->dn_indblkshift = dn->dn_next_indblkshift[txgoff];
761 dn->dn_next_indblkshift[txgoff] = 0;
769 dnp->dn_checksum = dn->dn_checksum;
770 dnp->dn_compress = dn->dn_compress;
772 mutex_exit(&dn->dn_mtx);
775 free_blocks(dn, DN_SPILL_BLKPTR(dn->dn_phys), 1, tx);
776 mutex_enter(&dn->dn_mtx);
778 mutex_exit(&dn->dn_mtx);
782 if (dn->dn_free_ranges[txgoff] != NULL) {
784 dsfra.dsfra_dnode = dn;
787 mutex_enter(&dn->dn_mtx);
789 ASSERT(range_tree_contains(dn->dn_free_ranges[txgoff],
790 0, dn->dn_maxblkid + 1));
800 range_tree_walk(dn->dn_free_ranges[txgoff],
802 range_tree_vacate(dn->dn_free_ranges[txgoff], NULL, NULL);
803 range_tree_destroy(dn->dn_free_ranges[txgoff]);
804 dn->dn_free_ranges[txgoff] = NULL;
805 mutex_exit(&dn->dn_mtx);
809 dn->dn_objset->os_freed_dnodes++;
810 dnode_sync_free(dn, tx);
814 if (dn->dn_num_slots > DNODE_MIN_SLOTS) {
815 dsl_dataset_t *ds = dn->dn_objset->os_dsl_dataset;
822 if (dn->dn_next_nlevels[txgoff]) {
823 dnode_increase_indirection(dn, tx);
824 dn->dn_next_nlevels[txgoff] = 0;
832 if (dn->dn_next_maxblkid[txgoff]) {
833 mutex_enter(&dn->dn_mtx);
835 dn->dn_next_maxblkid[txgoff] & ~DMU_NEXT_MAXBLKID_SET;
836 dn->dn_next_maxblkid[txgoff] = 0;
837 mutex_exit(&dn->dn_mtx);
840 if (dn->dn_next_nblkptr[txgoff]) {
842 ASSERT(dn->dn_allocated_txg == tx->tx_txg);
843 if (dn->dn_next_nblkptr[txgoff] > dnp->dn_nblkptr) {
847 (dn->dn_next_nblkptr[txgoff] - dnp->dn_nblkptr));
851 ASSERT(dn->dn_next_nblkptr[txgoff] < dnp->dn_nblkptr);
854 if (i >= dn->dn_next_nblkptr[txgoff])
859 mutex_enter(&dn->dn_mtx);
860 dnp->dn_nblkptr = dn->dn_next_nblkptr[txgoff];
861 dn->dn_next_nblkptr[txgoff] = 0;
862 mutex_exit(&dn->dn_mtx);
865 dbuf_sync_list(list, dn->dn_phys->dn_nlevels - 1, tx);
867 if (!DMU_OBJECT_IS_SPECIAL(dn->dn_object)) {
869 dnode_rele(dn, (void *)(uintptr_t)tx->tx_txg);