Annotation of qemu/block/qcow2.h, revision 1.1.1.5

1.1       root        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: 
                     28: #include "aes.h"
                     29: 
                     30: //#define DEBUG_ALLOC
                     31: //#define DEBUG_ALLOC2
                     32: //#define DEBUG_EXT
                     33: 
                     34: #define QCOW_MAGIC (('Q' << 24) | ('F' << 16) | ('I' << 8) | 0xfb)
                     35: #define QCOW_VERSION 2
                     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. */
                     43: #define QCOW_OFLAG_COPIED     (1LL << 63)
                     44: /* indicate that the cluster is compressed (they never have the copied flag) */
                     45: #define QCOW_OFLAG_COMPRESSED (1LL << 62)
                     46: 
                     47: #define REFCOUNT_SHIFT 1 /* refcount size is 2 bytes */
                     48: 
                     49: #define MIN_CLUSTER_BITS 9
1.1.1.2   root       50: #define MAX_CLUSTER_BITS 21
1.1       root       51: 
                     52: #define L2_CACHE_SIZE 16
                     53: 
1.1.1.5 ! root       54: /* Must be at least 4 to cover all cases of refcount table growth */
        !            55: #define REFCOUNT_CACHE_SIZE 4
        !            56: 
1.1       root       57: typedef struct QCowHeader {
                     58:     uint32_t magic;
                     59:     uint32_t version;
                     60:     uint64_t backing_file_offset;
                     61:     uint32_t backing_file_size;
                     62:     uint32_t cluster_bits;
                     63:     uint64_t size; /* in bytes */
                     64:     uint32_t crypt_method;
                     65:     uint32_t l1_size; /* XXX: save number of clusters instead ? */
                     66:     uint64_t l1_table_offset;
                     67:     uint64_t refcount_table_offset;
                     68:     uint32_t refcount_table_clusters;
                     69:     uint32_t nb_snapshots;
                     70:     uint64_t snapshots_offset;
                     71: } QCowHeader;
                     72: 
                     73: typedef struct QCowSnapshot {
                     74:     uint64_t l1_table_offset;
                     75:     uint32_t l1_size;
                     76:     char *id_str;
                     77:     char *name;
                     78:     uint32_t vm_state_size;
                     79:     uint32_t date_sec;
                     80:     uint32_t date_nsec;
                     81:     uint64_t vm_clock_nsec;
                     82: } QCowSnapshot;
                     83: 
1.1.1.5 ! root       84: struct Qcow2Cache;
        !            85: typedef struct Qcow2Cache Qcow2Cache;
        !            86: 
1.1       root       87: typedef struct BDRVQcowState {
                     88:     int cluster_bits;
                     89:     int cluster_size;
                     90:     int cluster_sectors;
                     91:     int l2_bits;
                     92:     int l2_size;
                     93:     int l1_size;
                     94:     int l1_vm_state_index;
                     95:     int csize_shift;
                     96:     int csize_mask;
                     97:     uint64_t cluster_offset_mask;
                     98:     uint64_t l1_table_offset;
                     99:     uint64_t *l1_table;
1.1.1.5 ! root      100: 
        !           101:     Qcow2Cache* l2_table_cache;
        !           102:     Qcow2Cache* refcount_block_cache;
        !           103: 
1.1       root      104:     uint8_t *cluster_cache;
                    105:     uint8_t *cluster_data;
                    106:     uint64_t cluster_cache_offset;
1.1.1.2   root      107:     QLIST_HEAD(QCowClusterAlloc, QCowL2Meta) cluster_allocs;
1.1       root      108: 
                    109:     uint64_t *refcount_table;
                    110:     uint64_t refcount_table_offset;
                    111:     uint32_t refcount_table_size;
                    112:     int64_t free_cluster_index;
                    113:     int64_t free_byte_offset;
                    114: 
                    115:     uint32_t crypt_method; /* current crypt method, 0 if no key yet */
                    116:     uint32_t crypt_method_header;
                    117:     AES_KEY aes_encrypt_key;
                    118:     AES_KEY aes_decrypt_key;
                    119:     uint64_t snapshots_offset;
                    120:     int snapshots_size;
                    121:     int nb_snapshots;
                    122:     QCowSnapshot *snapshots;
                    123: } BDRVQcowState;
                    124: 
                    125: /* XXX: use std qcow open function ? */
                    126: typedef struct QCowCreateState {
                    127:     int cluster_size;
                    128:     int cluster_bits;
                    129:     uint16_t *refcount_block;
                    130:     uint64_t *refcount_table;
                    131:     int64_t l1_table_offset;
                    132:     int64_t refcount_table_offset;
                    133:     int64_t refcount_block_offset;
                    134: } QCowCreateState;
                    135: 
                    136: struct QCowAIOCB;
                    137: 
                    138: /* XXX This could be private for qcow2-cluster.c */
                    139: typedef struct QCowL2Meta
                    140: {
                    141:     uint64_t offset;
1.1.1.3   root      142:     uint64_t cluster_offset;
1.1       root      143:     int n_start;
                    144:     int nb_available;
                    145:     int nb_clusters;
                    146:     struct QCowL2Meta *depends_on;
1.1.1.2   root      147:     QLIST_HEAD(QCowAioDependencies, QCowAIOCB) dependent_requests;
1.1       root      148: 
1.1.1.2   root      149:     QLIST_ENTRY(QCowL2Meta) next_in_flight;
1.1       root      150: } QCowL2Meta;
                    151: 
                    152: static inline int size_to_clusters(BDRVQcowState *s, int64_t size)
                    153: {
                    154:     return (size + (s->cluster_size - 1)) >> s->cluster_bits;
                    155: }
                    156: 
