]> git.proxmox.com Git - qemu.git/blame - block/qcow2.h
e1000/rtl8139: update HMP NIC when every bit is written
[qemu.git] / block / qcow2.h
CommitLineData
f7d0fe02
KW
1/*
2 * Block driver for the QCOW version 2 format
3 *
4 * Copyright (c) 2004-2006 Fabrice Bellard
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24
25#ifndef BLOCK_QCOW2_H
26#define BLOCK_QCOW2_H
27
753d9b82 28#include "qemu/aes.h"
737e150e 29#include "block/coroutine.h"
f7d0fe02 30
14899cdf
FN
31//#define DEBUG_ALLOC
32//#define DEBUG_ALLOC2
33//#define DEBUG_EXT
34
f7d0fe02 35#define QCOW_MAGIC (('Q' << 24) | ('F' << 16) | ('I' << 8) | 0xfb)
f7d0fe02
KW
36
37#define QCOW_CRYPT_NONE 0
38#define QCOW_CRYPT_AES 1
39
40#define QCOW_MAX_CRYPT_CLUSTERS 32
41
42/* indicate that the refcount of the referenced cluster is exactly one. */
127c84e1 43#define QCOW_OFLAG_COPIED (1ULL << 63)
f7d0fe02 44/* indicate that the cluster is compressed (they never have the copied flag) */
127c84e1 45#define QCOW_OFLAG_COMPRESSED (1ULL << 62)
6377af48 46/* The cluster reads as all zeros */
127c84e1 47#define QCOW_OFLAG_ZERO (1ULL << 0)
f7d0fe02
KW
48
49#define REFCOUNT_SHIFT 1 /* refcount size is 2 bytes */
50
51#define MIN_CLUSTER_BITS 9
80ee15a6 52#define MAX_CLUSTER_BITS 21
f7d0fe02
KW
53
54#define L2_CACHE_SIZE 16
55
29c1a730
KW
56/* Must be at least 4 to cover all cases of refcount table growth */
57#define REFCOUNT_CACHE_SIZE 4
58
99cce9fa
KW
59#define DEFAULT_CLUSTER_SIZE 65536
60
acdfb480 61
64aa99d3
KW
62#define QCOW2_OPT_LAZY_REFCOUNTS "lazy-refcounts"
63#define QCOW2_OPT_DISCARD_REQUEST "pass-discard-request"
64#define QCOW2_OPT_DISCARD_SNAPSHOT "pass-discard-snapshot"
65#define QCOW2_OPT_DISCARD_OTHER "pass-discard-other"
05de7e86
MR
66#define QCOW2_OPT_OVERLAP "overlap-check"
67#define QCOW2_OPT_OVERLAP_MAIN_HEADER "overlap-check.main-header"
68#define QCOW2_OPT_OVERLAP_ACTIVE_L1 "overlap-check.active-l1"
69#define QCOW2_OPT_OVERLAP_ACTIVE_L2 "overlap-check.active-l2"
70#define QCOW2_OPT_OVERLAP_REFCOUNT_TABLE "overlap-check.refcount-table"
71#define QCOW2_OPT_OVERLAP_REFCOUNT_BLOCK "overlap-check.refcount-block"
72#define QCOW2_OPT_OVERLAP_SNAPSHOT_TABLE "overlap-check.snapshot-table"
73#define QCOW2_OPT_OVERLAP_INACTIVE_L1 "overlap-check.inactive-l1"
74#define QCOW2_OPT_OVERLAP_INACTIVE_L2 "overlap-check.inactive-l2"
acdfb480 75
f7d0fe02
KW
76typedef struct QCowHeader {
77 uint32_t magic;
78 uint32_t version;
79 uint64_t backing_file_offset;
80 uint32_t backing_file_size;
81 uint32_t cluster_bits;
82 uint64_t size; /* in bytes */
83 uint32_t crypt_method;
84 uint32_t l1_size; /* XXX: save number of clusters instead ? */
85 uint64_t l1_table_offset;
86 uint64_t refcount_table_offset;
87 uint32_t refcount_table_clusters;
88 uint32_t nb_snapshots;
89 uint64_t snapshots_offset;
6744cbab
KW
90
91 /* The following fields are only valid for version >= 3 */
92 uint64_t incompatible_features;
93 uint64_t compatible_features;
94 uint64_t autoclear_features;
95
96 uint32_t refcount_order;
97 uint32_t header_length;
c4217f64 98} QEMU_PACKED QCowHeader;
f7d0fe02
KW
99
100typedef struct QCowSnapshot {
101 uint64_t l1_table_offset;
102 uint32_t l1_size;
103 char *id_str;
104 char *name;
90b27759 105 uint64_t disk_size;
c2c9a466 106 uint64_t vm_state_size;
f7d0fe02
KW
107 uint32_t date_sec;
108 uint32_t date_nsec;
109 uint64_t vm_clock_nsec;
110} QCowSnapshot;
111
49381094
KW
112struct Qcow2Cache;
113typedef struct Qcow2Cache Qcow2Cache;
114
75bab85c
KW
115typedef struct Qcow2UnknownHeaderExtension {
116 uint32_t magic;
117 uint32_t len;
118 QLIST_ENTRY(Qcow2UnknownHeaderExtension) next;
119 uint8_t data[];
120} Qcow2UnknownHeaderExtension;
121
cfcc4c62
KW
122enum {
123 QCOW2_FEAT_TYPE_INCOMPATIBLE = 0,
124 QCOW2_FEAT_TYPE_COMPATIBLE = 1,
125 QCOW2_FEAT_TYPE_AUTOCLEAR = 2,
126};
127
c61d0004
SH
128/* Incompatible feature bits */
129enum {
130 QCOW2_INCOMPAT_DIRTY_BITNR = 0,
69c98726 131 QCOW2_INCOMPAT_CORRUPT_BITNR = 1,
c61d0004 132 QCOW2_INCOMPAT_DIRTY = 1 << QCOW2_INCOMPAT_DIRTY_BITNR,
69c98726 133 QCOW2_INCOMPAT_CORRUPT = 1 << QCOW2_INCOMPAT_CORRUPT_BITNR,
c61d0004 134
69c98726
MR
135 QCOW2_INCOMPAT_MASK = QCOW2_INCOMPAT_DIRTY
136 | QCOW2_INCOMPAT_CORRUPT,
c61d0004
SH
137};
138
bfe8043e
SH
139/* Compatible feature bits */
140enum {
141 QCOW2_COMPAT_LAZY_REFCOUNTS_BITNR = 0,
142 QCOW2_COMPAT_LAZY_REFCOUNTS = 1 << QCOW2_COMPAT_LAZY_REFCOUNTS_BITNR,
143
144 QCOW2_COMPAT_FEAT_MASK = QCOW2_COMPAT_LAZY_REFCOUNTS,
145};
146
6cfcb9b8
KW
147enum qcow2_discard_type {
148 QCOW2_DISCARD_NEVER = 0,
149 QCOW2_DISCARD_ALWAYS,
150 QCOW2_DISCARD_REQUEST,
151 QCOW2_DISCARD_SNAPSHOT,
152 QCOW2_DISCARD_OTHER,
153 QCOW2_DISCARD_MAX
154};
155
cfcc4c62
KW
156typedef struct Qcow2Feature {
157 uint8_t type;
158 uint8_t bit;
159 char name[46];
160} QEMU_PACKED Qcow2Feature;
161
0b919fae
KW
162typedef struct Qcow2DiscardRegion {
163 BlockDriverState *bs;
164 uint64_t offset;
165 uint64_t bytes;
166 QTAILQ_ENTRY(Qcow2DiscardRegion) next;
167} Qcow2DiscardRegion;
168
f7d0fe02 169typedef struct BDRVQcowState {
f7d0fe02
KW
170 int cluster_bits;
171 int cluster_size;
172 int cluster_sectors;
173 int l2_bits;
174 int l2_size;
175 int l1_size;
176 int l1_vm_state_index;
177 int csize_shift;
178 int csize_mask;
179 uint64_t cluster_offset_mask;
180 uint64_t l1_table_offset;
181 uint64_t *l1_table;
29c1a730
KW
182
183 Qcow2Cache* l2_table_cache;
184 Qcow2Cache* refcount_block_cache;
185
f7d0fe02
KW
186 uint8_t *cluster_cache;
187 uint8_t *cluster_data;
188 uint64_t cluster_cache_offset;
72cf2d4f 189 QLIST_HEAD(QCowClusterAlloc, QCowL2Meta) cluster_allocs;
f7d0fe02
KW
190
191 uint64_t *refcount_table;
192 uint64_t refcount_table_offset;
193 uint32_t refcount_table_size;
f7d0fe02
KW
194 int64_t free_cluster_index;
195 int64_t free_byte_offset;
196
68d100e9
KW
197 CoMutex lock;
198
f7d0fe02
KW
199 uint32_t crypt_method; /* current crypt method, 0 if no key yet */
200 uint32_t crypt_method_header;
201 AES_KEY aes_encrypt_key;
202 AES_KEY aes_decrypt_key;
203 uint64_t snapshots_offset;
204 int snapshots_size;
205 int nb_snapshots;
206 QCowSnapshot *snapshots;
06d9260f
AL
207
208 int flags;
6744cbab 209 int qcow_version;
74c4510a 210 bool use_lazy_refcounts;
b6481f37 211 int refcount_order;
6744cbab 212
67af674e
KW
213 bool discard_passthrough[QCOW2_DISCARD_MAX];
214
3e355390
MR
215 int overlap_check; /* bitmask of Qcow2MetadataOverlap values */
216
6744cbab
KW
217 uint64_t incompatible_features;
218 uint64_t compatible_features;
219 uint64_t autoclear_features;
220
221 size_t unknown_header_fields_size;
222 void* unknown_header_fields;
75bab85c 223 QLIST_HEAD(, Qcow2UnknownHeaderExtension) unknown_header_ext;
0b919fae
KW
224 QTAILQ_HEAD (, Qcow2DiscardRegion) discards;
225 bool cache_discards;
f7d0fe02
KW
226} BDRVQcowState;
227
228/* XXX: use std qcow open function ? */
229typedef struct QCowCreateState {
230 int cluster_size;
231 int cluster_bits;
232 uint16_t *refcount_block;
233 uint64_t *refcount_table;
234 int64_t l1_table_offset;
235 int64_t refcount_table_offset;
236 int64_t refcount_block_offset;
237} QCowCreateState;
238
f214978a
KW
239struct QCowAIOCB;
240
593fb83c
KW
241typedef struct Qcow2COWRegion {
242 /**
243 * Offset of the COW region in bytes from the start of the first cluster
244 * touched by the request.
245 */
246 uint64_t offset;
247
248 /** Number of sectors to copy */
249 int nb_sectors;
250} Qcow2COWRegion;
251
f50f88b9
KW
252/**
253 * Describes an in-flight (part of a) write request that writes to clusters
254 * that are not referenced in their L2 table yet.
255 */
45aba42f
KW
256typedef struct QCowL2Meta
257{
1d3afd64 258 /** Guest offset of the first newly allocated cluster */
45aba42f 259 uint64_t offset;
1d3afd64 260
1d3afd64 261 /** Host offset of the first newly allocated cluster */
250196f1 262 uint64_t alloc_offset;
1d3afd64 263
1d3afd64
KW
264 /**
265 * Number of sectors from the start of the first allocated cluster to
266 * the end of the (possibly shortened) request
267 */
45aba42f 268 int nb_available;
1d3afd64
KW
269
270 /** Number of newly allocated clusters */
45aba42f 271 int nb_clusters;
1d3afd64
KW
272
273 /**
274 * Requests that overlap with this allocation and wait to be restarted
275 * when the allocating request has completed.
276 */
68d100e9 277 CoQueue dependent_requests;
f214978a 278
593fb83c
KW
279 /**
280 * The COW Region between the start of the first allocated cluster and the
281 * area the guest actually writes to.
282 */
283 Qcow2COWRegion cow_start;
284
285 /**
286 * The COW Region between the area the guest actually writes to and the
287 * end of the last allocated cluster.
288 */
289 Qcow2COWRegion cow_end;
290
88c6588c
KW
291 /** Pointer to next L2Meta of the same write request */
292 struct QCowL2Meta *next;
293
72cf2d4f 294 QLIST_ENTRY(QCowL2Meta) next_in_flight;
45aba42f
KW
295} QCowL2Meta;
296
68d000a3
KW
297enum {
298 QCOW2_CLUSTER_UNALLOCATED,
299 QCOW2_CLUSTER_NORMAL,
300 QCOW2_CLUSTER_COMPRESSED,
6377af48 301 QCOW2_CLUSTER_ZERO
68d000a3
KW
302};
303
a40f1c2a
MR
304typedef enum QCow2MetadataOverlap {
305 QCOW2_OL_MAIN_HEADER_BITNR = 0,
306 QCOW2_OL_ACTIVE_L1_BITNR = 1,
307 QCOW2_OL_ACTIVE_L2_BITNR = 2,
308 QCOW2_OL_REFCOUNT_TABLE_BITNR = 3,
309 QCOW2_OL_REFCOUNT_BLOCK_BITNR = 4,
310 QCOW2_OL_SNAPSHOT_TABLE_BITNR = 5,
311 QCOW2_OL_INACTIVE_L1_BITNR = 6,
312 QCOW2_OL_INACTIVE_L2_BITNR = 7,
313
314 QCOW2_OL_MAX_BITNR = 8,
315
316 QCOW2_OL_NONE = 0,
317 QCOW2_OL_MAIN_HEADER = (1 << QCOW2_OL_MAIN_HEADER_BITNR),
318 QCOW2_OL_ACTIVE_L1 = (1 << QCOW2_OL_ACTIVE_L1_BITNR),
319 QCOW2_OL_ACTIVE_L2 = (1 << QCOW2_OL_ACTIVE_L2_BITNR),
320 QCOW2_OL_REFCOUNT_TABLE = (1 << QCOW2_OL_REFCOUNT_TABLE_BITNR),
321 QCOW2_OL_REFCOUNT_BLOCK = (1 << QCOW2_OL_REFCOUNT_BLOCK_BITNR),
322 QCOW2_OL_SNAPSHOT_TABLE = (1 << QCOW2_OL_SNAPSHOT_TABLE_BITNR),
323 QCOW2_OL_INACTIVE_L1 = (1 << QCOW2_OL_INACTIVE_L1_BITNR),
324 /* NOTE: Checking overlaps with inactive L2 tables will result in bdrv
325 * reads. */
326 QCOW2_OL_INACTIVE_L2 = (1 << QCOW2_OL_INACTIVE_L2_BITNR),
327} QCow2MetadataOverlap;
328
4a273c39
MR
329/* Perform all overlap checks which can be done in constant time */
330#define QCOW2_OL_CONSTANT \
331 (QCOW2_OL_MAIN_HEADER | QCOW2_OL_ACTIVE_L1 | QCOW2_OL_REFCOUNT_TABLE | \
332 QCOW2_OL_SNAPSHOT_TABLE)
333
a40f1c2a
MR
334/* Perform all overlap checks which don't require disk access */
335#define QCOW2_OL_CACHED \
4a273c39
MR
336 (QCOW2_OL_CONSTANT | QCOW2_OL_ACTIVE_L2 | QCOW2_OL_REFCOUNT_BLOCK | \
337 QCOW2_OL_INACTIVE_L1)
338
339/* Perform all overlap checks */
340#define QCOW2_OL_ALL \
341 (QCOW2_OL_CACHED | QCOW2_OL_INACTIVE_L2)
a40f1c2a 342
68d000a3
KW
343#define L1E_OFFSET_MASK 0x00ffffffffffff00ULL
344#define L2E_OFFSET_MASK 0x00ffffffffffff00ULL
345#define L2E_COMPRESSED_OFFSET_SIZE_MASK 0x3fffffffffffffffULL
346
76dc9e0c
KW
347#define REFT_OFFSET_MASK 0xffffffffffffff00ULL
348
3b8e2e26
KW
349static inline int64_t start_of_cluster(BDRVQcowState *s, int64_t offset)
350{
351 return offset & ~(s->cluster_size - 1);
352}
353
c37f4cd7
KW
354static inline int64_t offset_into_cluster(BDRVQcowState *s, int64_t offset)
355{
356 return offset & (s->cluster_size - 1);
357}
358
45aba42f 359static inline int size_to_clusters(BDRVQcowState *s, int64_t size)
f7d0fe02
KW
360{
361 return (size + (s->cluster_size - 1)) >> s->cluster_bits;
362}
363
2cf7cfa1 364static inline int64_t size_to_l1(BDRVQcowState *s, int64_t size)
419b19d9
SH
365{
366 int shift = s->cluster_bits + s->l2_bits;
367 return (size + (1ULL << shift) - 1) >> shift;
368}
369
17a71e58
KW
370static inline int offset_to_l2_index(BDRVQcowState *s, int64_t offset)
371{
372 return (offset >> s->cluster_bits) & (s->l2_size - 1);
373}
374
c142442b
KW
375static inline int64_t align_offset(int64_t offset, int n)
376{
377 offset = (offset + n - 1) & ~(n - 1);
378 return offset;
379}
380
1ebf561c
KW
381static inline int64_t qcow2_vm_state_offset(BDRVQcowState *s)
382{
383 return (int64_t)s->l1_vm_state_index << (s->cluster_bits + s->l2_bits);
384}
385
68d000a3
KW
386static inline int qcow2_get_cluster_type(uint64_t l2_entry)
387{
388 if (l2_entry & QCOW_OFLAG_COMPRESSED) {
389 return QCOW2_CLUSTER_COMPRESSED;
6377af48
KW
390 } else if (l2_entry & QCOW_OFLAG_ZERO) {
391 return QCOW2_CLUSTER_ZERO;
68d000a3
KW
392 } else if (!(l2_entry & L2E_OFFSET_MASK)) {
393 return QCOW2_CLUSTER_UNALLOCATED;
394 } else {
395 return QCOW2_CLUSTER_NORMAL;
396 }
397}
398
bfe8043e
SH
399/* Check whether refcounts are eager or lazy */
400static inline bool qcow2_need_accurate_refcounts(BDRVQcowState *s)
401{
402 return !(s->incompatible_features & QCOW2_INCOMPAT_DIRTY);
403}
c142442b 404
65eb2e35
KW
405static inline uint64_t l2meta_cow_start(QCowL2Meta *m)
406{
407 return m->offset + m->cow_start.offset;
408}
409
410static inline uint64_t l2meta_cow_end(QCowL2Meta *m)
411{
412 return m->offset + m->cow_end.offset
413 + (m->cow_end.nb_sectors << BDRV_SECTOR_BITS);
414}
415
f7d0fe02
KW
416// FIXME Need qcow2_ prefix to global functions
417
418/* qcow2.c functions */
bd28f835
KW
419int qcow2_backing_read1(BlockDriverState *bs, QEMUIOVector *qiov,
420 int64_t sector_num, int nb_sectors);
280d3735
KW
421
422int qcow2_mark_dirty(BlockDriverState *bs);
69c98726
MR
423int qcow2_mark_corrupt(BlockDriverState *bs);
424int qcow2_mark_consistent(BlockDriverState *bs);
e24e49e6 425int qcow2_update_header(BlockDriverState *bs);
f7d0fe02
KW
426
427/* qcow2-refcount.c functions */
ed6ccf0f
KW
428int qcow2_refcount_init(BlockDriverState *bs);
429void qcow2_refcount_close(BlockDriverState *bs);
f7d0fe02 430
32b6444d
MR
431int qcow2_update_cluster_refcount(BlockDriverState *bs, int64_t cluster_index,
432 int addend, enum qcow2_discard_type type);
433
ed6ccf0f 434int64_t qcow2_alloc_clusters(BlockDriverState *bs, int64_t size);
256900b1
KW
435int qcow2_alloc_clusters_at(BlockDriverState *bs, uint64_t offset,
436 int nb_clusters);
ed6ccf0f
KW
437int64_t qcow2_alloc_bytes(BlockDriverState *bs, int size);
438void qcow2_free_clusters(BlockDriverState *bs,
6cfcb9b8
KW
439 int64_t offset, int64_t size,
440 enum qcow2_discard_type type);
441void qcow2_free_any_clusters(BlockDriverState *bs, uint64_t l2_entry,
442 int nb_clusters, enum qcow2_discard_type type);
f7d0fe02 443
ed6ccf0f
KW
444int qcow2_update_snapshot_refcount(BlockDriverState *bs,
445 int64_t l1_table_offset, int l1_size, int addend);
f7d0fe02 446
166acf54
KW
447int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
448 BdrvCheckMode fix);
f7d0fe02 449
0b919fae
KW
450void qcow2_process_discards(BlockDriverState *bs, int ret);
451
231bb267 452int qcow2_check_metadata_overlap(BlockDriverState *bs, int ign, int64_t offset,
a40f1c2a 453 int64_t size);
231bb267 454int qcow2_pre_write_overlap_check(BlockDriverState *bs, int ign, int64_t offset,
a40f1c2a
MR
455 int64_t size);
456
45aba42f 457/* qcow2-cluster.c functions */
2cf7cfa1
KW
458int qcow2_grow_l1_table(BlockDriverState *bs, uint64_t min_size,
459 bool exact_size);
e23e400e 460int qcow2_write_l1_entry(BlockDriverState *bs, int l1_index);
ed6ccf0f 461void qcow2_l2_cache_reset(BlockDriverState *bs);
66f82cee 462int qcow2_decompress_cluster(BlockDriverState *bs, uint64_t cluster_offset);
ed6ccf0f 463void qcow2_encrypt_sectors(BDRVQcowState *s, int64_t sector_num,
45aba42f
KW
464 uint8_t *out_buf, const uint8_t *in_buf,
465 int nb_sectors, int enc,
466 const AES_KEY *key);
467
1c46efaa
KW
468int qcow2_get_cluster_offset(BlockDriverState *bs, uint64_t offset,
469 int *num, uint64_t *cluster_offset);
f4f0d391 470int qcow2_alloc_cluster_offset(BlockDriverState *bs, uint64_t offset,
f50f88b9 471 int n_start, int n_end, int *num, uint64_t *host_offset, QCowL2Meta **m);
ed6ccf0f 472uint64_t qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs,
45aba42f
KW
473 uint64_t offset,
474 int compressed_size);
475
148da7ea 476int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m);
5ea929e3 477int qcow2_discard_clusters(BlockDriverState *bs, uint64_t offset,
670df5e3 478 int nb_sectors, enum qcow2_discard_type type);
621f0589 479int qcow2_zero_clusters(BlockDriverState *bs, uint64_t offset, int nb_sectors);
45aba42f 480
32b6444d
MR
481int qcow2_expand_zero_clusters(BlockDriverState *bs);
482
c142442b 483/* qcow2-snapshot.c functions */
ed6ccf0f
KW
484int qcow2_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info);
485int qcow2_snapshot_goto(BlockDriverState *bs, const char *snapshot_id);
a89d89d3
WX
486int qcow2_snapshot_delete(BlockDriverState *bs,
487 const char *snapshot_id,
488 const char *name,
489 Error **errp);
ed6ccf0f 490int qcow2_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab);
51ef6727 491int qcow2_snapshot_load_tmp(BlockDriverState *bs, const char *snapshot_name);
c142442b 492
ed6ccf0f
KW
493void qcow2_free_snapshots(BlockDriverState *bs);
494int qcow2_read_snapshots(BlockDriverState *bs);
c142442b 495
49381094 496/* qcow2-cache.c functions */
6af4e9ea 497Qcow2Cache *qcow2_cache_create(BlockDriverState *bs, int num_tables);
49381094
KW
498int qcow2_cache_destroy(BlockDriverState* bs, Qcow2Cache *c);
499
500void qcow2_cache_entry_mark_dirty(Qcow2Cache *c, void *table);
501int qcow2_cache_flush(BlockDriverState *bs, Qcow2Cache *c);
502int qcow2_cache_set_dependency(BlockDriverState *bs, Qcow2Cache *c,
503 Qcow2Cache *dependency);
3de0a294 504void qcow2_cache_depends_on_flush(Qcow2Cache *c);
49381094 505
e7108fea
MR
506int qcow2_cache_empty(BlockDriverState *bs, Qcow2Cache *c);
507
49381094
KW
508int qcow2_cache_get(BlockDriverState *bs, Qcow2Cache *c, uint64_t offset,
509 void **table);
510int qcow2_cache_get_empty(BlockDriverState *bs, Qcow2Cache *c, uint64_t offset,
511 void **table);
512int qcow2_cache_put(BlockDriverState *bs, Qcow2Cache *c, void **table);
513
f7d0fe02 514#endif