Print this page
3748 zfs headers should be C++ compatible
Submitted by:   Justin Gibbs <justing@spectralogic.com>
Submitted by:   Will Andrews <willa@spectralogic.com>
Reviewed by:    Matthew Ahrens <mahrens@delphix.com>

*** 90,116 **** DMU_BACKUP_FEATURE_DEDUPPROPS | DMU_BACKUP_FEATURE_SA_SPILL) /* Are all features in the given flag word currently supported? */ #define DMU_STREAM_SUPPORTED(x) (!((x) & ~DMU_BACKUP_FEATURE_MASK)) - /* - * The drr_versioninfo field of the dmu_replay_record has the - * following layout: - * - * 64 56 48 40 32 24 16 8 0 - * +-------+-------+-------+-------+-------+-------+-------+-------+ - * | reserved | feature-flags |C|S| - * +-------+-------+-------+-------+-------+-------+-------+-------+ - * - * The low order two bits indicate the header type: SUBSTREAM (0x1) - * or COMPOUNDSTREAM (0x2). Using two bits for this is historical: - * this field used to be a version number, where the two version types - * were 1 and 2. Using two bits for this allows earlier versions of - * the code to be able to recognize send streams that don't use any - * of the features indicated by feature flags. - */ - #define DMU_BACKUP_MAGIC 0x2F5bacbacULL #define DRR_FLAG_CLONE (1<<0) #define DRR_FLAG_CI_DATA (1<<1) --- 90,99 ----
*** 123,172 **** #define DRR_IS_DEDUP_CAPABLE(flags) ((flags) & DRR_CHECKSUM_DEDUP) /* * zfs ioctl command structure */ ! typedef struct dmu_replay_record { ! enum { DRR_BEGIN, DRR_OBJECT, DRR_FREEOBJECTS, DRR_WRITE, DRR_FREE, DRR_END, DRR_WRITE_BYREF, DRR_SPILL, DRR_NUMTYPES ! } drr_type; ! uint32_t drr_payloadlen; ! union { ! struct drr_begin { uint64_t drr_magic; ! uint64_t drr_versioninfo; /* was drr_version */ uint64_t drr_creation_time; dmu_objset_type_t drr_type; uint32_t drr_flags; uint64_t drr_toguid; uint64_t drr_fromguid; char drr_toname[MAXNAMELEN]; ! } drr_begin; ! struct drr_end { zio_cksum_t drr_checksum; uint64_t drr_toguid; ! } drr_end; ! struct drr_object { uint64_t drr_object; dmu_object_type_t drr_type; dmu_object_type_t drr_bonustype; uint32_t drr_blksz; uint32_t drr_bonuslen; uint8_t drr_checksumtype; uint8_t drr_compress; uint8_t drr_pad[6]; uint64_t drr_toguid; /* bonus content follows */ ! } drr_object; ! struct drr_freeobjects { uint64_t drr_firstobj; uint64_t drr_numobjs; uint64_t drr_toguid; ! } drr_freeobjects; ! struct drr_write { uint64_t drr_object; dmu_object_type_t drr_type; uint32_t drr_pad; uint64_t drr_offset; uint64_t drr_length; --- 106,172 ---- #define DRR_IS_DEDUP_CAPABLE(flags) ((flags) & DRR_CHECKSUM_DEDUP) /* * zfs ioctl command structure */ ! enum drr_type { DRR_BEGIN, DRR_OBJECT, DRR_FREEOBJECTS, DRR_WRITE, DRR_FREE, DRR_END, DRR_WRITE_BYREF, DRR_SPILL, DRR_NUMTYPES ! }; ! ! struct drr_begin { uint64_t drr_magic; ! /* ! * Formerly named drr_version, this field has the following layout: ! * ! * 64 56 48 40 32 24 16 8 0 ! * +-------+-------+-------+-------+-------+-------+-------+-------+ ! * | reserved | feature-flags |C|S| ! * +-------+-------+-------+-------+-------+-------+-------+-------+ ! * ! * The low order two bits indicate the header type: SUBSTREAM (0x1) ! * or COMPOUNDSTREAM (0x2). Using two bits for this is historical: ! * this field used to be a version number, where the two version types ! * were 1 and 2. Using two bits for this allows earlier versions of ! * the code to be able to recognize send streams that don't use any ! * of the features indicated by feature flags. ! */ ! uint64_t drr_versioninfo; uint64_t drr_creation_time; dmu_objset_type_t drr_type; uint32_t drr_flags; uint64_t drr_toguid; uint64_t drr_fromguid; char drr_toname[MAXNAMELEN]; ! }; ! ! struct drr_end { zio_cksum_t drr_checksum; uint64_t drr_toguid; ! }; ! ! struct drr_object { uint64_t drr_object; dmu_object_type_t drr_type; dmu_object_type_t drr_bonustype; uint32_t drr_blksz; uint32_t drr_bonuslen; uint8_t drr_checksumtype; uint8_t drr_compress; uint8_t drr_pad[6]; uint64_t drr_toguid; /* bonus content follows */ ! }; ! ! struct drr_freeobjects { uint64_t drr_firstobj; uint64_t drr_numobjs; uint64_t drr_toguid; ! }; ! ! struct drr_write { uint64_t drr_object; dmu_object_type_t drr_type; uint32_t drr_pad; uint64_t drr_offset; uint64_t drr_length;
*** 174,213 **** uint8_t drr_checksumtype; uint8_t drr_checksumflags; uint8_t drr_pad2[6]; ddt_key_t drr_key; /* deduplication key */ /* content follows */ ! } drr_write; ! struct drr_free { uint64_t drr_object; uint64_t drr_offset; uint64_t drr_length; uint64_t drr_toguid; ! } drr_free; ! struct drr_write_byref { ! /* where to put the data */ ! uint64_t drr_object; uint64_t drr_offset; uint64_t drr_length; ! uint64_t drr_toguid; ! /* where to find the prior copy of the data */ uint64_t drr_refguid; uint64_t drr_refobject; ! uint64_t drr_refoffset; ! /* properties of the data */ uint8_t drr_checksumtype; uint8_t drr_checksumflags; uint8_t drr_pad2[6]; ddt_key_t drr_key; /* deduplication key */ ! } drr_write_byref; ! struct drr_spill { uint64_t drr_object; uint64_t drr_length; uint64_t drr_toguid; uint64_t drr_pad[4]; /* needed for crypto */ /* spill data follows */ ! } drr_spill; } drr_u; } dmu_replay_record_t; /* diff record range types */ typedef enum diff_type { --- 174,226 ---- uint8_t drr_checksumtype; uint8_t drr_checksumflags; uint8_t drr_pad2[6]; ddt_key_t drr_key; /* deduplication key */ /* content follows */ ! }; ! ! struct drr_free { uint64_t drr_object; uint64_t drr_offset; uint64_t drr_length; uint64_t drr_toguid; ! }; ! ! struct drr_write_byref { ! uint64_t drr_object; /* where to put the data */ uint64_t drr_offset; uint64_t drr_length; ! uint64_t drr_toguid; /* where to find the prior copy of the data */ uint64_t drr_refguid; uint64_t drr_refobject; ! uint64_t drr_refoffset; /* properties of the data */ uint8_t drr_checksumtype; uint8_t drr_checksumflags; uint8_t drr_pad2[6]; ddt_key_t drr_key; /* deduplication key */ ! }; ! ! struct drr_spill { uint64_t drr_object; uint64_t drr_length; uint64_t drr_toguid; uint64_t drr_pad[4]; /* needed for crypto */ /* spill data follows */ ! }; ! ! typedef struct dmu_replay_record { ! enum drr_type drr_type; ! uint32_t drr_payloadlen; ! union { ! struct drr_begin drr_begin; ! struct drr_end drr_end; ! struct drr_object drr_object; ! struct drr_freeobjects drr_freeobjects; ! struct drr_write drr_write; ! struct drr_free drr_free; ! struct drr_write_byref drr_write_byref; ! struct drr_spill drr_spill; } drr_u; } dmu_replay_record_t; /* diff record range types */ typedef enum diff_type {