1.1.1.4   root      157: static inline int size_to_l1(BDRVQcowState *s, int64_t size)
                    158: {
                    159:     int shift = s->cluster_bits + s->l2_bits;
                    160:     return (size + (1ULL << shift) - 1) >> shift;
                    161: }
                    162: 
1.1       root      163: static inline int64_t align_offset(int64_t offset, int n)
                    164: {
                    165:     offset = (offset + n - 1) & ~(n - 1);
                    166:     return offset;
                    167: }
                    168: 
                    169: 
                    170: // FIXME Need qcow2_ prefix to global functions
                    171: 
                    172: /* qcow2.c functions */
1.1.1.5 ! root      173: int qcow2_backing_read1(BlockDriverState *bs, QEMUIOVector *qiov,
        !           174:                   int64_t sector_num, int nb_sectors);
1.1       root      175: 
                    176: /* qcow2-refcount.c functions */
                    177: int qcow2_refcount_init(BlockDriverState *bs);
                    178: void qcow2_refcount_close(BlockDriverState *bs);
                    179: 
                    180: int64_t qcow2_alloc_clusters(BlockDriverState *bs, int64_t size);
                    181: int64_t qcow2_alloc_bytes(BlockDriverState *bs, int size);
                    182: void qcow2_free_clusters(BlockDriverState *bs,
                    183:     int64_t offset, int64_t size);
                    184: void qcow2_free_any_clusters(BlockDriverState *bs,
                    185:     uint64_t cluster_offset, int nb_clusters);
                    186: 
                    187: void qcow2_create_refcount_update(QCowCreateState *s, int64_t offset,
                    188:     int64_t size);
                    189: int qcow2_update_snapshot_refcount(BlockDriverState *bs,
                    190:     int64_t l1_table_offset, int l1_size, int addend);
                    191: 
1.1.1.4   root      192: int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res);
1.1       root      193: 
                    194: /* qcow2-cluster.c functions */
1.1.1.5 ! root      195: int qcow2_grow_l1_table(BlockDriverState *bs, int min_size, bool exact_size);
1.1       root      196: void qcow2_l2_cache_reset(BlockDriverState *bs);
1.1.1.4   root      197: int qcow2_decompress_cluster(BlockDriverState *bs, uint64_t cluster_offset);
1.1       root      198: void qcow2_encrypt_sectors(BDRVQcowState *s, int64_t sector_num,
                    199:                      uint8_t *out_buf, const uint8_t *in_buf,
                    200:                      int nb_sectors, int enc,
                    201:                      const AES_KEY *key);
                    202: 
1.1.1.4   root      203: int qcow2_get_cluster_offset(BlockDriverState *bs, uint64_t offset,
                    204:     int *num, uint64_t *cluster_offset);
1.1.1.3   root      205: int qcow2_alloc_cluster_offset(BlockDriverState *bs, uint64_t offset,
                    206:     int n_start, int n_end, int *num, QCowL2Meta *m);
1.1       root      207: uint64_t qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs,
                    208:                                          uint64_t offset,
                    209:                                          int compressed_size);
                    210: 
1.1.1.3   root      211: int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m);
1.1.1.5 ! root      212: int qcow2_discard_clusters(BlockDriverState *bs, uint64_t offset,
        !           213:     int nb_sectors);
1.1       root      214: 
                    215: /* qcow2-snapshot.c functions */
                    216: int qcow2_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info);
                    217: int qcow2_snapshot_goto(BlockDriverState *bs, const char *snapshot_id);
                    218: int qcow2_snapshot_delete(BlockDriverState *bs, const char *snapshot_id);
                    219: int qcow2_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab);
1.1.1.5 ! root      220: int qcow2_snapshot_load_tmp(BlockDriverState *bs, const char *snapshot_name);
1.1       root      221: 
                    222: void qcow2_free_snapshots(BlockDriverState *bs);
                    223: int qcow2_read_snapshots(BlockDriverState *bs);
                    224: 
1.1.1.5 ! root      225: /* qcow2-cache.c functions */
        !           226: Qcow2Cache *qcow2_cache_create(BlockDriverState *bs, int num_tables,
        !           227:     bool writethrough);
        !           228: int qcow2_cache_destroy(BlockDriverState* bs, Qcow2Cache *c);
        !           229: 
        !           230: void qcow2_cache_entry_mark_dirty(Qcow2Cache *c, void *table);
        !           231: int qcow2_cache_flush(BlockDriverState *bs, Qcow2Cache *c);
        !           232: int qcow2_cache_set_dependency(BlockDriverState *bs, Qcow2Cache *c,
        !           233:     Qcow2Cache *dependency);
        !           234: void qcow2_cache_depends_on_flush(Qcow2Cache *c);
        !           235: 
        !           236: int qcow2_cache_get(BlockDriverState *bs, Qcow2Cache *c, uint64_t offset,
        !           237:     void **table);
        !           238: int qcow2_cache_get_empty(BlockDriverState *bs, Qcow2Cache *c, uint64_t offset,
        !           239:     void **table);
        !           240: int qcow2_cache_put(BlockDriverState *bs, Qcow2Cache *c, void **table);
        !           241: 
1.1       root      242: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.