Blame source/vdo/base/types.h

Packit Service 75d76b
/*
Packit Service 75d76b
 * Copyright (c) 2020 Red Hat, Inc.
Packit Service 75d76b
 *
Packit Service 75d76b
 * This program is free software; you can redistribute it and/or
Packit Service 75d76b
 * modify it under the terms of the GNU General Public License
Packit Service 75d76b
 * as published by the Free Software Foundation; either version 2
Packit Service 75d76b
 * of the License, or (at your option) any later version.
Packit Service 75d76b
 * 
Packit Service 75d76b
 * This program is distributed in the hope that it will be useful,
Packit Service 75d76b
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 75d76b
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 75d76b
 * GNU General Public License for more details.
Packit Service 75d76b
 * 
Packit Service 75d76b
 * You should have received a copy of the GNU General Public License
Packit Service 75d76b
 * along with this program; if not, write to the Free Software
Packit Service 75d76b
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit Service 75d76b
 * 02110-1301, USA. 
Packit Service 75d76b
 *
Packit Service 75d76b
 * $Id: //eng/vdo-releases/aluminum/src/c++/vdo/base/types.h#14 $
Packit Service 75d76b
 */
Packit Service 75d76b
Packit Service 75d76b
#ifndef TYPES_H
Packit Service 75d76b
#define TYPES_H
Packit Service 75d76b
Packit Service 75d76b
#include "blockMappingState.h"
Packit Service 75d76b
#include "common.h"
Packit Service 75d76b
#include "statusCodes.h"
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A size type in blocks.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint64_t BlockCount;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * The size of a block.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint16_t BlockSize;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A count of compressed fragments
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint8_t CompressedFragmentCount;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A CRC-32 checksum
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint32_t CRC32Checksum;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A height within a tree.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint8_t Height;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * The logical block number as used by the consumer.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint64_t LogicalBlockNumber;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * The type of the nonce used to identify instances of VDO.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint64_t Nonce;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A size in pages.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint32_t PageCount;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A page number.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint32_t PageNumber;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * The size of a page.  Must be evenly divisible by block size.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint32_t PageSize;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * The physical (well, less logical) block number at which the block is found
Packit Service 75d76b
 * on the underlying device.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint64_t PhysicalBlockNumber;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A release version number. These numbers are used to make the numbering
Packit Service 75d76b
 * space for component versions independent across release branches.
Packit Service 75d76b
 *
Packit Service 75d76b
 * Really an enum, but we have to specify the size for encoding; see
Packit Service 75d76b
 * releaseVersions.h for the enumeration values.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint32_t ReleaseVersionNumber;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A count of tree roots.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint8_t RootCount;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A number of sectors.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint8_t SectorCount;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A sequence number.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint64_t SequenceNumber;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A size type in slabs.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint16_t SlabCount;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A slot in a bin or block map page.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint16_t SlotNumber;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A number of VIOs.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint16_t VIOCount;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A VDO thread configuration.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef struct threadConfig ThreadConfig;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A thread counter
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint8_t ThreadCount;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A thread ID
Packit Service 75d76b
 *
Packit Service 75d76b
 * Base-code threads are numbered sequentially starting from 0.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint8_t ThreadID;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * The thread ID returned when the current base code thread ID cannot be found
Packit Service 75d76b
 * or is otherwise undefined.
Packit Service 75d76b
 **/
