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

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: 
                     54: typedef struct QCowHeader {
                     55:     uint32_t magic;
                     56:     uint32_t version;
                     57:     uint64_t backing_file_offset;
                     58:     uint32_t backing_file_size;
                     59:     uint32_t cluster_bits;
                     60:     uint64_t size; /* in bytes */
                     61:     uint32_t crypt_method;
                     62:     uint32_t l1_size; /* XXX: save number of clusters instead ? */
                     63:     uint64_t l1_table_offset;
                     64:     uint64_t refcount_table_offset;
                     65:     uint32_t refcount_table_clusters;
                     66:     uint32_t nb_snapshots;
                     67:     uint64_t snapshots_offset;
                     68: } QCowHeader;
                     69: 
                     70: typedef struct QCowSnapshot {
                     71:     uint64_t l1_table_offset;
                     72:     uint32_t l1_size;
                     73:     char *id_str;
                     74:     char *name;
                     75:     uint32_t vm_state_size;
                     76:     uint32_t date_sec;
                     77:     uint32_t date_nsec;
                     78:     uint64_t vm_clock_nsec;
                     79: } QCowSnapshot;
                     80: 
                     81: typedef struct BDRVQcowState {
                     82:     BlockDriverState *hd;
                     83:     int cluster_bits;
                     84:     int cluster_size;
                     85:     int cluster_sectors;
                     86:     int l2_bits;
                     87:     int l2_size;
                     88:     int l1_size;
                     89:     int l1_vm_state_index;
                     90:     int csize_shift;
                     91:     int csize_mask;
                     92:     uint64_t cluster_offset_mask;
                     93:     uint64_t l1_table_offset;
                     94:     uint64_t *l1_table;
                     95:     uint64_t *l2_cache;
                     96:     uint64_t l2_cache_offsets[L2_CACHE_SIZE];
                     97:     uint32_t l2_cache_counts[L2_CACHE_SIZE];
                     98:     uint8_t *cluster_cache;
                     99:     uint8_t *cluster_data;
                    100:     uint64_t cluster_cache_offset;
1.1.1.2   root      101:     QLIST_HEAD(QCowClusterAlloc, QCowL2Meta) cluster_allocs;
1.1       root      102: 
                    103:     uint64_t *refcount_table;
                    104:     uint64_t refcount_table_offset;
                    105:     uint32_t refcount_table_size;
                    106:     uint64_t refcount_block_cache_offset;
                    107:     uint16_t *refcount_block_cache;
                    108:     int64_t free_cluster_index;
                    109:     int64_t free_byte_offset;
                    110: 
                    111:     uint32_t crypt_method; /* current crypt method, 0 if no key yet */
                    112:     uint32_t crypt_method_header;
                    113:     AES_KEY aes_encrypt_key;
                    114:     AES_KEY aes_decrypt_key;
                    115:     uint64_t snapshots_offset;
                    116:     int snapshots_size;
                    117:     int nb_snapshots;
                    118:     QCowSnapshot *snapshots;
                    119: } BDRVQcowState;
                    120: 
                    121: /* XXX: use std qcow open function ? */
                    122: typedef struct QCowCreateState {
                    123:     int cluster_size;
                    124:     int cluster_bits;
                    125:     uint16_t *refcount_block;
                    126:     uint64_t *refcount_table;
                    127:     int64_t l1_table_offset;
                    128:     int64_t refcount_table_offset;
                    129:     int64_t refcount_block_offset;
                    130: } QCowCreateState;
                    131: 
                    132: struct QCowAIOCB;
                    133: 
                    134: /* XXX This could be private for qcow2-cluster.c */
                    135: typedef struct QCowL2Meta
                    136: {
                    137:     uint64_t offset;
1.1.1.3   root      138:     uint64_t cluster_offset;
1.1       root      139:     int n_start;
                    140:     int nb_available;
                    141:     int nb_clusters;
                    142:     struct QCowL2Meta *depends_on;
1.1.1.2   root      143:     QLIST_HEAD(QCowAioDependencies, QCowAIOCB) dependent_requests;
1.1       root      144: 
1.1.1.2   root      145:     QLIST_ENTRY(QCowL2Meta) next_in_flight;
1.1       root      146: } QCowL2Meta;
                    147: 
                    148: static inline int size_to_clusters(BDRVQcowState *s, int64_t size)
                    149: {
                    150:     return (size + (s->cluster_size - 1)) >> s->cluster_bits;
                    151: }
                    152: 
