mirror of
https://github.com/clearlinux/kvmtool.git
synced 2026-09-05 05:01:33 +00:00
We already have something to wrap pthread with mutex_[init,lock,unlock] calls. This patch creates a new struct mutex abstraction and moves everything to work with it. Signed-off-by: Sasha Levin <sasha.levin@oracle.com> Signed-off-by: Pekka Enberg <penberg@kernel.org>
134 lines
2.4 KiB
C
134 lines
2.4 KiB
C
#ifndef KVM__QCOW_H
|
|
#define KVM__QCOW_H
|
|
|
|
#include "kvm/mutex.h"
|
|
|
|
#include <linux/types.h>
|
|
#include <stdbool.h>
|
|
#include <linux/rbtree.h>
|
|
#include <linux/list.h>
|
|
|
|
#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 */
|