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

Lines Matching refs: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 dn->dn_object, dn->dn_phys->dn_nlevels);
74 dbuf_find(dn->dn_objset, dn->dn_object, old_toplvl, i);
79 if (dn->dn_dbuf != NULL)
80 rw_enter(&dn->dn_dbuf->db_rwlock, RW_WRITER);
85 bcopy(dn->dn_phys->dn_blkptr, db->db.db_data,
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 bzero(dn->dn_phys->dn_blkptr, 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, dn->dn_object, num);
146 ASSERT3U(bytesfreed, <=, DN_USED_BYTES(dn->dn_phys));
162 if (spa_feature_is_active(dn->dn_objset->os_spa,
170 dnode_diduse_space(dn, -bytesfreed);
180 dnode_t *dn;
183 dn = DB_DNODE(db);
184 epbs = dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT;
191 ASSERT3U(db->db.db_size, ==, 1 << dn->dn_phys->dn_indblkshift);
203 rw_enter(&dn->dn_struct_rwlock, RW_READER);
204 err = dbuf_hold_impl(dn, db->db_level - 1,
206 rw_exit(&dn->dn_struct_rwlock);
268 dnode_t *dn;
307 dn = DB_DNODE(db);
308 epbs = dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT;
328 free_blocks(dn, bp, end - start + 1, tx);
334 rw_enter(&dn->dn_struct_rwlock, RW_READER);
335 VERIFY0(dbuf_hold_impl(dn, db->db_level - 1,
337 rw_exit(&dn->dn_struct_rwlock);
350 free_blocks(dn, db->db_blkptr, 1, tx);
363 dnode_sync_free_range_impl(dnode_t *dn, uint64_t blkid, uint64_t nblks,
366 blkptr_t *bp = dn->dn_phys->dn_blkptr;
367 int dnlevel = dn->dn_phys->dn_nlevels;
370 if (blkid > dn->dn_phys->dn_maxblkid)
373 ASSERT(dn->dn_phys->dn_maxblkid < UINT64_MAX);
374 if (blkid + nblks > dn->dn_phys->dn_maxblkid) {
375 nblks = dn->dn_phys->dn_maxblkid - blkid + 1;
381 if (blkid >= dn->dn_phys->dn_nblkptr) {
385 ASSERT3U(blkid + nblks, <=, dn->dn_phys->dn_nblkptr);
386 free_blocks(dn, bp + blkid, nblks, tx);
389 (dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT);
394 ASSERT(start < dn->dn_phys->dn_nblkptr);
399 rw_enter(&dn->dn_struct_rwlock, RW_READER);
400 VERIFY0(dbuf_hold_impl(dn, dnlevel - 1, i,
402 rw_exit(&dn->dn_struct_rwlock);
422 if (trunc && !dn->dn_objset->os_raw_receive) {
424 dn->dn_phys->dn_maxblkid = blkid == 0 ? 0 : blkid - 1;
426 off = (dn->dn_phys->dn_maxblkid + 1) *
427 (dn->dn_phys->dn_datablkszsec << SPA_MINBLOCKSHIFT);
428 ASSERT(off < dn->dn_phys->dn_maxblkid ||
429 dn->dn_phys->dn_maxblkid == 0 ||
430 dnode_next_offset(dn, 0, &off, 1, 1, 0) != 0);
444 dnode_t *dn = dsfra->dsfra_dnode;
446 mutex_exit(&dn->dn_mtx);
447 dnode_sync_free_range_impl(dn, blkid, nblks,
449 mutex_enter(&dn->dn_mtx);
456 dnode_evict_dbufs(dnode_t *dn)
463 mutex_enter(&dn->dn_dbufs_mtx);
464 for (db = avl_first(&dn->dn_dbufs); db != NULL; db = db_next) {
468 ASSERT3P(DB_DNODE(db), ==, dn);
478 avl_insert_here(&dn->dn_dbufs, db_marker, db,
496 db_next = AVL_NEXT(&dn->dn_dbufs, db_marker);
497 avl_remove(&dn->dn_dbufs, db_marker);
501 db_next = AVL_NEXT(&dn->dn_dbufs, db);
504 mutex_exit(&dn->dn_dbufs_mtx);
508 dnode_evict_bonus(dn);
512 dnode_evict_bonus(dnode_t *dn)
514 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
515 if (dn->dn_bonus != NULL) {
516 if (zfs_refcount_is_zero(&dn->dn_bonus->db_holds)) {
517 mutex_enter(&dn->dn_bonus->db_mtx);
518 dbuf_destroy(dn->dn_bonus);
519 dn->dn_bonus = NULL;
521 dn->dn_bonus->db_pending_evict = TRUE;
524 rw_exit(&dn->dn_struct_rwlock);
560 dnode_sync_free(dnode_t *dn, dmu_tx_t *tx)
570 ASSERT0(DN_USED_BYTES(dn->dn_phys));
571 ASSERT(BP_IS_HOLE(dn->dn_phys->dn_blkptr));
573 dnode_undirty_dbufs(&dn->dn_dirty_records[txgoff]);
574 dnode_evict_dbufs(dn);
583 * ASSERT3U(zfs_refcount_count(&dn->dn_holds), ==, 1);
587 dn->dn_next_nlevels[txgoff] = 0;
588 dn->dn_next_indblkshift[txgoff] = 0;
589 dn->dn_next_blksz[txgoff] = 0;
590 dn->dn_next_maxblkid[txgoff] = 0;
593 ASSERT(dn->dn_phys->dn_type != DMU_OT_NONE);
594 ASSERT(dn->dn_type != DMU_OT_NONE);
596 ASSERT(dn->dn_free_txg > 0);
597 if (dn->dn_allocated_txg != dn->dn_free_txg)
598 dmu_buf_will_dirty(&dn->dn_dbuf->db, tx);
599 bzero(dn->dn_phys, sizeof (dnode_phys_t) * dn->dn_num_slots);
600 dnode_free_interior_slots(dn);
602 mutex_enter(&dn->dn_mtx);
603 dn->dn_type = DMU_OT_NONE;
604 dn->dn_maxblkid = 0;
605 dn->dn_allocated_txg = 0;
606 dn->dn_free_txg = 0;
607 dn->dn_have_spill = B_FALSE;
608 dn->dn_num_slots = 1;
609 mutex_exit(&dn->dn_mtx);
611 ASSERT(dn->dn_object != DMU_META_DNODE_OBJECT);
613 dnode_rele(dn, (void *)(uintptr_t)tx->tx_txg);
624 dnode_sync(dnode_t *dn, dmu_tx_t *tx)
626 objset_t *os = dn->dn_objset;
627 dnode_phys_t *dnp = dn->dn_phys;
629 list_t *list = &dn->dn_dirty_records[txgoff];
634 ASSERT(dnp->dn_type != DMU_OT_NONE || dn->dn_allocated_txg);
637 DNODE_VERIFY(dn);
639 ASSERT(dn->dn_dbuf == NULL || arc_released(dn->dn_dbuf->db_buf));
646 !DMU_OBJECT_IS_SPECIAL(dn->dn_object) &&
648 mutex_enter(&dn->dn_mtx);
649 dn->dn_oldused = DN_USED_BYTES(dn->dn_phys);
650 dn->dn_oldflags = dn->dn_phys->dn_flags;
651 dn->dn_phys->dn_flags |= DNODE_FLAG_USERUSED_ACCOUNTED;
652 if (dmu_objset_userobjused_enabled(dn->dn_objset))
653 dn->dn_phys->dn_flags |=
655 mutex_exit(&dn->dn_mtx);
656 dmu_objset_userquota_get_ids(dn, B_FALSE, tx);
659 ASSERT(!(dn->dn_phys->dn_flags &
661 ASSERT(!(dn->dn_phys->dn_flags &
665 mutex_enter(&dn->dn_mtx);
666 if (dn->dn_allocated_txg == tx->tx_txg) {
671 dnp->dn_nblkptr = dn->dn_nblkptr;
674 dnp->dn_type = dn->dn_type;
675 dnp->dn_bonustype = dn->dn_bonustype;
676 dnp->dn_bonuslen = dn->dn_bonuslen;
679 dnp->dn_extra_slots = dn->dn_num_slots - 1;
690 if (dn->dn_next_type[txgoff] != 0) {
691 dnp->dn_type = dn->dn_type;
692 dn->dn_next_type[txgoff] = 0;
695 if (dn->dn_next_blksz[txgoff] != 0) {
696 ASSERT(P2PHASE(dn->dn_next_blksz[txgoff],
699 dn->dn_maxblkid == 0 || list_head(list) != NULL ||
700 dn->dn_next_blksz[txgoff] >> SPA_MINBLOCKSHIFT ==
702 !range_tree_is_empty(dn->dn_free_ranges[txgoff]));
704 dn->dn_next_blksz[txgoff] >> SPA_MINBLOCKSHIFT;
705 dn->dn_next_blksz[txgoff] = 0;
708 if (dn->dn_next_bonuslen[txgoff] != 0) {
709 if (dn->dn_next_bonuslen[txgoff] == DN_ZERO_BONUSLEN)
712 dnp->dn_bonuslen = dn->dn_next_bonuslen[txgoff];
715 dn->dn_next_bonuslen[txgoff] = 0;
718 if (dn->dn_next_bonustype[txgoff] != 0) {
719 ASSERT(DMU_OT_IS_VALID(dn->dn_next_bonustype[txgoff]));
720 dnp->dn_bonustype = dn->dn_next_bonustype[txgoff];
721 dn->dn_next_bonustype[txgoff] = 0;
724 boolean_t freeing_dnode = dn->dn_free_txg > 0 &&
725 dn->dn_free_txg <= tx->tx_txg;
731 if (dn->dn_rm_spillblk[txgoff] || freeing_dnode) {
734 dn->dn_rm_spillblk[txgoff] = 0;
737 if (dn->dn_next_indblkshift[txgoff] != 0) {
739 dnp->dn_indblkshift = dn->dn_next_indblkshift[txgoff];
740 dn->dn_next_indblkshift[txgoff] = 0;
748 dnp->dn_checksum = dn->dn_checksum;
749 dnp->dn_compress = dn->dn_compress;
751 mutex_exit(&dn->dn_mtx);
754 free_blocks(dn, DN_SPILL_BLKPTR(dn->dn_phys), 1, tx);
755 mutex_enter(&dn->dn_mtx);
757 mutex_exit(&dn->dn_mtx);
761 if (dn->dn_free_ranges[txgoff] != NULL) {
763 dsfra.dsfra_dnode = dn;
766 mutex_enter(&dn->dn_mtx);
768 ASSERT(range_tree_contains(dn->dn_free_ranges[txgoff],
769 0, dn->dn_maxblkid + 1));
779 range_tree_walk(dn->dn_free_ranges[txgoff],
781 range_tree_vacate(dn->dn_free_ranges[txgoff], NULL, NULL);
782 range_tree_destroy(dn->dn_free_ranges[txgoff]);
783 dn->dn_free_ranges[txgoff] = NULL;
784 mutex_exit(&dn->dn_mtx);
788 dn->dn_objset->os_freed_dnodes++;
789 dnode_sync_free(dn, tx);
793 if (dn->dn_num_slots > DNODE_MIN_SLOTS) {
794 dsl_dataset_t *ds = dn->dn_objset->os_dsl_dataset;
801 if (dn->dn_next_nlevels[txgoff]) {
802 dnode_increase_indirection(dn, tx);
803 dn->dn_next_nlevels[txgoff] = 0;
811 if (dn->dn_next_maxblkid[txgoff]) {
812 mutex_enter(&dn->dn_mtx);
814 dn->dn_next_maxblkid[txgoff] & ~DMU_NEXT_MAXBLKID_SET;
815 dn->dn_next_maxblkid[txgoff] = 0;
816 mutex_exit(&dn->dn_mtx);
819 if (dn->dn_next_nblkptr[txgoff]) {
821 ASSERT(dn->dn_allocated_txg == tx->tx_txg);
822 if (dn->dn_next_nblkptr[txgoff] > dnp->dn_nblkptr) {
826 (dn->dn_next_nblkptr[txgoff] - dnp->dn_nblkptr));
830 ASSERT(dn->dn_next_nblkptr[txgoff] < dnp->dn_nblkptr);
833 if (i >= dn->dn_next_nblkptr[txgoff])
838 mutex_enter(&dn->dn_mtx);
839 dnp->dn_nblkptr = dn->dn_next_nblkptr[txgoff];
840 dn->dn_next_nblkptr[txgoff] = 0;
841 mutex_exit(&dn->dn_mtx);
844 dbuf_sync_list(list, dn->dn_phys->dn_nlevels - 1, tx);
846 if (!DMU_OBJECT_IS_SPECIAL(dn->dn_object)) {
848 dnode_rele(dn, (void *)(uintptr_t)tx->tx_txg);