rem: dnode_verify(dn);
add: DNODE_VERIFY(dn);
context: dnode_setdirty(dnode_t *dn, dmu_tx_t *tx){	objset_impl_t *os = dn->dn_objset;	uint64_t txg = tx->tx_txg;	if (IS_DNODE_DNODE(dn->dn_object))		return;	dnode_verify(dn);#ifdef ZFS_DEBUG	mutex_enter(&dn->dn_mtx);	ASSERT(dn->dn_phys->dn_type || dn->dn_allocated_txg);	/* ASSERT(dn->dn_free_txg == 0 || dn->dn_free_txg >= txg); */	mutex_exit(&dn->dn_mtx);#endif	mutex_enter(&os->os_lock);	/*	 * If we are already marked dirty, we're done.	 */	if (dn->dn_dirtyblksz[txg&TXG_MASK] > 0) {		mutex_exit(&os->os_lock);		return;	}	ASSERT(!refcount_is_zero(&dn->dn_holds) || list_head(&dn->dn_dbufs));	ASSERT(dn->dn_datablksz != 0);	dn->dn_dirtyblksz[txg&TXG_MASK] = dn->dn_datablksz;	dprintf_ds(os->os_dsl_dataset, "obj=%llu txg=%llu\n",	    dn->dn_object, txg);	if (dn->dn_free_txg > 0 && dn->dn_free_txg <= txg) {		list_insert_tail(&os->os_free_dnodes[txg&TXG_MASK], dn);	} else {		list_insert_tail(&os->os_dirty_dnodes[txg&TXG_MASK], dn);	}	mutex_exit(&os->os_lock);	/*	 * The dnode maintains a hold on its containing dbuf as	 * long as there are holds on it.  Each instantiated child	 * dbuf maintaines a hold on the dnode.  When the last child	 * drops its hold, the dnode will drop its hold on the	 * containing dbuf. We add a "dirty hold" here so that the	 * dnode will hang around after we finish processing its	 * children.	 */	(void) refcount_add(&dn->dn_holds, (void *)(uintptr_t)tx->tx_txg);	dbuf_dirty(dn->dn_dbuf, tx);	dsl_dataset_dirty(os->os_dsl_dataset, tx);}