Print this page
2619 asynchronous destruction of ZFS file systems
2747 SPA versioning with zfs feature flags
Reviewed by: Matt Ahrens <mahrens@delphix.com>
Reviewed by: George Wilson <gwilson@delphix.com>
Reviewed by: Richard Lowe <richlowe@richlowe.net>
Reviewed by: Dan Kruchinin <dan.kruchinin@gmail.com>
Approved by: Dan McDonald <danmcd@nexenta.com>

@@ -18,10 +18,11 @@
  *
  * CDDL HEADER END
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012 by Delphix. All rights reserved.
  */
 
 #include <sys/zfs_context.h>
 #include <sys/dbuf.h>
 #include <sys/dnode.h>

@@ -191,11 +192,11 @@
 
         ASSERT(dn->dn_phys);
         ASSERT(dn->dn_objset);
         ASSERT(dn->dn_handle->dnh_dnode == dn);
 
-        ASSERT(dn->dn_phys->dn_type < DMU_OT_NUMTYPES);
+        ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type));
 
         if (!(zfs_flags & ZFS_DEBUG_DNODE_VERIFY))
                 return;
 
         if (!RW_WRITE_HELD(&dn->dn_struct_rwlock)) {

@@ -210,11 +211,11 @@
                         ASSERT3U(dn->dn_datablkshift, >=, SPA_MINBLOCKSHIFT);
                         ASSERT3U(dn->dn_datablkshift, <=, SPA_MAXBLOCKSHIFT);
                         ASSERT3U(1<<dn->dn_datablkshift, ==, dn->dn_datablksz);
                 }
                 ASSERT3U(dn->dn_nlevels, <=, 30);
-                ASSERT3U(dn->dn_type, <=, DMU_OT_NUMTYPES);
+                ASSERT(DMU_OT_IS_VALID(dn->dn_type));
                 ASSERT3U(dn->dn_nblkptr, >=, 1);
                 ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR);
                 ASSERT3U(dn->dn_bonuslen, <=, DN_MAX_BONUSLEN);
                 ASSERT3U(dn->dn_datablksz, ==,
                     dn->dn_datablkszsec << SPA_MINBLOCKSHIFT);

@@ -276,12 +277,14 @@
                  * pointer (instead of packing it against the end of the
                  * dnode buffer).
                  */
                 int off = (dnp->dn_nblkptr-1) * sizeof (blkptr_t);
                 size_t len = DN_MAX_BONUSLEN - off;
-                ASSERT3U(dnp->dn_bonustype, <, DMU_OT_NUMTYPES);
-                dmu_ot[dnp->dn_bonustype].ot_byteswap(dnp->dn_bonus + off, len);
+                ASSERT(DMU_OT_IS_VALID(dnp->dn_bonustype));
+                dmu_object_byteswap_t byteswap =
+                    DMU_OT_BYTESWAP(dnp->dn_bonustype);
+                dmu_ot_byteswap[byteswap].ob_func(dnp->dn_bonus + off, len);
         }
 
         /* Swap SPILL block if we have one */
         if (dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR)
                 byteswap_uint64_array(&dnp->dn_spill, sizeof (blkptr_t));

@@ -405,11 +408,11 @@
         dn->dn_have_spill = ((dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) != 0);
         dn->dn_id_flags = 0;
 
         dmu_zfetch_init(&dn->dn_zfetch, dn);
 
-        ASSERT(dn->dn_phys->dn_type < DMU_OT_NUMTYPES);
+        ASSERT(DMU_OT_IS_VALID(dn->dn_phys->dn_type));
 
         mutex_enter(&os->os_lock);
         list_insert_head(&os->os_dnodes, dn);
         membar_producer();
         /*

@@ -494,15 +497,15 @@
 
         ASSERT(dn->dn_type == DMU_OT_NONE);
         ASSERT(bcmp(dn->dn_phys, &dnode_phys_zero, sizeof (dnode_phys_t)) == 0);
         ASSERT(dn->dn_phys->dn_type == DMU_OT_NONE);
         ASSERT(ot != DMU_OT_NONE);
-        ASSERT3U(ot, <, DMU_OT_NUMTYPES);
+        ASSERT(DMU_OT_IS_VALID(ot));
         ASSERT((bonustype == DMU_OT_NONE && bonuslen == 0) ||
             (bonustype == DMU_OT_SA && bonuslen == 0) ||
             (bonustype != DMU_OT_NONE && bonuslen != 0));
-        ASSERT3U(bonustype, <, DMU_OT_NUMTYPES);
+        ASSERT(DMU_OT_IS_VALID(bonustype));
         ASSERT3U(bonuslen, <=, DN_MAX_BONUSLEN);
         ASSERT(dn->dn_type == DMU_OT_NONE);
         ASSERT3U(dn->dn_maxblkid, ==, 0);
         ASSERT3U(dn->dn_allocated_txg, ==, 0);
         ASSERT3U(dn->dn_assigned_txg, ==, 0);

@@ -566,11 +569,11 @@
         ASSERT(dn->dn_object != DMU_META_DNODE_OBJECT || dmu_tx_private_ok(tx));
         ASSERT(tx->tx_txg != 0);
         ASSERT((bonustype == DMU_OT_NONE && bonuslen == 0) ||
             (bonustype != DMU_OT_NONE && bonuslen != 0) ||
             (bonustype == DMU_OT_SA && bonuslen == 0));
-        ASSERT3U(bonustype, <, DMU_OT_NUMTYPES);
+        ASSERT(DMU_OT_IS_VALID(bonustype));
         ASSERT3U(bonuslen, <=, DN_MAX_BONUSLEN);
 
         /* clean up any unreferenced dbufs */
         dnode_evict_dbufs(dn);