Packit Service 75d76b
static const ThreadID INVALID_THREAD_ID = (ThreadID) -1;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A zone counter
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef uint8_t ZoneCount;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * The type of request a VIO is performing
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef enum __attribute__((packed)) vioOperation {
Packit Service 75d76b
  VIO_UNSPECIFIED_OPERATION = 0,
Packit Service 75d76b
  VIO_READ                  = 1,
Packit Service 75d76b
  VIO_WRITE                 = 2,
Packit Service 75d76b
  VIO_READ_MODIFY_WRITE     = VIO_READ | VIO_WRITE,
Packit Service 75d76b
  VIO_READ_WRITE_MASK       = VIO_READ_MODIFY_WRITE,
Packit Service 75d76b
  VIO_FLUSH_BEFORE          = 4,
Packit Service 75d76b
  VIO_FLUSH_AFTER           = 8,
Packit Service 75d76b
} VIOOperation;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * VIO types for statistics and instrumentation.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef enum __attribute__((packed)) {
Packit Service 75d76b
  VIO_TYPE_UNINITIALIZED = 0,
Packit Service 75d76b
  VIO_TYPE_DATA,
Packit Service 75d76b
  VIO_TYPE_BLOCK_ALLOCATOR,
Packit Service 75d76b
  VIO_TYPE_BLOCK_MAP,
Packit Service 75d76b
  VIO_TYPE_BLOCK_MAP_INTERIOR,
Packit Service 75d76b
  VIO_TYPE_COMPRESSED_BLOCK,
Packit Service 75d76b
  VIO_TYPE_PARTITION_COPY,
Packit Service 75d76b
  VIO_TYPE_RECOVERY_JOURNAL,
Packit Service 75d76b
  VIO_TYPE_SLAB_JOURNAL,
Packit Service 75d76b
  VIO_TYPE_SLAB_SUMMARY,
Packit Service 75d76b
  VIO_TYPE_SUPER_BLOCK,
Packit Service 75d76b
  VIO_TYPE_TEST,
Packit Service 75d76b
} VIOType;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * The current operation on a physical block (from the point of view of the
Packit Service 75d76b
 * recovery journal, slab journals, and reference counts.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef enum __attribute__((packed)) {
Packit Service 75d76b
  DATA_DECREMENT      = 0,
Packit Service 75d76b
  DATA_INCREMENT      = 1,
Packit Service 75d76b
  BLOCK_MAP_DECREMENT = 2,
Packit Service 75d76b
  BLOCK_MAP_INCREMENT = 3,
Packit Service 75d76b
} JournalOperation;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Partition IDs are encoded in the volume layout in the super block.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef enum __attribute__((packed)) {
Packit Service 75d76b
  BLOCK_MAP_PARTITION        = 0,
Packit Service 75d76b
  BLOCK_ALLOCATOR_PARTITION  = 1,
Packit Service 75d76b
  RECOVERY_JOURNAL_PARTITION = 2,
Packit Service 75d76b
  SLAB_SUMMARY_PARTITION     = 3,
Packit Service 75d76b
} PartitionID;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Check whether a VIOType is for servicing an external data request.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param vioType  The VIOType to check
Packit Service 75d76b
 **/
Packit Service 75d76b
static inline bool isDataVIOType(VIOType vioType)
Packit Service 75d76b
{
Packit Service 75d76b
  return (vioType == VIO_TYPE_DATA);
Packit Service 75d76b
}
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Check whether a VIOType is for compressed block writes
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param vioType  The VIOType to check
Packit Service 75d76b
 **/
Packit Service 75d76b
static inline bool isCompressedWriteVIOType(VIOType vioType)
Packit Service 75d76b
{
Packit Service 75d76b
  return (vioType == VIO_TYPE_COMPRESSED_BLOCK);
Packit Service 75d76b
}
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Check whether a VIOType is for metadata
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param vioType  The VIOType to check
Packit Service 75d76b
 **/
Packit Service 75d76b
static inline bool isMetadataVIOType(VIOType vioType)
Packit Service 75d76b
{
Packit Service 75d76b
  return ((vioType != VIO_TYPE_UNINITIALIZED)
Packit Service 75d76b
          && !isDataVIOType(vioType)
Packit Service 75d76b
          && !isCompressedWriteVIOType(vioType));
Packit Service 75d76b
}
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Priority levels for asynchronous I/O operations performed on a VIO.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef enum __attribute__((packed)) vioPriority {
Packit Service 75d76b
  VIO_PRIORITY_LOW             = 0,
Packit Service 75d76b
  VIO_PRIORITY_DATA            = VIO_PRIORITY_LOW,
Packit Service 75d76b
  VIO_PRIORITY_COMPRESSED_DATA = VIO_PRIORITY_DATA,
Packit Service 75d76b
  VIO_PRIORITY_METADATA,
Packit Service 75d76b
  VIO_PRIORITY_HIGH,
Packit Service 75d76b
} VIOPriority;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Metadata types for the VDO.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef enum __attribute__((packed)) {
Packit Service 75d76b
  VDO_METADATA_RECOVERY_JOURNAL = 1,
Packit Service 75d76b
  VDO_METADATA_SLAB_JOURNAL,
Packit Service 75d76b
} VDOMetadataType;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * The possible write policy values.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef enum {
Packit Service 75d76b
  WRITE_POLICY_SYNC,           ///< All writes are synchronous, i. e., they
Packit Service 75d76b
                               ///< are acknowledged only when the data is
Packit Service 75d76b
                               ///< written to stable storage.
Packit Service 75d76b
  WRITE_POLICY_ASYNC,          ///< Writes are acknowledged when the data is
Packit Service 75d76b
                               ///< cached for writing to stable storage, subject
Packit Service 75d76b
                               ///< to resiliency guarantees specified elsewhere.
Packit Service 75d76b
			       ///< After a crash, the data will be either old or
Packit Service 75d76b
			       ///< new value for unflushed writes, never garbage.
Packit Service 75d76b
  WRITE_POLICY_ASYNC_UNSAFE,   ///< Writes are acknowledged when the data is
Packit Service 75d76b
                               ///< cached for writing to stable storage, subject
Packit Service 75d76b
                               ///< to resiliency guarantees specified elsewhere.
Packit Service 75d76b
  WRITE_POLICY_AUTO,           ///< The appropriate policy is chosen based on the
Packit Service 75d76b
                               ///< underlying device
Packit Service 75d76b
} WritePolicy;
Packit Service 75d76b
Packit Service 75d76b
typedef enum {
Packit Service 75d76b
  ZONE_TYPE_ADMIN,
Packit Service 75d76b
  ZONE_TYPE_JOURNAL,
Packit Service 75d76b
  ZONE_TYPE_LOGICAL,
Packit Service 75d76b
  ZONE_TYPE_PHYSICAL,
Packit Service 75d76b
} ZoneType;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A position in the block map where a block map entry is stored.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef struct {
Packit Service 75d76b
  PhysicalBlockNumber pbn;
Packit Service 75d76b
  SlotNumber          slot;
Packit Service 75d76b
} BlockMapSlot;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A position in the arboreal block map at a specific level.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef struct {
Packit Service 75d76b
  PageNumber   pageIndex;
Packit Service 75d76b
  BlockMapSlot blockMapSlot;
Packit Service 75d76b
} BlockMapTreeSlot;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * The configuration of a single slab derived from the configured block size
Packit Service 75d76b
 * and slab size.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef struct slabConfig {
Packit Service 75d76b
  BlockCount slabBlocks;             ///< total number of blocks in the slab
Packit Service 75d76b
  BlockCount dataBlocks;             ///< number of blocks available for data
Packit Service 75d76b
  BlockCount referenceCountBlocks;   ///< number of blocks for refCounts
Packit Service 75d76b
  BlockCount slabJournalBlocks;      ///< number of blocks for the slab journal
Packit Service 75d76b
  /**
Packit Service 75d76b
   * Number of blocks after which the slab journal starts pushing out a
Packit Service 75d76b
   * ReferenceBlock for each new entry it receives.
Packit Service 75d76b
   **/
Packit Service 75d76b
  BlockCount slabJournalFlushingThreshold;
Packit Service 75d76b
  /**
Packit Service 75d76b
   * Number of blocks after which the slab journal pushes out all
Packit Service 75d76b
   * ReferenceBlocks and makes all VIOs wait.
Packit Service 75d76b
   **/
Packit Service 75d76b
  BlockCount slabJournalBlockingThreshold;
Packit Service 75d76b
  /**
Packit Service 75d76b
   * Number of blocks after which the slab must be scrubbed before coming
Packit Service 75d76b
   * online.
Packit Service 75d76b
   **/
Packit Service 75d76b
  BlockCount slabJournalScrubbingThreshold;
Packit Service 75d76b
} __attribute__((packed)) SlabConfig;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * The configuration of the VDO service.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef struct vdoConfig {
Packit Service 75d76b
  BlockCount    logicalBlocks;       ///< number of logical blocks
Packit Service 75d76b
  BlockCount    physicalBlocks;      ///< number of physical blocks
Packit Service 75d76b
  BlockCount    slabSize;            ///< number of blocks in a slab
Packit Service 75d76b
  BlockCount    recoveryJournalSize; ///< number of recovery journal blocks
Packit Service 75d76b
  BlockCount    slabJournalBlocks;   ///< number of slab journal blocks
Packit Service 75d76b
} __attribute__((packed)) VDOConfig;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * The configuration parameters of the VDO service specified at load time.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef struct vdoLoadConfig {
Packit Service 75d76b
  /** the offset on the physical layer where the VDO begins */
Packit Service 75d76b
  PhysicalBlockNumber   firstBlockOffset;
Packit Service 75d76b
  /** the expected release version number of the VDO */
Packit Service 75d76b
  ReleaseVersionNumber  releaseVersion;
Packit Service 75d76b
  /** the expected nonce of the VDO */
Packit Service 75d76b
  Nonce                 nonce;
Packit Service 75d76b
  /** the thread configuration of the VDO */
Packit Service 75d76b
  ThreadConfig         *threadConfig;
Packit Service 75d76b
  /** the page cache size, in pages */
Packit Service 75d76b
  PageCount             cacheSize;
Packit Service 75d76b
  /** whether writes are synchronous */
Packit Service 75d76b
  WritePolicy           writePolicy;
Packit Service 75d76b
  /** the maximum age of a dirty block map page in recovery journal blocks */
Packit Service 75d76b
  BlockCount            maximumAge;
Packit Service 75d76b
} VDOLoadConfig;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Forward declarations of abstract types
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef struct actionManager       ActionManager;
Packit Service 75d76b
typedef struct allocatingVIO       AllocatingVIO;
Packit Service 75d76b
typedef struct allocationSelector  AllocationSelector;
Packit Service 75d76b
typedef struct blockAllocator      BlockAllocator;
Packit Service 75d76b
typedef struct blockMap            BlockMap;
Packit Service 75d76b
typedef struct blockMapTreeZone    BlockMapTreeZone;
Packit Service 75d76b
typedef struct blockMapZone        BlockMapZone;
Packit Service 75d76b
typedef struct dataVIO             DataVIO;
Packit Service 75d76b
typedef struct flusher             Flusher;
Packit Service 75d76b
typedef struct forest              Forest;
Packit Service 75d76b
typedef struct hashLock            HashLock;
Packit Service 75d76b
typedef struct hashZone            HashZone;
Packit Service 75d76b
typedef struct indexConfig         IndexConfig;
Packit Service 75d76b
typedef struct inputBin            InputBin;
Packit Service 75d76b
typedef struct lbnLock             LBNLock;
Packit Service 75d76b
typedef struct lockCounter         LockCounter;
Packit Service 75d76b
typedef struct logicalZone         LogicalZone;
Packit Service 75d76b
typedef struct logicalZones        LogicalZones;
Packit Service 75d76b
typedef struct pbnLock             PBNLock;
Packit Service 75d76b
typedef struct physicalLayer       PhysicalLayer;
Packit Service 75d76b
typedef struct physicalZone        PhysicalZone;
Packit Service 75d76b
typedef struct recoveryJournal     RecoveryJournal;
Packit Service 75d76b
typedef struct readOnlyNotifier    ReadOnlyNotifier;
Packit Service 75d76b
typedef struct refCounts           RefCounts;
Packit Service 75d76b
typedef struct vdoSlab             Slab;
Packit Service 75d76b
typedef struct slabDepot           SlabDepot;
Packit Service 75d76b
typedef struct slabJournal         SlabJournal;
Packit Service 75d76b
typedef struct slabJournalEntry    SlabJournalEntry;
Packit Service 75d76b
typedef struct slabScrubber        SlabScrubber;
Packit Service 75d76b
typedef struct slabSummary         SlabSummary;
Packit Service 75d76b
typedef struct slabSummaryZone     SlabSummaryZone;
Packit Service 75d76b
typedef struct vdo                 VDO;
Packit Service 75d76b
typedef struct vdoCompletion       VDOCompletion;
Packit Service 75d76b
typedef struct vdoExtent           VDOExtent;
Packit Service 75d76b
typedef struct vdoFlush            VDOFlush;
Packit Service 75d76b
typedef struct vdoLayout           VDOLayout;
Packit Service 75d76b
typedef struct vdoStatistics       VDOStatistics;
Packit Service 75d76b
typedef struct vio                 VIO;
Packit Service 75d76b
typedef struct vioPool             VIOPool;
Packit Service 75d76b
Packit Service 75d76b
typedef struct {
Packit Service 75d76b
  PhysicalBlockNumber pbn;
Packit Service 75d76b
  BlockMappingState   state;
Packit Service 75d76b
} DataLocation;
Packit Service 75d76b
Packit Service 75d76b
typedef struct {
Packit Service 75d76b
  PhysicalBlockNumber  pbn;
Packit Service 75d76b
  BlockMappingState    state;
Packit Service 75d76b
  PhysicalZone        *zone;
Packit Service 75d76b
} ZonedPBN;
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * Callback which will be called by the VDO when all of the VIOs in the
Packit Service 75d76b
 * extent have been processed.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param extent The extent which is complete
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef void VDOExtentCallback(VDOExtent *extent);
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * An asynchronous operation.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param vio The VIO on which to operate
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef void AsyncOperation(VIO *vio);
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * An asynchronous compressed write operation.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param allocatingVIO  The AllocatingVIO to write
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef void CompressedWriter(AllocatingVIO *allocatingVIO);
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * An asynchronous data operation.
Packit Service 75d76b
 *
Packit Service 75d76b
 * @param dataVIO  The DataVIO on which to operate
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef void AsyncDataOperation(DataVIO *dataVIO);
Packit Service 75d76b
Packit Service 75d76b
/**
Packit Service 75d76b
 * A reference to a completion which (the reference) can be enqueued
Packit Service 75d76b
 * for completion on a specified thread.
Packit Service 75d76b
 **/
Packit Service 75d76b
typedef struct enqueueable {
Packit Service 75d76b
  VDOCompletion *completion;
Packit Service 75d76b
} Enqueueable;
Packit Service 75d76b
Packit Service 75d76b
#endif // TYPES_H