Lines Matching refs:dn

219 	dnode_t *dn;
222 if (dnode_hold(os, object, FTAG, &dn) == 0) {
223 rw_enter(&dn->dn_struct_rwlock, RW_READER);
224 if (dn->dn_bonus != NULL) {
225 db = dn->dn_bonus;
228 rw_exit(&dn->dn_struct_rwlock);
229 dnode_rele(dn, FTAG);
674 dnode_t *dn;
684 dn = DB_DNODE(db);
685 if (dn == NULL) {
689 ASSERT3U(db->db.db_object, ==, dn->dn_object);
690 ASSERT3P(db->db_objset, ==, dn->dn_objset);
691 ASSERT3U(db->db_level, <, dn->dn_nlevels);
694 !avl_is_empty(&dn->dn_dbufs));
697 ASSERT(dn != NULL);
698 ASSERT3U(db->db.db_size, >=, dn->dn_bonuslen);
701 ASSERT(dn != NULL);
702 ASSERT3U(db->db.db_size, >=, dn->dn_bonuslen);
730 if (db->db_parent == dn->dn_dbuf) {
732 /* ASSERT3U(db->db_blkid, <, dn->dn_nblkptr); */
739 &dn->dn_phys->dn_blkptr[db->db_blkid]);
751 if (RW_WRITE_HELD(&dn->dn_struct_rwlock)) {
761 db->db_state != DB_FILL && !dn->dn_free_txg) {
870 dbuf_whichblock(dnode_t *dn, int64_t level, uint64_t offset)
872 if (dn->dn_datablkshift != 0 && dn->dn_indblkshift != 0) {
892 return (offset >> (dn->dn_datablkshift + level *
893 (dn->dn_indblkshift - SPA_BLKPTRSHIFT)));
895 ASSERT3U(offset, <, dn->dn_datablksz);
937 dnode_t *dn;
942 dn = DB_DNODE(db);
945 ASSERT(RW_LOCK_HELD(&dn->dn_struct_rwlock));
951 int bonuslen = MIN(dn->dn_bonuslen, dn->dn_phys->dn_bonuslen);
959 bcopy(DN_BONUS(dn->dn_phys), db->db.db_data, bonuslen);
972 (db->db_level == 0 && (dnode_block_freed(dn, db->db_blkid) ||
989 1 << dn->dn_indblkshift);
992 dn->dn_datablksz :
1094 dnode_t *dn;
1106 dn = DB_DNODE(db);
1108 rw_enter(&dn->dn_struct_rwlock, RW_READER);
1111 (flags & DB_RF_NOPREFETCH) == 0 && dn != NULL &&
1130 dmu_zfetch(&dn->dn_zfetch, db->db_blkid, 1, B_TRUE);
1132 rw_exit(&dn->dn_struct_rwlock);
1135 spa_t *spa = dn->dn_objset->os_spa;
1144 dmu_zfetch(&dn->dn_zfetch, db->db_blkid, 1, B_TRUE);
1147 rw_exit(&dn->dn_struct_rwlock);
1163 dmu_zfetch(&dn->dn_zfetch, db->db_blkid, 1, B_TRUE);
1165 rw_exit(&dn->dn_struct_rwlock);
1254 dbuf_free_range(dnode_t *dn, uint64_t start_blkid, uint64_t end_blkid,
1262 if (end_blkid > dn->dn_maxblkid &&
1264 end_blkid = dn->dn_maxblkid;
1265 dprintf_dnode(dn, "start=%llu end=%llu\n", start_blkid, end_blkid);
1271 mutex_enter(&dn->dn_dbufs_mtx);
1272 db = avl_find(&dn->dn_dbufs, &db_search, &where);
1275 db = avl_nearest(&dn->dn_dbufs, where, AVL_AFTER);
1278 db_next = AVL_NEXT(&dn->dn_dbufs, db);
1323 db->db_blkid > dn->dn_maxblkid)
1324 dn->dn_maxblkid = db->db_blkid;
1346 mutex_exit(&dn->dn_dbufs_mtx);
1390 dnode_t *dn;
1395 dn = DB_DNODE(db);
1398 ASSERT(RW_WRITE_HELD(&dn->dn_struct_rwlock));
1413 buf = arc_alloc_buf(dn->dn_objset->os_spa, db, type, size);
1433 dnode_willuse_space(dn, size-osize, tx);
1479 dnode_t *dn;
1491 dn = DB_DNODE(db);
1498 if (dn->dn_objset->os_dsl_dataset != NULL) {
1499 rrw_enter(&dn->dn_objset->os_dsl_dataset->ds_bp_rwlock,
1503 BP_IS_HOLE(dn->dn_objset->os_rootbp) ||
1504 DMU_OBJECT_IS_SPECIAL(dn->dn_object) ||
1505 dn->dn_objset->os_dsl_dataset == NULL);
1506 if (dn->dn_objset->os_dsl_dataset != NULL)
1507 rrw_exit(&dn->dn_objset->os_dsl_dataset->ds_bp_rwlock, FTAG);
1514 ASSERT(dn->dn_object == DMU_META_DNODE_OBJECT ||
1515 dn->dn_dirtyctx == DN_UNDIRTIED || dn->dn_dirtyctx ==
1528 mutex_enter(&dn->dn_mtx);
1533 if (dn->dn_dirtyctx == DN_UNDIRTIED) {
1534 if (dn->dn_objset->os_dsl_dataset != NULL) {
1535 rrw_enter(&dn->dn_objset->os_dsl_dataset->ds_bp_rwlock,
1538 if (!BP_IS_HOLE(dn->dn_objset->os_rootbp)) {
1539 dn->dn_dirtyctx = (dmu_tx_is_syncing(tx) ?
1541 ASSERT(dn->dn_dirtyctx_firstset == NULL);
1542 dn->dn_dirtyctx_firstset = kmem_alloc(1, KM_SLEEP);
1544 if (dn->dn_objset->os_dsl_dataset != NULL) {
1545 rrw_exit(&dn->dn_objset->os_dsl_dataset->ds_bp_rwlock,
1549 mutex_exit(&dn->dn_mtx);
1552 dn->dn_have_spill = B_TRUE;
1573 ASSERT(dn->dn_object == 0 ||
1574 dn->dn_dirtyctx == DN_UNDIRTIED || dn->dn_dirtyctx ==
1577 ASSERT3U(dn->dn_nlevels, >, db->db_level);
1578 ASSERT((dn->dn_phys->dn_nlevels == 0 && db->db_level == 0) ||
1579 dn->dn_phys->dn_nlevels > db->db_level ||
1580 dn->dn_next_nlevels[txgoff] > db->db_level ||
1581 dn->dn_next_nlevels[(tx->tx_txg-1) & TXG_MASK] > db->db_level ||
1582 dn->dn_next_nlevels[(tx->tx_txg-2) & TXG_MASK] > db->db_level);
1591 os = dn->dn_objset;
1593 if (dn->dn_objset->os_dsl_dataset != NULL)
1595 ASSERT(!dmu_tx_is_syncing(tx) || DMU_OBJECT_IS_SPECIAL(dn->dn_object) ||
1597 if (dn->dn_objset->os_dsl_dataset != NULL)
1612 dnode_willuse_space(dn, db->db.db_size, tx);
1666 mutex_enter(&dn->dn_mtx);
1667 if (dn->dn_free_ranges[txgoff] != NULL) {
1668 range_tree_clear(dn->dn_free_ranges[txgoff],
1671 mutex_exit(&dn->dn_mtx);
1686 mutex_enter(&dn->dn_mtx);
1688 list_insert_tail(&dn->dn_dirty_records[txgoff], dr);
1689 mutex_exit(&dn->dn_mtx);
1690 dnode_setdirty(dn, tx);
1701 if (!RW_WRITE_HELD(&dn->dn_struct_rwlock)) {
1702 rw_enter(&dn->dn_struct_rwlock, RW_READER);
1719 dnode_willuse_space(dn, -willfree, tx);
1723 dnode_new_blkid(dn, db->db_blkid, tx, drop_struct_lock);
1724 ASSERT(dn->dn_maxblkid >= db->db_blkid);
1727 if (db->db_level+1 < dn->dn_nlevels) {
1732 if (db->db_parent == NULL || db->db_parent == dn->dn_dbuf) {
1733 int epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT;
1735 parent = dbuf_hold_level(dn, db->db_level+1,
1741 rw_exit(&dn->dn_struct_rwlock);
1753 dn->dn_object == DMU_META_DNODE_OBJECT) {
1763 ASSERT(db->db_level+1 == dn->dn_nlevels);
1764 ASSERT(db->db_blkid < dn->dn_nblkptr);
1765 ASSERT(db->db_parent == NULL || db->db_parent == dn->dn_dbuf);
1766 mutex_enter(&dn->dn_mtx);
1768 list_insert_tail(&dn->dn_dirty_records[txgoff], dr);
1769 mutex_exit(&dn->dn_mtx);
1771 rw_exit(&dn->dn_struct_rwlock);
1774 dnode_setdirty(dn, tx);
1786 dnode_t *dn;
1817 dn = DB_DNODE(db);
1823 dsl_pool_undirty_space(dmu_objset_pool(dn->dn_objset),
1839 db->db_level + 1 == dn->dn_nlevels) {
1840 ASSERT(db->db_blkptr == NULL || db->db_parent == dn->dn_dbuf);
1841 mutex_enter(&dn->dn_mtx);
1842 list_remove(&dn->dn_dirty_records[txg & TXG_MASK], dr);
1843 mutex_exit(&dn->dn_mtx);
2063 dnode_t *dn;
2104 dn = DB_DNODE(db);
2105 dndb = dn->dn_dbuf;
2107 boolean_t needlock = !MUTEX_HELD(&dn->dn_dbufs_mtx);
2109 mutex_enter(&dn->dn_dbufs_mtx);
2110 avl_remove(&dn->dn_dbufs, db);
2111 atomic_dec_32(&dn->dn_dbufs_count);
2115 mutex_exit(&dn->dn_dbufs_mtx);
2124 dnode_rele(dn, db);
2161 dbuf_findbp(dnode_t *dn, int level, uint64_t blkid, int fail_sparse,
2172 mutex_enter(&dn->dn_mtx);
2173 if (dn->dn_have_spill &&
2174 (dn->dn_phys->dn_flags & DNODE_FLAG_SPILL_BLKPTR))
2175 *bpp = &dn->dn_phys->dn_spill;
2178 dbuf_add_ref(dn->dn_dbuf, NULL);
2179 *parentp = dn->dn_dbuf;
2180 mutex_exit(&dn->dn_mtx);
2184 if (dn->dn_phys->dn_nlevels == 0)
2187 nlevels = dn->dn_phys->dn_nlevels;
2189 epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT;
2192 ASSERT(RW_LOCK_HELD(&dn->dn_struct_rwlock));
2194 (blkid > (dn->dn_phys->dn_maxblkid >> (level * epbs)))) {
2199 int err = dbuf_hold_impl(dn, level+1,
2216 ASSERT(dn->dn_phys->dn_nblkptr == 0 ||
2217 blkid < dn->dn_phys->dn_nblkptr);
2218 if (dn->dn_dbuf) {
2219 dbuf_add_ref(dn->dn_dbuf, NULL);
2220 *parentp = dn->dn_dbuf;
2222 *bpp = &dn->dn_phys->dn_blkptr[blkid];
2228 dbuf_create(dnode_t *dn, uint8_t level, uint64_t blkid,
2231 objset_t *os = dn->dn_objset;
2234 ASSERT(RW_LOCK_HELD(&dn->dn_struct_rwlock));
2235 ASSERT(dn->dn_type != DMU_OT_NONE);
2240 db->db.db_object = dn->dn_object;
2245 db->db_dnode_handle = dn->dn_handle;
2255 ASSERT3P(parent, ==, dn->dn_dbuf);
2257 (dn->dn_nblkptr-1) * sizeof (blkptr_t);
2258 ASSERT3U(db->db.db_size, >=, dn->dn_bonuslen);
2270 db->db_level ? 1 << dn->dn_indblkshift : dn->dn_datablksz;
2282 mutex_enter(&dn->dn_dbufs_mtx);
2287 mutex_exit(&dn->dn_dbufs_mtx);
2290 avl_add(&dn->dn_dbufs, db);
2293 mutex_exit(&dn->dn_dbufs_mtx);
2296 if (parent && parent != dn->dn_dbuf)
2299 ASSERT(dn->dn_object == DMU_META_DNODE_OBJECT ||
2300 refcount_count(&dn->dn_holds) > 0);
2301 (void) refcount_add(&dn->dn_holds, db);
2302 atomic_inc_32(&dn->dn_dbufs_count);
2422 dbuf_prefetch(dnode_t *dn, int64_t level, uint64_t blkid, zio_priority_t prio,
2430 ASSERT(RW_LOCK_HELD(&dn->dn_struct_rwlock));
2432 if (blkid > dn->dn_maxblkid)
2435 if (dnode_block_freed(dn, blkid))
2442 nlevels = dn->dn_phys->dn_nlevels;
2443 if (level >= nlevels || dn->dn_phys->dn_nblkptr == 0)
2446 epbs = dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT;
2447 if (dn->dn_phys->dn_maxblkid < blkid << (epbs * level))
2450 dmu_buf_impl_t *db = dbuf_find(dn->dn_objset, dn->dn_object,
2473 if (dbuf_hold_impl(dn, parent_level, parent_blkid,
2487 ASSERT3U(curblkid, <, dn->dn_phys->dn_nblkptr);
2488 bp = dn->dn_phys->dn_blkptr[curblkid];
2495 zio_t *pio = zio_root(dmu_objset_spa(dn->dn_objset), NULL, NULL,
2499 dsl_dataset_t *ds = dn->dn_objset->os_dsl_dataset;
2501 dn->dn_object, level, blkid);
2505 dpa->dpa_spa = dn->dn_objset->os_spa;
2506 dpa->dpa_dnode = dn;
2526 dn->dn_object, curlevel, curblkid);
2544 dbuf_hold_impl(dnode_t *dn, uint8_t level, uint64_t blkid,
2551 ASSERT(RW_LOCK_HELD(&dn->dn_struct_rwlock));
2552 ASSERT3U(dn->dn_nlevels, >, level);
2557 db = dbuf_find(dn->dn_objset, dn->dn_object, level, blkid);
2567 err = dbuf_findbp(dn, level, blkid, fail_sparse, &parent, &bp);
2579 db = dbuf_create(dn, level, blkid, parent, bp);
2598 dn->dn_object != DMU_META_DNODE_OBJECT &&
2606 arc_alloc_buf(dn->dn_objset->os_spa, db, type,
2627 ASSERT3P(DB_DNODE(db), ==, dn);
2636 dbuf_hold(dnode_t *dn, uint64_t blkid, void *tag)
2638 return (dbuf_hold_level(dn, 0, blkid, tag));
2642 dbuf_hold_level(dnode_t *dn, int level, uint64_t blkid, void *tag)
2645 int err = dbuf_hold_impl(dn, level, blkid, FALSE, FALSE, tag, &db);
2650 dbuf_create_bonus(dnode_t *dn)
2652 ASSERT(RW_WRITE_HELD(&dn->dn_struct_rwlock));
2654 ASSERT(dn->dn_bonus == NULL);
2655 dn->dn_bonus = dbuf_create(dn, 0, DMU_BONUS_BLKID, dn->dn_dbuf, NULL);
2662 dnode_t *dn;
2672 dn = DB_DNODE(db);
2673 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
2675 rw_exit(&dn->dn_struct_rwlock);
2682 dbuf_rm_spill(dnode_t *dn, dmu_tx_t *tx)
2684 dbuf_free_range(dn, DMU_SPILL_BLKID, DMU_SPILL_BLKID, tx);
2774 dnode_t *dn;
2783 dn = DB_DNODE(db);
2784 atomic_dec_32(&dn->dn_dbufs_count);
2801 dnode_evict_bonus(dn);
2803 dnode_rele(dn, db);
2955 dbuf_check_blkptr(dnode_t *dn, dmu_buf_impl_t *db)
2964 db->db_blkptr = &dn->dn_phys->dn_spill;
2968 if (db->db_level == dn->dn_phys->dn_nlevels-1) {
2974 ASSERT(db->db_blkid < dn->dn_phys->dn_nblkptr);
2976 db->db_parent = dn->dn_dbuf;
2977 db->db_blkptr = &dn->dn_phys->dn_blkptr[db->db_blkid];
2981 int epbs = dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT;
2983 ASSERT(dn->dn_phys->dn_nlevels > 1);
2986 rw_enter(&dn->dn_struct_rwlock, RW_READER);
2987 parent = dbuf_hold_level(dn, db->db_level + 1,
2989 rw_exit(&dn->dn_struct_rwlock);
3003 dnode_t *dn;
3025 dn = DB_DNODE(db);
3027 ASSERT3U(db->db.db_size, ==, 1<<dn->dn_phys->dn_indblkshift);
3028 dbuf_check_blkptr(dn, db);
3050 dnode_t *dn;
3075 dn = DB_DNODE(db);
3078 mutex_enter(&dn->dn_mtx);
3079 dn->dn_phys->dn_flags |= DNODE_FLAG_SPILL_BLKPTR;
3080 mutex_exit(&dn->dn_mtx);
3094 ASSERT3U(dn->dn_phys->dn_bonuslen, <=, DN_MAX_BONUSLEN);
3095 bcopy(*datap, DN_BONUS(dn->dn_phys), dn->dn_phys->dn_bonuslen);
3116 os = dn->dn_objset;
3124 dbuf_check_blkptr(dn, db);
3131 ASSERT(dn->dn_object != DMU_META_DNODE_OBJECT);
3137 dn->dn_object != DMU_META_DNODE_OBJECT &&
3173 if (dn->dn_object == DMU_META_DNODE_OBJECT) {
3174 list_insert_tail(&dn->dn_dirty_records[txg&TXG_MASK], dr);
3224 dnode_t *dn;
3236 dn = DB_DNODE(db);
3238 dnode_diduse_space(dn, delta - zio->io_prev_space_delta);
3243 BP_GET_TYPE(bp) == dn->dn_type) ||
3245 BP_GET_TYPE(bp) == dn->dn_bonustype) ||
3254 ASSERT(dn->dn_phys->dn_flags & DNODE_FLAG_SPILL_BLKPTR);
3256 db->db_blkptr == &dn->dn_phys->dn_spill);
3261 mutex_enter(&dn->dn_mtx);
3262 if (db->db_blkid > dn->dn_phys->dn_maxblkid &&
3264 dn->dn_phys->dn_maxblkid = db->db_blkid;
3265 mutex_exit(&dn->dn_mtx);
3267 if (dn->dn_type == DMU_OT_DNODE) {
3283 ASSERT3U(db->db.db_size, ==, 1<<dn->dn_phys->dn_indblkshift);
3297 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
3299 rw_exit(&dn->dn_struct_rwlock);
3314 dnode_t *dn;
3320 dn = DB_DNODE(db);
3321 epbs = dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT;
3340 rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
3342 rw_exit(&dn->dn_struct_rwlock);
3419 dnode_t *dn;
3422 dn = DB_DNODE(db);
3423 ASSERT(dn->dn_phys->dn_flags & DNODE_FLAG_SPILL_BLKPTR);
3425 db->db_blkptr == &dn->dn_phys->dn_spill);
3438 dnode_t *dn;
3441 dn = DB_DNODE(db);
3443 ASSERT3U(db->db.db_size, ==, 1 << dn->dn_phys->dn_indblkshift);
3446 dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT;
3448 dn->dn_phys->dn_maxblkid >> (db->db_level * epbs));
3509 dnode_t *dn;
3521 dn = DB_DNODE(db);
3522 os = dn->dn_objset;
3525 if (db->db_level > 0 || dn->dn_type == DMU_OT_DNODE) {
3540 if (parent != dn->dn_dbuf) {
3554 ASSERT((db->db_level == dn->dn_phys->dn_nlevels-1 &&
3559 &dn->dn_phys->dn_blkptr[db->db_blkid]);
3560 zio = dn->dn_zio;
3575 dmu_write_policy(os, dn, db->db_level, wp_flag,