mirror of https://github.com/xemu-project/xemu.git
qcow2: Basic definitions for external data files
This adds basic constants, struct fields and helper function for external data file support to the implementation. QCOW2_INCOMPAT_MASK and QCOW2_AUTOCLEAR_MASK are not updated yet so that opening images with an external data file still fails (we don't handle them correctly yet). Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
65a3d073e9
commit
93c2493646
|
@ -73,6 +73,7 @@ typedef struct {
|
||||||
#define QCOW2_EXT_MAGIC_FEATURE_TABLE 0x6803f857
|
#define QCOW2_EXT_MAGIC_FEATURE_TABLE 0x6803f857
|
||||||
#define QCOW2_EXT_MAGIC_CRYPTO_HEADER 0x0537be77
|
#define QCOW2_EXT_MAGIC_CRYPTO_HEADER 0x0537be77
|
||||||
#define QCOW2_EXT_MAGIC_BITMAPS 0x23852875
|
#define QCOW2_EXT_MAGIC_BITMAPS 0x23852875
|
||||||
|
#define QCOW2_EXT_MAGIC_DATA_FILE 0x44415441
|
||||||
|
|
||||||
static int coroutine_fn
|
static int coroutine_fn
|
||||||
qcow2_co_preadv_compressed(BlockDriverState *bs,
|
qcow2_co_preadv_compressed(BlockDriverState *bs,
|
||||||
|
@ -1452,6 +1453,9 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TODO Open external data file */
|
||||||
|
s->data_file = bs->file;
|
||||||
|
|
||||||
/* qcow2_read_extension may have set up the crypto context
|
/* qcow2_read_extension may have set up the crypto context
|
||||||
* if the crypt method needs a header region, some methods
|
* if the crypt method needs a header region, some methods
|
||||||
* don't need header extensions, so must check here
|
* don't need header extensions, so must check here
|
||||||
|
@ -2440,6 +2444,11 @@ int qcow2_update_header(BlockDriverState *bs)
|
||||||
.bit = QCOW2_INCOMPAT_CORRUPT_BITNR,
|
.bit = QCOW2_INCOMPAT_CORRUPT_BITNR,
|
||||||
.name = "corrupt bit",
|
.name = "corrupt bit",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.type = QCOW2_FEAT_TYPE_INCOMPATIBLE,
|
||||||
|
.bit = QCOW2_INCOMPAT_DATA_FILE_BITNR,
|
||||||
|
.name = "external data file",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.type = QCOW2_FEAT_TYPE_COMPATIBLE,
|
.type = QCOW2_FEAT_TYPE_COMPATIBLE,
|
||||||
.bit = QCOW2_COMPAT_LAZY_REFCOUNTS_BITNR,
|
.bit = QCOW2_COMPAT_LAZY_REFCOUNTS_BITNR,
|
||||||
|
|
|
@ -197,13 +197,15 @@ enum {
|
||||||
|
|
||||||
/* Incompatible feature bits */
|
/* Incompatible feature bits */
|
||||||
enum {
|
enum {
|
||||||
QCOW2_INCOMPAT_DIRTY_BITNR = 0,
|
QCOW2_INCOMPAT_DIRTY_BITNR = 0,
|
||||||
QCOW2_INCOMPAT_CORRUPT_BITNR = 1,
|
QCOW2_INCOMPAT_CORRUPT_BITNR = 1,
|
||||||
QCOW2_INCOMPAT_DIRTY = 1 << QCOW2_INCOMPAT_DIRTY_BITNR,
|
QCOW2_INCOMPAT_DATA_FILE_BITNR = 2,
|
||||||
QCOW2_INCOMPAT_CORRUPT = 1 << QCOW2_INCOMPAT_CORRUPT_BITNR,
|
QCOW2_INCOMPAT_DIRTY = 1 << QCOW2_INCOMPAT_DIRTY_BITNR,
|
||||||
|
QCOW2_INCOMPAT_CORRUPT = 1 << QCOW2_INCOMPAT_CORRUPT_BITNR,
|
||||||
|
QCOW2_INCOMPAT_DATA_FILE = 1 << QCOW2_INCOMPAT_DATA_FILE_BITNR,
|
||||||
|
|
||||||
QCOW2_INCOMPAT_MASK = QCOW2_INCOMPAT_DIRTY
|
QCOW2_INCOMPAT_MASK = QCOW2_INCOMPAT_DIRTY
|
||||||
| QCOW2_INCOMPAT_CORRUPT,
|
| QCOW2_INCOMPAT_CORRUPT,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Compatible feature bits */
|
/* Compatible feature bits */
|
||||||
|
@ -216,10 +218,12 @@ enum {
|
||||||
|
|
||||||
/* Autoclear feature bits */
|
/* Autoclear feature bits */
|
||||||
enum {
|
enum {
|
||||||
QCOW2_AUTOCLEAR_BITMAPS_BITNR = 0,
|
QCOW2_AUTOCLEAR_BITMAPS_BITNR = 0,
|
||||||
QCOW2_AUTOCLEAR_BITMAPS = 1 << QCOW2_AUTOCLEAR_BITMAPS_BITNR,
|
QCOW2_AUTOCLEAR_DATA_FILE_RAW_BITNR = 1,
|
||||||
|
QCOW2_AUTOCLEAR_BITMAPS = 1 << QCOW2_AUTOCLEAR_BITMAPS_BITNR,
|
||||||
|
QCOW2_AUTOCLEAR_DATA_FILE_RAW = 1 << QCOW2_AUTOCLEAR_DATA_FILE_RAW_BITNR,
|
||||||
|
|
||||||
QCOW2_AUTOCLEAR_MASK = QCOW2_AUTOCLEAR_BITMAPS,
|
QCOW2_AUTOCLEAR_MASK = QCOW2_AUTOCLEAR_BITMAPS,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum qcow2_discard_type {
|
enum qcow2_discard_type {
|
||||||
|
@ -340,6 +344,8 @@ typedef struct BDRVQcow2State {
|
||||||
|
|
||||||
CoQueue compress_wait_queue;
|
CoQueue compress_wait_queue;
|
||||||
int nb_compress_threads;
|
int nb_compress_threads;
|
||||||
|
|
||||||
|
BdrvChild *data_file;
|
||||||
} BDRVQcow2State;
|
} BDRVQcow2State;
|
||||||
|
|
||||||
typedef struct Qcow2COWRegion {
|
typedef struct Qcow2COWRegion {
|
||||||
|
@ -457,6 +463,12 @@ typedef enum QCow2MetadataOverlap {
|
||||||
|
|
||||||
#define REFT_OFFSET_MASK 0xfffffffffffffe00ULL
|
#define REFT_OFFSET_MASK 0xfffffffffffffe00ULL
|
||||||
|
|
||||||
|
static inline bool has_data_file(BlockDriverState *bs)
|
||||||
|
{
|
||||||
|
BDRVQcow2State *s = bs->opaque;
|
||||||
|
return (s->data_file != bs->file);
|
||||||
|
}
|
||||||
|
|
||||||
static inline int64_t start_of_cluster(BDRVQcow2State *s, int64_t offset)
|
static inline int64_t start_of_cluster(BDRVQcow2State *s, int64_t offset)
|
||||||
{
|
{
|
||||||
return offset & ~(s->cluster_size - 1);
|
return offset & ~(s->cluster_size - 1);
|
||||||
|
|
|
@ -117,7 +117,7 @@ header_length 104
|
||||||
|
|
||||||
Header extension:
|
Header extension:
|
||||||
magic 0x6803f857
|
magic 0x6803f857
|
||||||
length 144
|
length 192
|
||||||
data <binary>
|
data <binary>
|
||||||
|
|
||||||
Header extension:
|
Header extension:
|
||||||
|
@ -150,7 +150,7 @@ header_length 104
|
||||||
|
|
||||||
Header extension:
|
Header extension:
|
||||||
magic 0x6803f857
|
magic 0x6803f857
|
||||||
length 144
|
length 192
|
||||||
data <binary>
|
data <binary>
|
||||||
|
|
||||||
Header extension:
|
Header extension:
|
||||||
|
@ -164,7 +164,7 @@ No errors were found on the image.
|
||||||
|
|
||||||
magic 0x514649fb
|
magic 0x514649fb
|
||||||
version 3
|
version 3
|
||||||
backing_file_offset 0x148
|
backing_file_offset 0x178
|
||||||
backing_file_size 0x17
|
backing_file_size 0x17
|
||||||
cluster_bits 16
|
cluster_bits 16
|
||||||
size 67108864
|
size 67108864
|
||||||
|
@ -188,7 +188,7 @@ data 'host_device'
|
||||||
|
|
||||||
Header extension:
|
Header extension:
|
||||||
magic 0x6803f857
|
magic 0x6803f857
|
||||||
length 144
|
length 192
|
||||||
data <binary>
|
data <binary>
|
||||||
|
|
||||||
Header extension:
|
Header extension:
|
||||||
|
|
|
@ -58,7 +58,7 @@ header_length 104
|
||||||
|
|
||||||
Header extension:
|
Header extension:
|
||||||
magic 0x6803f857
|
magic 0x6803f857
|
||||||
length 144
|
length 192
|
||||||
data <binary>
|
data <binary>
|
||||||
|
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@ header_length 104
|
||||||
|
|
||||||
Header extension:
|
Header extension:
|
||||||
magic 0x6803f857
|
magic 0x6803f857
|
||||||
length 144
|
length 192
|
||||||
data <binary>
|
data <binary>
|
||||||
|
|
||||||
*** done
|
*** done
|
||||||
|
|
|
@ -26,7 +26,7 @@ header_length 104
|
||||||
|
|
||||||
Header extension:
|
Header extension:
|
||||||
magic 0x6803f857
|
magic 0x6803f857
|
||||||
length 144
|
length 192
|
||||||
data <binary>
|
data <binary>
|
||||||
|
|
||||||
magic 0x514649fb
|
magic 0x514649fb
|
||||||
|
@ -84,7 +84,7 @@ header_length 104
|
||||||
|
|
||||||
Header extension:
|
Header extension:
|
||||||
magic 0x6803f857
|
magic 0x6803f857
|
||||||
length 144
|
length 192
|
||||||
data <binary>
|
data <binary>
|
||||||
|
|
||||||
magic 0x514649fb
|
magic 0x514649fb
|
||||||
|
@ -144,7 +144,7 @@ header_length 104
|
||||||
|
|
||||||
Header extension:
|
Header extension:
|
||||||
magic 0x6803f857
|
magic 0x6803f857
|
||||||
length 144
|
length 192
|
||||||
data <binary>
|
data <binary>
|
||||||
|
|
||||||
ERROR cluster 5 refcount=0 reference=1
|
ERROR cluster 5 refcount=0 reference=1
|
||||||
|
@ -199,7 +199,7 @@ header_length 104
|
||||||
|
|
||||||
Header extension:
|
Header extension:
|
||||||
magic 0x6803f857
|
magic 0x6803f857
|
||||||
length 144
|
length 192
|
||||||
data <binary>
|
data <binary>
|
||||||
|
|
||||||
magic 0x514649fb
|
magic 0x514649fb
|
||||||
|
@ -268,7 +268,7 @@ header_length 104
|
||||||
|
|
||||||
Header extension:
|
Header extension:
|
||||||
magic 0x6803f857
|
magic 0x6803f857
|
||||||
length 144
|
length 192
|
||||||
data <binary>
|
data <binary>
|
||||||
|
|
||||||
read 65536/65536 bytes at offset 44040192
|
read 65536/65536 bytes at offset 44040192
|
||||||
|
@ -306,7 +306,7 @@ header_length 104
|
||||||
|
|
||||||
Header extension:
|
Header extension:
|
||||||
magic 0x6803f857
|
magic 0x6803f857
|
||||||
length 144
|
length 192
|
||||||
data <binary>
|
data <binary>
|
||||||
|
|
||||||
ERROR cluster 5 refcount=0 reference=1
|
ERROR cluster 5 refcount=0 reference=1
|
||||||
|
@ -335,7 +335,7 @@ header_length 104
|
||||||
|
|
||||||
Header extension:
|
Header extension:
|
||||||
magic 0x6803f857
|
magic 0x6803f857
|
||||||
length 144
|
length 192
|
||||||
data <binary>
|
data <binary>
|
||||||
|
|
||||||
read 131072/131072 bytes at offset 0
|
read 131072/131072 bytes at offset 0
|
||||||
|
|
Loading…
Reference in New Issue