xref: /aosp_15_r20/external/ublksrv/qcow2/qcow2_format.h (revision 94c4a1e103eb1715230460aab379dff275992c20)
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