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,15 +18,12 @@
  *
  * CDDL HEADER END
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2011 by Delphix. All rights reserved.
- */
-/*
  * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
- * Copyright (c) 2011 by Delphix. All rights reserved.
+ * Copyright (c) 2012 by Delphix. All rights reserved.
  * Copyright (c) 2012, Joyent, Inc. All rights reserved.
  */
 
 #include <sys/dmu.h>
 #include <sys/dmu_impl.h>

@@ -1073,12 +1070,12 @@
         int err;
         dmu_tx_t *tx;
         void *data = NULL;
 
         if (drro->drr_type == DMU_OT_NONE ||
-            drro->drr_type >= DMU_OT_NUMTYPES ||
-            drro->drr_bonustype >= DMU_OT_NUMTYPES ||
+            !DMU_OT_IS_VALID(drro->drr_type) ||
+            !DMU_OT_IS_VALID(drro->drr_bonustype) ||
             drro->drr_checksumtype >= ZIO_CHECKSUM_FUNCTIONS ||
             drro->drr_compress >= ZIO_COMPRESS_FUNCTIONS ||
             P2PHASE(drro->drr_blksz, SPA_MINBLOCKSIZE) ||
             drro->drr_blksz < SPA_MINBLOCKSIZE ||
             drro->drr_blksz > SPA_MAXBLOCKSIZE ||

@@ -1139,11 +1136,13 @@
                 dmu_buf_will_dirty(db, tx);
 
                 ASSERT3U(db->db_size, >=, drro->drr_bonuslen);
                 bcopy(data, db->db_data, drro->drr_bonuslen);
                 if (ra->byteswap) {
-                        dmu_ot[drro->drr_bonustype].ot_byteswap(db->db_data,
+                        dmu_object_byteswap_t byteswap =
+                            DMU_OT_BYTESWAP(drro->drr_bonustype);
+                        dmu_ot_byteswap[byteswap].ob_func(db->db_data,
                             drro->drr_bonuslen);
                 }
                 dmu_buf_rele(db, FTAG);
         }
         dmu_tx_commit(tx);

@@ -1182,11 +1181,11 @@
         dmu_tx_t *tx;
         void *data;
         int err;
 
         if (drrw->drr_offset + drrw->drr_length < drrw->drr_offset ||
-            drrw->drr_type >= DMU_OT_NUMTYPES)
+            !DMU_OT_IS_VALID(drrw->drr_type))
                 return (EINVAL);
 
         data = restore_read(ra, drrw->drr_length);
         if (data == NULL)
                 return (ra->err);

@@ -1201,12 +1200,15 @@
         err = dmu_tx_assign(tx, TXG_WAIT);
         if (err) {
                 dmu_tx_abort(tx);
                 return (err);
         }
-        if (ra->byteswap)
-                dmu_ot[drrw->drr_type].ot_byteswap(data, drrw->drr_length);
+        if (ra->byteswap) {
+                dmu_object_byteswap_t byteswap =
+                    DMU_OT_BYTESWAP(drrw->drr_type);
+                dmu_ot_byteswap[byteswap].ob_func(data, drrw->drr_length);
+        }
         dmu_write(os, drrw->drr_object,
             drrw->drr_offset, drrw->drr_length, data, tx);
         dmu_tx_commit(tx);
         return (0);
 }