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/dmu.h>
 #include <sys/dmu_impl.h>
 #include <sys/dmu_tx.h>
@@ -44,66 +45,79 @@
 #include <sys/vmsystm.h>
 #include <sys/zfs_znode.h>
 #endif
 
 const dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES] = {
-        {       byteswap_uint8_array,   TRUE,   "unallocated"           },
-        {       zap_byteswap,           TRUE,   "object directory"      },
-        {       byteswap_uint64_array,  TRUE,   "object array"          },
-        {       byteswap_uint8_array,   TRUE,   "packed nvlist"         },
-        {       byteswap_uint64_array,  TRUE,   "packed nvlist size"    },
-        {       byteswap_uint64_array,  TRUE,   "bpobj"                 },
-        {       byteswap_uint64_array,  TRUE,   "bpobj header"          },
-        {       byteswap_uint64_array,  TRUE,   "SPA space map header"  },
-        {       byteswap_uint64_array,  TRUE,   "SPA space map"         },
-        {       byteswap_uint64_array,  TRUE,   "ZIL intent log"        },
-        {       dnode_buf_byteswap,     TRUE,   "DMU dnode"             },
-        {       dmu_objset_byteswap,    TRUE,   "DMU objset"            },
-        {       byteswap_uint64_array,  TRUE,   "DSL directory"         },
-        {       zap_byteswap,           TRUE,   "DSL directory child map"},
-        {       zap_byteswap,           TRUE,   "DSL dataset snap map"  },
-        {       zap_byteswap,           TRUE,   "DSL props"             },
-        {       byteswap_uint64_array,  TRUE,   "DSL dataset"           },
-        {       zfs_znode_byteswap,     TRUE,   "ZFS znode"             },
-        {       zfs_oldacl_byteswap,    TRUE,   "ZFS V0 ACL"            },
-        {       byteswap_uint8_array,   FALSE,  "ZFS plain file"        },
-        {       zap_byteswap,           TRUE,   "ZFS directory"         },
-        {       zap_byteswap,           TRUE,   "ZFS master node"       },
-        {       zap_byteswap,           TRUE,   "ZFS delete queue"      },
-        {       byteswap_uint8_array,   FALSE,  "zvol object"           },
-        {       zap_byteswap,           TRUE,   "zvol prop"             },
-        {       byteswap_uint8_array,   FALSE,  "other uint8[]"         },
-        {       byteswap_uint64_array,  FALSE,  "other uint64[]"        },
-        {       zap_byteswap,           TRUE,   "other ZAP"             },
-        {       zap_byteswap,           TRUE,   "persistent error log"  },
-        {       byteswap_uint8_array,   TRUE,   "SPA history"           },
-        {       byteswap_uint64_array,  TRUE,   "SPA history offsets"   },
-        {       zap_byteswap,           TRUE,   "Pool properties"       },
-        {       zap_byteswap,           TRUE,   "DSL permissions"       },
-        {       zfs_acl_byteswap,       TRUE,   "ZFS ACL"               },
-        {       byteswap_uint8_array,   TRUE,   "ZFS SYSACL"            },
-        {       byteswap_uint8_array,   TRUE,   "FUID table"            },
-        {       byteswap_uint64_array,  TRUE,   "FUID table size"       },
-        {       zap_byteswap,           TRUE,   "DSL dataset next clones"},
-        {       zap_byteswap,           TRUE,   "scan work queue"       },
-        {       zap_byteswap,           TRUE,   "ZFS user/group used"   },
-        {       zap_byteswap,           TRUE,   "ZFS user/group quota"  },
-        {       zap_byteswap,           TRUE,   "snapshot refcount tags"},
-        {       zap_byteswap,           TRUE,   "DDT ZAP algorithm"     },
-        {       zap_byteswap,           TRUE,   "DDT statistics"        },
-        {       byteswap_uint8_array,   TRUE,   "System attributes"     },
-        {       zap_byteswap,           TRUE,   "SA master node"        },
-        {       zap_byteswap,           TRUE,   "SA attr registration"  },
-        {       zap_byteswap,           TRUE,   "SA attr layouts"       },
-        {       zap_byteswap,           TRUE,   "scan translations"     },
-        {       byteswap_uint8_array,   FALSE,  "deduplicated block"    },
-        {       zap_byteswap,           TRUE,   "DSL deadlist map"      },
-        {       byteswap_uint64_array,  TRUE,   "DSL deadlist map hdr"  },
-        {       zap_byteswap,           TRUE,   "DSL dir clones"        },
-        {       byteswap_uint64_array,  TRUE,   "bpobj subobj"          },
+        {       DMU_BSWAP_UINT8,        TRUE,   "unallocated"           },
+        {       DMU_BSWAP_ZAP,          TRUE,   "object directory"      },
+        {       DMU_BSWAP_UINT64,       TRUE,   "object array"          },
+        {       DMU_BSWAP_UINT8,        TRUE,   "packed nvlist"         },
+        {       DMU_BSWAP_UINT64,       TRUE,   "packed nvlist size"    },
+        {       DMU_BSWAP_UINT64,       TRUE,   "bpobj"                 },
+        {       DMU_BSWAP_UINT64,       TRUE,   "bpobj header"          },
+        {       DMU_BSWAP_UINT64,       TRUE,   "SPA space map header"  },
+        {       DMU_BSWAP_UINT64,       TRUE,   "SPA space map"         },
+        {       DMU_BSWAP_UINT64,       TRUE,   "ZIL intent log"        },
+        {       DMU_BSWAP_DNODE,        TRUE,   "DMU dnode"             },
+        {       DMU_BSWAP_OBJSET,       TRUE,   "DMU objset"            },
+        {       DMU_BSWAP_UINT64,       TRUE,   "DSL directory"         },
+        {       DMU_BSWAP_ZAP,          TRUE,   "DSL directory child map"},
+        {       DMU_BSWAP_ZAP,          TRUE,   "DSL dataset snap map"  },
+        {       DMU_BSWAP_ZAP,          TRUE,   "DSL props"             },
+        {       DMU_BSWAP_UINT64,       TRUE,   "DSL dataset"           },
+        {       DMU_BSWAP_ZNODE,        TRUE,   "ZFS znode"             },
+        {       DMU_BSWAP_OLDACL,       TRUE,   "ZFS V0 ACL"            },
+        {       DMU_BSWAP_UINT8,        FALSE,  "ZFS plain file"        },
+        {       DMU_BSWAP_ZAP,          TRUE,   "ZFS directory"         },
+        {       DMU_BSWAP_ZAP,          TRUE,   "ZFS master node"       },
+        {       DMU_BSWAP_ZAP,          TRUE,   "ZFS delete queue"      },
+        {       DMU_BSWAP_UINT8,        FALSE,  "zvol object"           },
+        {       DMU_BSWAP_ZAP,          TRUE,   "zvol prop"             },
+        {       DMU_BSWAP_UINT8,        FALSE,  "other uint8[]"         },
+        {       DMU_BSWAP_UINT64,       FALSE,  "other uint64[]"        },
+        {       DMU_BSWAP_ZAP,          TRUE,   "other ZAP"             },
+        {       DMU_BSWAP_ZAP,          TRUE,   "persistent error log"  },
+        {       DMU_BSWAP_UINT8,        TRUE,   "SPA history"           },
+        {       DMU_BSWAP_UINT64,       TRUE,   "SPA history offsets"   },
+        {       DMU_BSWAP_ZAP,          TRUE,   "Pool properties"       },
+        {       DMU_BSWAP_ZAP,          TRUE,   "DSL permissions"       },
+        {       DMU_BSWAP_ACL,          TRUE,   "ZFS ACL"               },
+        {       DMU_BSWAP_UINT8,        TRUE,   "ZFS SYSACL"            },
+        {       DMU_BSWAP_UINT8,        TRUE,   "FUID table"            },
+        {       DMU_BSWAP_UINT64,       TRUE,   "FUID table size"       },
+        {       DMU_BSWAP_ZAP,          TRUE,   "DSL dataset next clones"},
+        {       DMU_BSWAP_ZAP,          TRUE,   "scan work queue"       },
+        {       DMU_BSWAP_ZAP,          TRUE,   "ZFS user/group used"   },
+        {       DMU_BSWAP_ZAP,          TRUE,   "ZFS user/group quota"  },
+        {       DMU_BSWAP_ZAP,          TRUE,   "snapshot refcount tags"},
+        {       DMU_BSWAP_ZAP,          TRUE,   "DDT ZAP algorithm"     },
+        {       DMU_BSWAP_ZAP,          TRUE,   "DDT statistics"        },
+        {       DMU_BSWAP_UINT8,        TRUE,   "System attributes"     },
+        {       DMU_BSWAP_ZAP,          TRUE,   "SA master node"        },
+        {       DMU_BSWAP_ZAP,          TRUE,   "SA attr registration"  },
+        {       DMU_BSWAP_ZAP,          TRUE,   "SA attr layouts"       },
+        {       DMU_BSWAP_ZAP,          TRUE,   "scan translations"     },
+        {       DMU_BSWAP_UINT8,        FALSE,  "deduplicated block"    },
+        {       DMU_BSWAP_ZAP,          TRUE,   "DSL deadlist map"      },
+        {       DMU_BSWAP_UINT64,       TRUE,   "DSL deadlist map hdr"  },
+        {       DMU_BSWAP_ZAP,          TRUE,   "DSL dir clones"        },
+        {       DMU_BSWAP_UINT64,       TRUE,   "bpobj subobj"          }
 };
 