1.1.1.4 ! root      153: static inline int size_to_l1(BDRVQcowState *s, int64_t size)
        !           154: {
        !           155:     int shift = s->cluster_bits + s->l2_bits;
        !           156:     return (size + (1ULL << shift) - 1) >> shift;
        !           157: }
        !           158: 
1.1       root      159: static inline int64_t align_offset(int64_t offset, int n)
                    160: {
                    161:     offset = (offset + n - 1) & ~(n - 1);
                    162:     return offset;
                    163: }
                    164: 
                    165: 
                    166: // FIXME Need qcow2_ prefix to global functions
                    167: 
                    168: /* qcow2.c functions */
                    169: int qcow2_backing_read1(BlockDriverState *bs,
                    170:                   int64_t sector_num, uint8_t *buf, int nb_sectors);
                    171: 
                    172: /* qcow2-refcount.c functions */
                    173: int qcow2_refcount_init(BlockDriverState *bs);
                    174: void qcow2_refcount_close(BlockDriverState *bs);
                    175: 
                    176: int64_t qcow2_alloc_clusters(BlockDriverState *bs, int64_t size);
                    177: int64_t qcow2_alloc_bytes(BlockDriverState *bs, int size);
                    178: void qcow2_free_clusters(BlockDriverState *bs,
                    179:     int64_t offset, int64_t size);
                    180: void qcow2_free_any_clusters(BlockDriverState *bs,
                    181:     uint64_t cluster_offset, int nb_clusters);
                    182: 
                    183: void qcow2_create_refcount_update(QCowCreateState *s, int64_t offset,
                    184:     int64_t size);
                    185: int qcow2_update_snapshot_refcount(BlockDriverState *bs,
                    186:     int64_t l1_table_offset, int l1_size, int addend);
                    187: 
1.1.1.4 ! root      188: int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res);
1.1       root      189: 
                    190: /* qcow2-cluster.c functions */
                    191: int qcow2_grow_l1_table(BlockDriverState *bs, int min_size);
                    192: void qcow2_l2_cache_reset(BlockDriverState *bs);
1.1.1.4 ! root      193: int qcow2_decompress_cluster(BlockDriverState *bs, uint64_t cluster_offset);
1.1       root      194: void qcow2_encrypt_sectors(BDRVQcowState *s, int64_t sector_num,
                    195:                      uint8_t *out_buf, const uint8_t *in_buf,
                    196:                      int nb_sectors, int enc,
                    197:                      const AES_KEY *key);
                    198: 
1.1.1.4 ! root      199: int qcow2_get_cluster_offset(BlockDriverState *bs, uint64_t offset,
        !           200:     int *num, uint64_t *cluster_offset);
1.1.1.3   root      201: int qcow2_alloc_cluster_offset(BlockDriverState *bs, uint64_t offset,
                    202:     int n_start, int n_end, int *num, QCowL2Meta *m);
1.1       root      203: uint64_t qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs,
                    204:                                          uint64_t offset,
                    205:                                          int compressed_size);
                    206: 
1.1.1.3   root      207: int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m);
1.1       root      208: 
                    209: /* qcow2-snapshot.c functions */
                    210: int qcow2_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info);
                    211: int qcow2_snapshot_goto(BlockDriverState *bs, const char *snapshot_id);
                    212: int qcow2_snapshot_delete(BlockDriverState *bs, const char *snapshot_id);
                    213: int qcow2_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab);
                    214: 
                    215: void qcow2_free_snapshots(BlockDriverState *bs);
                    216: int qcow2_read_snapshots(BlockDriverState *bs);
                    217: 
                    218: #endif

unix.superglobalmegacorp.com

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