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;