+const dmu_object_byteswap_info_t dmu_ot_byteswap[DMU_BSWAP_NUMFUNCS] = {
+        {       byteswap_uint8_array,   "uint8"         },
+        {       byteswap_uint16_array,  "uint16"        },
+        {       byteswap_uint32_array,  "uint32"        },
+        {       byteswap_uint64_array,  "uint64"        },
+        {       zap_byteswap,           "zap"           },
+        {       dnode_buf_byteswap,     "dnode"         },
+        {       dmu_objset_byteswap,    "objset"        },
+        {       zfs_znode_byteswap,     "znode"         },
+        {       zfs_oldacl_byteswap,    "oldacl"        },
+        {       zfs_acl_byteswap,       "acl"           }
+};
+
 int
 dmu_buf_hold(objset_t *os, uint64_t object, uint64_t offset,
     void *tag, dmu_buf_t **dbp, int flags)
 {
         dnode_t *dn;
@@ -174,11 +188,11 @@
         int error;
 
         DB_DNODE_ENTER(db);
         dn = DB_DNODE(db);
 
-        if (type > DMU_OT_NUMTYPES) {
+        if (!DMU_OT_IS_VALID(type)) {
                 error = EINVAL;
         } else if (dn->dn_bonus != db) {
                 error = EINVAL;
         } else {
                 dnode_setbonus_type(dn, type, tx);
@@ -1501,11 +1515,11 @@
 
 void
 dmu_write_policy(objset_t *os, dnode_t *dn, int level, int wp, zio_prop_t *zp)
 {
         dmu_object_type_t type = dn ? dn->dn_type : DMU_OT_OBJSET;
-        boolean_t ismd = (level > 0 || dmu_ot[type].ot_metadata ||
+        boolean_t ismd = (level > 0 || DMU_OT_IS_METADATA(type) ||
             (wp & WP_SPILL));
         enum zio_checksum checksum = os->os_checksum;
         enum zio_compress compress = os->os_compress;
         enum zio_checksum dedup_checksum = os->os_dedup_checksum;
         boolean_t dedup;