提交 93c24936 编写于 作者: K Kevin Wolf

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: NKevin Wolf <kwolf@redhat.com>
上级 65a3d073
...@@ -73,6 +73,7 @@ typedef struct { ...@@ -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, ...@@ -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) ...@@ -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 { ...@@ -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_MASK = QCOW2_INCOMPAT_DIRTY QCOW2_INCOMPAT_DATA_FILE = 1 << QCOW2_INCOMPAT_DATA_FILE_BITNR,
| QCOW2_INCOMPAT_CORRUPT,
QCOW2_INCOMPAT_MASK = QCOW2_INCOMPAT_DIRTY
| QCOW2_INCOMPAT_CORRUPT,
}; };
/* Compatible feature bits */ /* Compatible feature bits */
...@@ -216,10 +218,12 @@ enum { ...@@ -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 { ...@@ -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 { ...@@ -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 ...@@ -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 ...@@ -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. ...@@ -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' ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册