usr/src/uts/common/fs/zfs/dnode.c
changeset 13700 2889e2596bd6
parent 12684 397e44ebb8a9
child 13764 38b4aca480b3
equal deleted inserted replaced
13699:733714f4dc24 13700:2889e2596bd6
    18  *
    18  *
    19  * CDDL HEADER END
    19  * CDDL HEADER END
    20  */
    20  */
    21 /*
    21 /*
    22  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
    22  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
       
    23  * Copyright (c) 2012 by Delphix. All rights reserved.
    23  */
    24  */
    24 
    25 
    25 #include <sys/zfs_context.h>
    26 #include <sys/zfs_context.h>
    26 #include <sys/dbuf.h>
    27 #include <sys/dbuf.h>
    27 #include <sys/dnode.h>
    28 #include <sys/dnode.h>
   191 
   192 
   192 	ASSERT(dn->dn_phys);
   193 	ASSERT(dn->dn_phys);
   193 	ASSERT(dn->dn_objset);
   194 	ASSERT(dn->dn_objset);
   194 	ASSERT(dn->dn_handle->dnh_dnode == dn);
   195 	ASSERT(dn->dn_handle->dnh_dnode == dn);
   195 
   196 
   196 	ASSERT(dn->dn_phys->dn_type < DMU_OT_NUMTYPES);
   197 	ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type));
   197 
   198 
   198 	if (!(zfs_flags & ZFS_DEBUG_DNODE_VERIFY))
   199 	if (!(zfs_flags & ZFS_DEBUG_DNODE_VERIFY))
   199 		return;
   200 		return;
   200 
   201 
   201 	if (!RW_WRITE_HELD(&dn->dn_struct_rwlock)) {
   202 	if (!RW_WRITE_HELD(&dn->dn_struct_rwlock)) {
   210 			ASSERT3U(dn->dn_datablkshift, >=, SPA_MINBLOCKSHIFT);
   211 			ASSERT3U(dn->dn_datablkshift, >=, SPA_MINBLOCKSHIFT);
   211 			ASSERT3U(dn->dn_datablkshift, <=, SPA_MAXBLOCKSHIFT);
   212 			ASSERT3U(dn->dn_datablkshift, <=, SPA_MAXBLOCKSHIFT);
   212 			ASSERT3U(1<<dn->dn_datablkshift, ==, dn->dn_datablksz);
   213 			ASSERT3U(1<<dn->dn_datablkshift, ==, dn->dn_datablksz);
   213 		}
   214 		}
   214 		ASSERT3U(dn->dn_nlevels, <=, 30);
   215 		ASSERT3U(dn->dn_nlevels, <=, 30);
   215 		ASSERT3U(dn->dn_type, <=, DMU_OT_NUMTYPES);
   216 		ASSERT(DMU_OT_IS_VALID(dn->dn_type));
   216 		ASSERT3U(dn->dn_nblkptr, >=, 1);
   217 		ASSERT3U(dn->dn_nblkptr, >=, 1);
   217 		ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR);
   218 		ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR);
   218 		ASSERT3U(dn->dn_bonuslen, <=, DN_MAX_BONUSLEN);
   219 		ASSERT3U(dn->dn_bonuslen, <=, DN_MAX_BONUSLEN);
   219 		ASSERT3U(dn->dn_datablksz, ==,
   220 		ASSERT3U(dn->dn_datablksz, ==,
   220 		    dn->dn_datablkszsec << SPA_MINBLOCKSHIFT);
   221 		    dn->dn_datablkszsec << SPA_MINBLOCKSHIFT);
   276 		 * pointer (instead of packing it against the end of the
   277 		 * pointer (instead of packing it against the end of the
   277 		 * dnode buffer).
   278 		 * dnode buffer).
   278 		 */
   279 		 */
   279 		int off = (dnp->dn_nblkptr-1) * sizeof (blkptr_t);
   280 		int off = (dnp->dn_nblkptr-1) * sizeof (blkptr_t);
   280 		size_t len = DN_MAX_BONUSLEN - off;
   281 		size_t len = DN_MAX_BONUSLEN - off;
   281 		ASSERT3U(dnp->dn_bonustype, <, DMU_OT_NUMTYPES);
   282 		ASSERT(DMU_OT_IS_VALID(dnp->dn_bonustype));
   282 		dmu_ot[dnp->dn_bonustype].ot_byteswap(dnp->dn_bonus + off, len);
   283 		dmu_object_byteswap_t byteswap =
       
   284 		    DMU_OT_BYTESWAP(dnp->dn_bonustype);
       
   285 		dmu_ot_byteswap[byteswap].ob_func(dnp->dn_bonus + off, len);
   283 	}
   286 	}
   284 
   287 
   285 	/* Swap SPILL block if we have one */
   288 	/* Swap SPILL block if we have one */
   286 	if (dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR)
   289 	if (dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR)
   287 		byteswap_uint64_array(&dnp->dn_spill, sizeof (blkptr_t));
   290 		byteswap_uint64_array(&dnp->dn_spill, sizeof (blkptr_t));
   405 	dn->dn_have_spill = ((dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) != 0);
   408 	dn->dn_have_spill = ((dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) != 0);
   406 	dn->dn_id_flags = 0;
   409 	dn->dn_id_flags = 0;
   407 
   410 
   408 	dmu_zfetch_init(&dn->dn_zfetch, dn);
   411 	dmu_zfetch_init(&dn->dn_zfetch, dn);
   409 
   412 
   410 	ASSERT(dn->dn_phys->dn_type < DMU_OT_NUMTYPES);
   413 	ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type));
   411 
   414 
   412 	mutex_enter(&os->os_lock);
   415 	mutex_enter(&os->os_lock);
   413 	list_insert_head(&os->os_dnodes, dn);
   416 	list_insert_head(&os->os_dnodes, dn);
   414 	membar_producer();
   417 	membar_producer();
   415 	/*
   418 	/*
   494 
   497 
   495 	ASSERT(dn->dn_type == DMU_OT_NONE);
   498 	ASSERT(dn->dn_type == DMU_OT_NONE);
   496 	ASSERT(bcmp(dn->dn_phys, &dnode_phys_zero, sizeof (dnode_phys_t)) == 0);
   499 	ASSERT(bcmp(dn->dn_phys, &dnode_phys_zero, sizeof (dnode_phys_t)) == 0);
   497 	ASSERT(dn->dn_phys->dn_type == DMU_OT_NONE);
   500 	ASSERT(dn->dn_phys->dn_type == DMU_OT_NONE);
   498 	ASSERT(ot != DMU_OT_NONE);
   501 	ASSERT(ot != DMU_OT_NONE);
   499 	ASSERT3U(ot, <, DMU_OT_NUMTYPES);
   502 	ASSERT(DMU_OT_IS_VALID(ot));
   500 	ASSERT((bonustype == DMU_OT_NONE && bonuslen == 0) ||
   503 	ASSERT((bonustype == DMU_OT_NONE && bonuslen == 0) ||
   501 	    (bonustype == DMU_OT_SA && bonuslen == 0) ||
   504 	    (bonustype == DMU_OT_SA && bonuslen == 0) ||
   502 	    (bonustype != DMU_OT_NONE && bonuslen != 0));
   505 	    (bonustype != DMU_OT_NONE && bonuslen != 0));
   503 	ASSERT3U(bonustype, <, DMU_OT_NUMTYPES);
   506 	ASSERT(DMU_OT_IS_VALID(bonustype));
   504 	ASSERT3U(bonuslen, <=, DN_MAX_BONUSLEN);
   507 	ASSERT3U(bonuslen, <=, DN_MAX_BONUSLEN);
   505 	ASSERT(dn->dn_type == DMU_OT_NONE);
   508 	ASSERT(dn->dn_type == DMU_OT_NONE);
   506 	ASSERT3U(dn->dn_maxblkid, ==, 0);
   509 	ASSERT3U(dn->dn_maxblkid, ==, 0);
   507 	ASSERT3U(dn->dn_allocated_txg, ==, 0);
   510 	ASSERT3U(dn->dn_allocated_txg, ==, 0);
   508 	ASSERT3U(dn->dn_assigned_txg, ==, 0);
   511 	ASSERT3U(dn->dn_assigned_txg, ==, 0);
   566 	ASSERT(dn->dn_object != DMU_META_DNODE_OBJECT || dmu_tx_private_ok(tx));
   569 	ASSERT(dn->dn_object != DMU_META_DNODE_OBJECT || dmu_tx_private_ok(tx));
   567 	ASSERT(tx->tx_txg != 0);
   570 	ASSERT(tx->tx_txg != 0);
   568 	ASSERT((bonustype == DMU_OT_NONE && bonuslen == 0) ||
   571 	ASSERT((bonustype == DMU_OT_NONE && bonuslen == 0) ||
   569 	    (bonustype != DMU_OT_NONE && bonuslen != 0) ||
   572 	    (bonustype != DMU_OT_NONE && bonuslen != 0) ||
   570 	    (bonustype == DMU_OT_SA && bonuslen == 0));
   573 	    (bonustype == DMU_OT_SA && bonuslen == 0));
   571 	ASSERT3U(bonustype, <, DMU_OT_NUMTYPES);
   574 	ASSERT(DMU_OT_IS_VALID(bonustype));
   572 	ASSERT3U(bonuslen, <=, DN_MAX_BONUSLEN);
   575 	ASSERT3U(bonuslen, <=, DN_MAX_BONUSLEN);
   573 
   576 
   574 	/* clean up any unreferenced dbufs */
   577 	/* clean up any unreferenced dbufs */
   575 	dnode_evict_dbufs(dn);
   578 	dnode_evict_dbufs(dn);
   576 
   579