1*94c4a1e1SFrank Piva /* 2*94c4a1e1SFrank Piva * Block driver for the QCOW version 2 format 3*94c4a1e1SFrank Piva * 4*94c4a1e1SFrank Piva * Copyright (c) 2004-2006 Fabrice Bellard 5*94c4a1e1SFrank Piva * 6*94c4a1e1SFrank Piva * Permission is hereby granted, free of charge, to any person obtaining a copy 7*94c4a1e1SFrank Piva * of this software and associated documentation files (the "Software"), to deal 8*94c4a1e1SFrank Piva * in the Software without restriction, including without limitation the rights 9*94c4a1e1SFrank Piva * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10*94c4a1e1SFrank Piva * copies of the Software, and to permit persons to whom the Software is 11*94c4a1e1SFrank Piva * furnished to do so, subject to the following conditions: 12*94c4a1e1SFrank Piva * 13*94c4a1e1SFrank Piva * The above copyright notice and this permission notice shall be included in 14*94c4a1e1SFrank Piva * all copies or substantial portions of the Software. 15*94c4a1e1SFrank Piva * 16*94c4a1e1SFrank Piva * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17*94c4a1e1SFrank Piva * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18*94c4a1e1SFrank Piva * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19*94c4a1e1SFrank Piva * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20*94c4a1e1SFrank Piva * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21*94c4a1e1SFrank Piva * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22*94c4a1e1SFrank Piva * THE SOFTWARE. 23*94c4a1e1SFrank Piva */ 24*94c4a1e1SFrank Piva 25*94c4a1e1SFrank Piva #ifndef BLOCK_QCOW2_H 26*94c4a1e1SFrank Piva #define BLOCK_QCOW2_H 27*94c4a1e1SFrank Piva 28*94c4a1e1SFrank Piva #ifdef __cplusplus 29*94c4a1e1SFrank Piva extern "C" { 30*94c4a1e1SFrank Piva #endif 31*94c4a1e1SFrank Piva 32*94c4a1e1SFrank Piva #include "qemu_dep.h" 33*94c4a1e1SFrank Piva 34*94c4a1e1SFrank Piva //#define DEBUG_ALLOC 35*94c4a1e1SFrank Piva //#define DEBUG_ALLOC2 36*94c4a1e1SFrank Piva //#define DEBUG_EXT 37*94c4a1e1SFrank Piva 38*94c4a1e1SFrank Piva #define QCOW_MAGIC (('Q' << 24) | ('F' << 16) | ('I' << 8) | 0xfb) 39*94c4a1e1SFrank Piva 40*94c4a1e1SFrank Piva #define QCOW_CRYPT_NONE 0 41*94c4a1e1SFrank Piva #define QCOW_CRYPT_AES 1 42*94c4a1e1SFrank Piva #define QCOW_CRYPT_LUKS 2 43*94c4a1e1SFrank Piva 44*94c4a1e1SFrank Piva #define QCOW_MAX_CRYPT_CLUSTERS 32 45*94c4a1e1SFrank Piva #define QCOW_MAX_SNAPSHOTS 65536 46*94c4a1e1SFrank Piva 47*94c4a1e1SFrank Piva /* Field widths in qcow2 mean normal cluster offsets cannot reach 48*94c4a1e1SFrank Piva * 64PB; depending on cluster size, compressed clusters can have a 49*94c4a1e1SFrank Piva * smaller limit (64PB for up to 16k clusters, then ramps down to 50*94c4a1e1SFrank Piva * 512TB for 2M clusters). */ 51*94c4a1e1SFrank Piva #define QCOW_MAX_CLUSTER_OFFSET ((1ULL << 56) - 1) 52*94c4a1e1SFrank Piva 53*94c4a1e1SFrank Piva /* 8 MB refcount table is enough for 2 PB images at 64k cluster size 54*94c4a1e1SFrank Piva * (128 GB for 512 byte clusters, 2 EB for 2 MB clusters) */ 55*94c4a1e1SFrank Piva #define QCOW_MAX_REFTABLE_SIZE (8 * MiB) 56*94c4a1e1SFrank Piva 57*94c4a1e1SFrank Piva /* 32 MB L1 table is enough for 2 PB images at 64k cluster size 58*94c4a1e1SFrank Piva * (128 GB for 512 byte clusters, 2 EB for 2 MB clusters) */ 59*94c4a1e1SFrank Piva #define QCOW_MAX_L1_SIZE (32 * MiB) 60*94c4a1e1SFrank Piva 61*94c4a1e1SFrank Piva /* Allow for an average of 1k per snapshot table entry, should be plenty of 62*94c4a1e1SFrank Piva * space for snapshot names and IDs */ 63*94c4a1e1SFrank Piva #define QCOW_MAX_SNAPSHOTS_SIZE (1024 * QCOW_MAX_SNAPSHOTS) 64*94c4a1e1SFrank Piva 65*94c4a1e1SFrank Piva /* Maximum amount of extra data per snapshot table entry to accept */ 66*94c4a1e1SFrank Piva #define QCOW_MAX_SNAPSHOT_EXTRA_DATA 1024 67*94c4a1e1SFrank Piva 68*94c4a1e1SFrank Piva /* Bitmap header extension constraints */ 69*94c4a1e1SFrank Piva #define QCOW2_MAX_BITMAPS 65535 70*94c4a1e1SFrank Piva #define QCOW2_MAX_BITMAP_DIRECTORY_SIZE (1024 * QCOW2_MAX_BITMAPS) 71*94c4a1e1SFrank Piva 72*94c4a1e1SFrank Piva /* indicate that the refcount of the referenced cluster is exactly one. */ 73*94c4a1e1SFrank Piva #define QCOW_OFLAG_COPIED (1ULL << 63) 74*94c4a1e1SFrank Piva /* indicate that the cluster is compressed (they never have the copied flag) */ 75*94c4a1e1SFrank Piva #define QCOW_OFLAG_COMPRESSED (1ULL << 62) 76*94c4a1e1SFrank Piva /* The cluster reads as all zeros */ 77*94c4a1e1SFrank Piva #define QCOW_OFLAG_ZERO (1ULL << 0) 78*94c4a1e1SFrank Piva 79*94c4a1e1SFrank Piva #define QCOW_EXTL2_SUBCLUSTERS_PER_CLUSTER 32 80*94c4a1e1SFrank Piva 81*94c4a1e1SFrank Piva /* The subcluster X [0..31] is allocated */ 82*94c4a1e1SFrank Piva #define QCOW_OFLAG_SUB_ALLOC(X) (1ULL << (X)) 83*94c4a1e1SFrank Piva /* The subcluster X [0..31] reads as zeroes */ 84*94c4a1e1SFrank Piva #define QCOW_OFLAG_SUB_ZERO(X) (QCOW_OFLAG_SUB_ALLOC(X) << 32) 85*94c4a1e1SFrank Piva /* Subclusters [X, Y) (0 <= X <= Y <= 32) are allocated */ 86*94c4a1e1SFrank Piva #define QCOW_OFLAG_SUB_ALLOC_RANGE(X, Y) \ 87*94c4a1e1SFrank Piva (QCOW_OFLAG_SUB_ALLOC(Y) - QCOW_OFLAG_SUB_ALLOC(X)) 88*94c4a1e1SFrank Piva /* Subclusters [X, Y) (0 <= X <= Y <= 32) read as zeroes */ 89*94c4a1e1SFrank Piva #define QCOW_OFLAG_SUB_ZERO_RANGE(X, Y) \ 90*94c4a1e1SFrank Piva (QCOW_OFLAG_SUB_ALLOC_RANGE(X, Y) << 32) 91*94c4a1e1SFrank Piva /* L2 entry bitmap with all allocation bits set */ 92*94c4a1e1SFrank Piva #define QCOW_L2_BITMAP_ALL_ALLOC (QCOW_OFLAG_SUB_ALLOC_RANGE(0, 32)) 93*94c4a1e1SFrank Piva /* L2 entry bitmap with all "read as zeroes" bits set */ 94*94c4a1e1SFrank Piva #define QCOW_L2_BITMAP_ALL_ZEROES (QCOW_OFLAG_SUB_ZERO_RANGE(0, 32)) 95*94c4a1e1SFrank Piva 96*94c4a1e1SFrank Piva /* Size of normal and extended L2 entries */ 97*94c4a1e1SFrank Piva #define L2E_SIZE_NORMAL (sizeof(uint64_t)) 98*94c4a1e1SFrank Piva #define L2E_SIZE_EXTENDED (sizeof(uint64_t) * 2) 99*94c4a1e1SFrank Piva 100*94c4a1e1SFrank Piva /* Size of L1 table entries */ 101*94c4a1e1SFrank Piva #define L1E_SIZE (sizeof(uint64_t)) 102*94c4a1e1SFrank Piva 103*94c4a1e1SFrank Piva /* Size of reftable entries */ 104*94c4a1e1SFrank Piva #define REFTABLE_ENTRY_SIZE (sizeof(uint64_t)) 105*94c4a1e1SFrank Piva 106*94c4a1e1SFrank Piva #define MIN_CLUSTER_BITS 9 107*94c4a1e1SFrank Piva #define MAX_CLUSTER_BITS 21 108*94c4a1e1SFrank Piva 109*94c4a1e1SFrank Piva /* Defined in the qcow2 spec (compressed cluster descriptor) */ 110*94c4a1e1SFrank Piva #define QCOW2_COMPRESSED_SECTOR_SIZE 512U 111*94c4a1e1SFrank Piva 112*94c4a1e1SFrank Piva /* Must be at least 2 to cover COW */ 113*94c4a1e1SFrank Piva #define MIN_L2_CACHE_SIZE 2 /* cache entries */ 114*94c4a1e1SFrank Piva 115*94c4a1e1SFrank Piva /* Must be at least 4 to cover all cases of refcount table growth */ 116*94c4a1e1SFrank Piva #define MIN_REFCOUNT_CACHE_SIZE 4 /* clusters */ 117*94c4a1e1SFrank Piva 118*94c4a1e1SFrank Piva #define DEFAULT_L2_CACHE_MAX_SIZE (32 * MiB) 119*94c4a1e1SFrank Piva #define DEFAULT_CACHE_CLEAN_INTERVAL 600 /* seconds */ 120*94c4a1e1SFrank Piva 121*94c4a1e1SFrank Piva #define DEFAULT_CLUSTER_SIZE 65536 122*94c4a1e1SFrank Piva 123*94c4a1e1SFrank Piva #define QCOW2_OPT_DATA_FILE "data-file" 124*94c4a1e1SFrank Piva #define QCOW2_OPT_LAZY_REFCOUNTS "lazy-refcounts" 125*94c4a1e1SFrank Piva #define QCOW2_OPT_DISCARD_REQUEST "pass-discard-request" 126*94c4a1e1SFrank Piva #define QCOW2_OPT_DISCARD_SNAPSHOT "pass-discard-snapshot" 127*94c4a1e1SFrank Piva #define QCOW2_OPT_DISCARD_OTHER "pass-discard-other" 128*94c4a1e1SFrank Piva #define QCOW2_OPT_OVERLAP "overlap-check" 129*94c4a1e1SFrank Piva #define QCOW2_OPT_OVERLAP_TEMPLATE "overlap-check.template" 130*94c4a1e1SFrank Piva #define QCOW2_OPT_OVERLAP_MAIN_HEADER "overlap-check.main-header" 131*94c4a1e1SFrank Piva #define QCOW2_OPT_OVERLAP_ACTIVE_L1 "overlap-check.active-l1" 132*94c4a1e1SFrank Piva #define QCOW2_OPT_OVERLAP_ACTIVE_L2 "overlap-check.active-l2" 133*94c4a1e1SFrank Piva #define QCOW2_OPT_OVERLAP_REFCOUNT_TABLE "overlap-check.refcount-table" 134*94c4a1e1SFrank Piva #define QCOW2_OPT_OVERLAP_REFCOUNT_BLOCK "overlap-check.refcount-block" 135*94c4a1e1SFrank Piva #define QCOW2_OPT_OVERLAP_SNAPSHOT_TABLE "overlap-check.snapshot-table" 136*94c4a1e1SFrank Piva #define QCOW2_OPT_OVERLAP_INACTIVE_L1 "overlap-check.inactive-l1" 137*94c4a1e1SFrank Piva #define QCOW2_OPT_OVERLAP_INACTIVE_L2 "overlap-check.inactive-l2" 138*94c4a1e1SFrank Piva #define QCOW2_OPT_OVERLAP_BITMAP_DIRECTORY "overlap-check.bitmap-directory" 139*94c4a1e1SFrank Piva #define QCOW2_OPT_CACHE_SIZE "cache-size" 140*94c4a1e1SFrank Piva #define QCOW2_OPT_L2_CACHE_SIZE "l2-cache-size" 141*94c4a1e1SFrank Piva #define QCOW2_OPT_L2_CACHE_ENTRY_SIZE "l2-cache-entry-size" 142*94c4a1e1SFrank Piva #define QCOW2_OPT_REFCOUNT_CACHE_SIZE "refcount-cache-size" 143*94c4a1e1SFrank Piva #define QCOW2_OPT_CACHE_CLEAN_INTERVAL "cache-clean-interval" 144*94c4a1e1SFrank Piva 145*94c4a1e1SFrank Piva typedef struct QCowHeader { 146*94c4a1e1SFrank Piva uint32_t magic; 147*94c4a1e1SFrank Piva uint32_t version; 148*94c4a1e1SFrank Piva uint64_t backing_file_offset; 149*94c4a1e1SFrank Piva uint32_t backing_file_size; 150*94c4a1e1SFrank Piva uint32_t cluster_bits; 151*94c4a1e1SFrank Piva uint64_t size; /* in bytes */ 152*94c4a1e1SFrank Piva uint32_t crypt_method; 153*94c4a1e1SFrank Piva uint32_t l1_size; /* XXX: save number of clusters instead ? */ 154*94c4a1e1SFrank Piva uint64_t l1_table_offset; 155*94c4a1e1SFrank Piva uint64_t refcount_table_offset; 156*94c4a1e1SFrank Piva uint32_t refcount_table_clusters; 157*94c4a1e1SFrank Piva uint32_t nb_snapshots; 158*94c4a1e1SFrank Piva uint64_t snapshots_offset; 159*94c4a1e1SFrank Piva 160*94c4a1e1SFrank Piva /* The following fields are only valid for version >= 3 */ 161*94c4a1e1SFrank Piva uint64_t incompatible_features; 162*94c4a1e1SFrank Piva uint64_t compatible_features; 163*94c4a1e1SFrank Piva uint64_t autoclear_features; 164*94c4a1e1SFrank Piva 165*94c4a1e1SFrank Piva uint32_t refcount_order; 166*94c4a1e1SFrank Piva uint32_t header_length; 167*94c4a1e1SFrank Piva 168*94c4a1e1SFrank Piva /* Additional fields */ 169*94c4a1e1SFrank Piva uint8_t compression_type; 170*94c4a1e1SFrank Piva 171*94c4a1e1SFrank Piva /* header must be a multiple of 8 */ 172*94c4a1e1SFrank Piva uint8_t padding[7]; 173*94c4a1e1SFrank Piva } QEMU_PACKED QCowHeader; 174*94c4a1e1SFrank Piva 175*94c4a1e1SFrank Piva //QEMU_BUILD_BUG_ON(!QEMU_IS_ALIGNED(sizeof(QCowHeader), 8)); 176*94c4a1e1SFrank Piva 177*94c4a1e1SFrank Piva typedef struct QEMU_PACKED QCowSnapshotHeader { 178*94c4a1e1SFrank Piva /* header is 8 byte aligned */ 179*94c4a1e1SFrank Piva uint64_t l1_table_offset; 180*94c4a1e1SFrank Piva 181*94c4a1e1SFrank Piva uint32_t l1_size; 182*94c4a1e1SFrank Piva uint16_t id_str_size; 183*94c4a1e1SFrank Piva uint16_t name_size; 184*94c4a1e1SFrank Piva 185*94c4a1e1SFrank Piva uint32_t date_sec; 186*94c4a1e1SFrank Piva uint32_t date_nsec; 187*94c4a1e1SFrank Piva 188*94c4a1e1SFrank Piva uint64_t vm_clock_nsec; 189*94c4a1e1SFrank Piva 190*94c4a1e1SFrank Piva uint32_t vm_state_size; 191*94c4a1e1SFrank Piva uint32_t extra_data_size; /* for extension */ 192*94c4a1e1SFrank Piva /* extra data follows */ 193*94c4a1e1SFrank Piva /* id_str follows */ 194*94c4a1e1SFrank Piva /* name follows */ 195*94c4a1e1SFrank Piva } QCowSnapshotHeader; 196*94c4a1e1SFrank Piva 197*94c4a1e1SFrank Piva typedef struct QEMU_PACKED QCowSnapshotExtraData { 198*94c4a1e1SFrank Piva uint64_t vm_state_size_large; 199*94c4a1e1SFrank Piva uint64_t disk_size; 200*94c4a1e1SFrank Piva uint64_t icount; 201*94c4a1e1SFrank Piva } QCowSnapshotExtraData; 202*94c4a1e1SFrank Piva 203*94c4a1e1SFrank Piva 204*94c4a1e1SFrank Piva typedef struct Qcow2CryptoHeaderExtension { 205*94c4a1e1SFrank Piva uint64_t offset; 206*94c4a1e1SFrank Piva uint64_t length; 207*94c4a1e1SFrank Piva } QEMU_PACKED Qcow2CryptoHeaderExtension; 208*94c4a1e1SFrank Piva 209*94c4a1e1SFrank Piva enum { 210*94c4a1e1SFrank Piva QCOW2_FEAT_TYPE_INCOMPATIBLE = 0, 211*94c4a1e1SFrank Piva QCOW2_FEAT_TYPE_COMPATIBLE = 1, 212*94c4a1e1SFrank Piva QCOW2_FEAT_TYPE_AUTOCLEAR = 2, 213*94c4a1e1SFrank Piva }; 214*94c4a1e1SFrank Piva 215*94c4a1e1SFrank Piva /* Incompatible feature bits */ 216*94c4a1e1SFrank Piva enum { 217*94c4a1e1SFrank Piva QCOW2_INCOMPAT_DIRTY_BITNR = 0, 218*94c4a1e1SFrank Piva QCOW2_INCOMPAT_CORRUPT_BITNR = 1, 219*94c4a1e1SFrank Piva QCOW2_INCOMPAT_DATA_FILE_BITNR = 2, 220*94c4a1e1SFrank Piva QCOW2_INCOMPAT_COMPRESSION_BITNR = 3, 221*94c4a1e1SFrank Piva QCOW2_INCOMPAT_EXTL2_BITNR = 4, 222*94c4a1e1SFrank Piva QCOW2_INCOMPAT_DIRTY = 1 << QCOW2_INCOMPAT_DIRTY_BITNR, 223*94c4a1e1SFrank Piva QCOW2_INCOMPAT_CORRUPT = 1 << QCOW2_INCOMPAT_CORRUPT_BITNR, 224*94c4a1e1SFrank Piva QCOW2_INCOMPAT_DATA_FILE = 1 << QCOW2_INCOMPAT_DATA_FILE_BITNR, 225*94c4a1e1SFrank Piva QCOW2_INCOMPAT_COMPRESSION = 1 << QCOW2_INCOMPAT_COMPRESSION_BITNR, 226*94c4a1e1SFrank Piva QCOW2_INCOMPAT_EXTL2 = 1 << QCOW2_INCOMPAT_EXTL2_BITNR, 227*94c4a1e1SFrank Piva 228*94c4a1e1SFrank Piva QCOW2_INCOMPAT_MASK = QCOW2_INCOMPAT_DIRTY 229*94c4a1e1SFrank Piva | QCOW2_INCOMPAT_CORRUPT 230*94c4a1e1SFrank Piva | QCOW2_INCOMPAT_DATA_FILE 231*94c4a1e1SFrank Piva | QCOW2_INCOMPAT_COMPRESSION 232*94c4a1e1SFrank Piva | QCOW2_INCOMPAT_EXTL2, 233*94c4a1e1SFrank Piva }; 234*94c4a1e1SFrank Piva 235*94c4a1e1SFrank Piva /* Compatible feature bits */ 236*94c4a1e1SFrank Piva enum { 237*94c4a1e1SFrank Piva QCOW2_COMPAT_LAZY_REFCOUNTS_BITNR = 0, 238*94c4a1e1SFrank Piva QCOW2_COMPAT_LAZY_REFCOUNTS = 1 << QCOW2_COMPAT_LAZY_REFCOUNTS_BITNR, 239*94c4a1e1SFrank Piva 240*94c4a1e1SFrank Piva QCOW2_COMPAT_FEAT_MASK = QCOW2_COMPAT_LAZY_REFCOUNTS, 241*94c4a1e1SFrank Piva }; 242*94c4a1e1SFrank Piva 243*94c4a1e1SFrank Piva /* Autoclear feature bits */ 244*94c4a1e1SFrank Piva enum { 245*94c4a1e1SFrank Piva QCOW2_AUTOCLEAR_BITMAPS_BITNR = 0, 246*94c4a1e1SFrank Piva QCOW2_AUTOCLEAR_DATA_FILE_RAW_BITNR = 1, 247*94c4a1e1SFrank Piva QCOW2_AUTOCLEAR_BITMAPS = 1 << QCOW2_AUTOCLEAR_BITMAPS_BITNR, 248*94c4a1e1SFrank Piva QCOW2_AUTOCLEAR_DATA_FILE_RAW = 1 << QCOW2_AUTOCLEAR_DATA_FILE_RAW_BITNR, 249*94c4a1e1SFrank Piva 250*94c4a1e1SFrank Piva QCOW2_AUTOCLEAR_MASK = QCOW2_AUTOCLEAR_BITMAPS 251*94c4a1e1SFrank Piva | QCOW2_AUTOCLEAR_DATA_FILE_RAW, 252*94c4a1e1SFrank Piva }; 253*94c4a1e1SFrank Piva 254*94c4a1e1SFrank Piva enum qcow2_discard_type { 255*94c4a1e1SFrank Piva QCOW2_DISCARD_NEVER = 0, 256*94c4a1e1SFrank Piva QCOW2_DISCARD_ALWAYS, 257*94c4a1e1SFrank Piva QCOW2_DISCARD_REQUEST, 258*94c4a1e1SFrank Piva QCOW2_DISCARD_SNAPSHOT, 259*94c4a1e1SFrank Piva QCOW2_DISCARD_OTHER, 260*94c4a1e1SFrank Piva QCOW2_DISCARD_MAX 261*94c4a1e1SFrank Piva }; 262*94c4a1e1SFrank Piva 263*94c4a1e1SFrank Piva typedef struct Qcow2Feature { 264*94c4a1e1SFrank Piva uint8_t type; 265*94c4a1e1SFrank Piva uint8_t bit; 266*94c4a1e1SFrank Piva char name[46]; 267*94c4a1e1SFrank Piva } QEMU_PACKED Qcow2Feature; 268*94c4a1e1SFrank Piva 269*94c4a1e1SFrank Piva 270*94c4a1e1SFrank Piva typedef struct Qcow2BitmapHeaderExt { 271*94c4a1e1SFrank Piva uint32_t nb_bitmaps; 272*94c4a1e1SFrank Piva uint32_t reserved32; 273*94c4a1e1SFrank Piva uint64_t bitmap_directory_size; 274*94c4a1e1SFrank Piva uint64_t bitmap_directory_offset; 275*94c4a1e1SFrank Piva } QEMU_PACKED Qcow2BitmapHeaderExt; 276*94c4a1e1SFrank Piva 277*94c4a1e1SFrank Piva 278*94c4a1e1SFrank Piva /* 279*94c4a1e1SFrank Piva * In images with standard L2 entries all clusters are treated as if 280*94c4a1e1SFrank Piva * they had one subcluster so QCow2ClusterType and QCow2SubclusterType 281*94c4a1e1SFrank Piva * can be mapped to each other and have the exact same meaning 282*94c4a1e1SFrank Piva * (QCOW2_SUBCLUSTER_UNALLOCATED_ALLOC cannot happen in these images). 283*94c4a1e1SFrank Piva * 284*94c4a1e1SFrank Piva * In images with extended L2 entries QCow2ClusterType refers to the 285*94c4a1e1SFrank Piva * complete cluster and QCow2SubclusterType to each of the individual 286*94c4a1e1SFrank Piva * subclusters, so there are several possible combinations: 287*94c4a1e1SFrank Piva * 288*94c4a1e1SFrank Piva * |--------------+---------------------------| 289*94c4a1e1SFrank Piva * | Cluster type | Possible subcluster types | 290*94c4a1e1SFrank Piva * |--------------+---------------------------| 291*94c4a1e1SFrank Piva * | UNALLOCATED | UNALLOCATED_PLAIN | 292*94c4a1e1SFrank Piva * | | ZERO_PLAIN | 293*94c4a1e1SFrank Piva * |--------------+---------------------------| 294*94c4a1e1SFrank Piva * | NORMAL | UNALLOCATED_ALLOC | 295*94c4a1e1SFrank Piva * | | ZERO_ALLOC | 296*94c4a1e1SFrank Piva * | | NORMAL | 297*94c4a1e1SFrank Piva * |--------------+---------------------------| 298*94c4a1e1SFrank Piva * | COMPRESSED | COMPRESSED | 299*94c4a1e1SFrank Piva * |--------------+---------------------------| 300*94c4a1e1SFrank Piva * 301*94c4a1e1SFrank Piva * QCOW2_SUBCLUSTER_INVALID means that the L2 entry is incorrect and 302*94c4a1e1SFrank Piva * the image should be marked corrupt. 303*94c4a1e1SFrank Piva */ 304*94c4a1e1SFrank Piva 305*94c4a1e1SFrank Piva typedef enum QCow2ClusterType { 306*94c4a1e1SFrank Piva QCOW2_CLUSTER_UNALLOCATED, 307*94c4a1e1SFrank Piva QCOW2_CLUSTER_ZERO_PLAIN, 308*94c4a1e1SFrank Piva QCOW2_CLUSTER_ZERO_ALLOC, 309*94c4a1e1SFrank Piva QCOW2_CLUSTER_NORMAL, 310*94c4a1e1SFrank Piva QCOW2_CLUSTER_COMPRESSED, 311*94c4a1e1SFrank Piva } QCow2ClusterType; 312*94c4a1e1SFrank Piva 313*94c4a1e1SFrank Piva typedef enum QCow2SubclusterType { 314*94c4a1e1SFrank Piva QCOW2_SUBCLUSTER_UNALLOCATED_PLAIN, 315*94c4a1e1SFrank Piva QCOW2_SUBCLUSTER_UNALLOCATED_ALLOC, 316*94c4a1e1SFrank Piva QCOW2_SUBCLUSTER_ZERO_PLAIN, 317*94c4a1e1SFrank Piva QCOW2_SUBCLUSTER_ZERO_ALLOC, 318*94c4a1e1SFrank Piva QCOW2_SUBCLUSTER_NORMAL, 319*94c4a1e1SFrank Piva QCOW2_SUBCLUSTER_COMPRESSED, 320*94c4a1e1SFrank Piva QCOW2_SUBCLUSTER_INVALID, 321*94c4a1e1SFrank Piva } QCow2SubclusterType; 322*94c4a1e1SFrank Piva 323*94c4a1e1SFrank Piva typedef enum QCow2MetadataOverlap { 324*94c4a1e1SFrank Piva QCOW2_OL_MAIN_HEADER_BITNR = 0, 325*94c4a1e1SFrank Piva QCOW2_OL_ACTIVE_L1_BITNR = 1, 326*94c4a1e1SFrank Piva QCOW2_OL_ACTIVE_L2_BITNR = 2, 327*94c4a1e1SFrank Piva QCOW2_OL_REFCOUNT_TABLE_BITNR = 3, 328*94c4a1e1SFrank Piva QCOW2_OL_REFCOUNT_BLOCK_BITNR = 4, 329*94c4a1e1SFrank Piva QCOW2_OL_SNAPSHOT_TABLE_BITNR = 5, 330*94c4a1e1SFrank Piva QCOW2_OL_INACTIVE_L1_BITNR = 6, 331*94c4a1e1SFrank Piva QCOW2_OL_INACTIVE_L2_BITNR = 7, 332*94c4a1e1SFrank Piva QCOW2_OL_BITMAP_DIRECTORY_BITNR = 8, 333*94c4a1e1SFrank Piva 334*94c4a1e1SFrank Piva QCOW2_OL_MAX_BITNR = 9, 335*94c4a1e1SFrank Piva 336*94c4a1e1SFrank Piva QCOW2_OL_NONE = 0, 337*94c4a1e1SFrank Piva QCOW2_OL_MAIN_HEADER = (1 << QCOW2_OL_MAIN_HEADER_BITNR), 338*94c4a1e1SFrank Piva QCOW2_OL_ACTIVE_L1 = (1 << QCOW2_OL_ACTIVE_L1_BITNR), 339*94c4a1e1SFrank Piva QCOW2_OL_ACTIVE_L2 = (1 << QCOW2_OL_ACTIVE_L2_BITNR), 340*94c4a1e1SFrank Piva QCOW2_OL_REFCOUNT_TABLE = (1 << QCOW2_OL_REFCOUNT_TABLE_BITNR), 341*94c4a1e1SFrank Piva QCOW2_OL_REFCOUNT_BLOCK = (1 << QCOW2_OL_REFCOUNT_BLOCK_BITNR), 342*94c4a1e1SFrank Piva QCOW2_OL_SNAPSHOT_TABLE = (1 << QCOW2_OL_SNAPSHOT_TABLE_BITNR), 343*94c4a1e1SFrank Piva QCOW2_OL_INACTIVE_L1 = (1 << QCOW2_OL_INACTIVE_L1_BITNR), 344*94c4a1e1SFrank Piva /* NOTE: Checking overlaps with inactive L2 tables will result in bdrv 345*94c4a1e1SFrank Piva * reads. */ 346*94c4a1e1SFrank Piva QCOW2_OL_INACTIVE_L2 = (1 << QCOW2_OL_INACTIVE_L2_BITNR), 347*94c4a1e1SFrank Piva QCOW2_OL_BITMAP_DIRECTORY = (1 << QCOW2_OL_BITMAP_DIRECTORY_BITNR), 348*94c4a1e1SFrank Piva } QCow2MetadataOverlap; 349*94c4a1e1SFrank Piva 350*94c4a1e1SFrank Piva /* Perform all overlap checks which can be done in constant time */ 351*94c4a1e1SFrank Piva #define QCOW2_OL_CONSTANT \ 352*94c4a1e1SFrank Piva (QCOW2_OL_MAIN_HEADER | QCOW2_OL_ACTIVE_L1 | QCOW2_OL_REFCOUNT_TABLE | \ 353*94c4a1e1SFrank Piva QCOW2_OL_SNAPSHOT_TABLE | QCOW2_OL_BITMAP_DIRECTORY) 354*94c4a1e1SFrank Piva 355*94c4a1e1SFrank Piva /* Perform all overlap checks which don't require disk access */ 356*94c4a1e1SFrank Piva #define QCOW2_OL_CACHED \ 357*94c4a1e1SFrank Piva (QCOW2_OL_CONSTANT | QCOW2_OL_ACTIVE_L2 | QCOW2_OL_REFCOUNT_BLOCK | \ 358*94c4a1e1SFrank Piva QCOW2_OL_INACTIVE_L1) 359*94c4a1e1SFrank Piva 360*94c4a1e1SFrank Piva /* Perform all overlap checks */ 361*94c4a1e1SFrank Piva #define QCOW2_OL_ALL \ 362*94c4a1e1SFrank Piva (QCOW2_OL_CACHED | QCOW2_OL_INACTIVE_L2) 363*94c4a1e1SFrank Piva 364*94c4a1e1SFrank Piva #define L1E_OFFSET_MASK 0x00fffffffffffe00ULL 365*94c4a1e1SFrank Piva #define L1E_RESERVED_MASK 0x7f000000000001ffULL 366*94c4a1e1SFrank Piva #define L2E_OFFSET_MASK 0x00fffffffffffe00ULL 367*94c4a1e1SFrank Piva #define L2E_STD_RESERVED_MASK 0x3f000000000001feULL 368*94c4a1e1SFrank Piva 369*94c4a1e1SFrank Piva #define REFT_OFFSET_MASK 0xfffffffffffffe00ULL 370*94c4a1e1SFrank Piva #define REFT_RESERVED_MASK 0x1ffULL 371*94c4a1e1SFrank Piva 372*94c4a1e1SFrank Piva #define INV_OFFSET (-1ULL) 373*94c4a1e1SFrank Piva 374*94c4a1e1SFrank Piva #ifdef __cplusplus 375*94c4a1e1SFrank Piva } 376*94c4a1e1SFrank Piva #endif 377*94c4a1e1SFrank Piva 378*94c4a1e1SFrank Piva #endif 379