#ifndef KVM__QCOW_H #define KVM__QCOW_H #include "kvm/mutex.h" #include #include #include #include #define QCOW_MAGIC (('Q' << 24) | ('F' << 16) | ('I' << 8) | 0xfb) #define QCOW1_VERSION 1 #define QCOW2_VERSION 2 #define QCOW1_OFLAG_COMPRESSED (1ULL << 63) #define QCOW2_OFLAG_COPIED (1ULL << 63) #define QCOW2_OFLAG_COMPRESSED (1ULL << 62) #define QCOW2_OFLAGS_MASK (QCOW2_OFLAG_COPIED|QCOW2_OFLAG_COMPRESSED) #define QCOW2_OFFSET_MASK (~QCOW2_OFLAGS_MASK) #define MAX_CACHE_NODES 32 struct qcow_l2_table { u64 offset; struct rb_node node; struct list_head list; u8 dirty; u64 table[]; }; struct qcow_l1_table { u32 table_size; u64 *l1_table; /* Level2 caching data structures */ struct rb_root root; struct list_head lru_list; int nr_cached; }; #define QCOW_REFCOUNT_BLOCK_SHIFT 1 struct qcow_refcount_block { u64 offset; struct rb_node node; struct list_head list; u64 size; u8 dirty; u16 entries[]; }; struct qcow_refcount_table { u32 rf_size; u64 *rf_table; /* Refcount block caching data structures */ struct rb_root root; struct list_head lru_list; int nr_cached; }; struct qcow_header { u64 size; /* in bytes */ u64 l1_table_offset; u32 l1_size; u8 cluster_bits; u8 l2_bits; u64 refcount_table_offset; u32 refcount_table_size; }; struct qcow { struct mutex mutex; struct qcow_header *header; struct qcow_l1_table table; struct qcow_refcount_table refcount_table; int fd; int csize_shift; int csize_mask; u32 version; u64 cluster_size; u64 cluster_offset_mask; u64 free_clust_idx; void *cluster_cache; void *cluster_data; void *copy_buff; }; struct qcow1_header_disk { u32 magic; u32 version; u64 backing_file_offset; u32 backing_file_size; u32 mtime; u64 size; /* in bytes */ u8 cluster_bits; u8 l2_bits; u32 crypt_method; u64 l1_table_offset; }; struct qcow2_header_disk { u32 magic; u32 version; u64 backing_file_offset; u32 backing_file_size; u32 cluster_bits; u64 size; /* in bytes */ u32 crypt_method; u32 l1_size; u64 l1_table_offset; u64 refcount_table_offset; u32 refcount_table_clusters; u32 nb_snapshots; u64 snapshots_offset; }; struct disk_image *qcow_probe(int fd, bool readonly); #endif /* KVM__QCOW_H */