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,27 **** --- 18,28 ---- * * 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,109 **** #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" }, }; int dmu_buf_hold(objset_t *os, uint64_t object, uint64_t offset, void *tag, dmu_buf_t **dbp, int flags) { dnode_t *dn; --- 45,123 ---- #include <sys/vmsystm.h> #include <sys/zfs_znode.h> #endif const dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES] = { ! { 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,184 **** int error; DB_DNODE_ENTER(db); dn = DB_DNODE(db); ! if (type > DMU_OT_NUMTYPES) { error = EINVAL; } else if (dn->dn_bonus != db) { error = EINVAL; } else { dnode_setbonus_type(dn, type, tx); --- 188,198 ---- int error; DB_DNODE_ENTER(db); dn = DB_DNODE(db); ! if (!DMU_OT_IS_VALID(type)) { error = EINVAL; } else if (dn->dn_bonus != db) { error = EINVAL; } else { dnode_setbonus_type(dn, type, tx);
*** 1501,1511 **** 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 || (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; --- 1515,1525 ---- 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_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;