提交 6850dd94 编写于 作者: T ths

Support for Bochs "growing" images, by Volker Ruppert.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2296 c046a42c-6fe2-441c-8c8c-71466251a162
上级 b9209030
...@@ -28,7 +28,8 @@ ...@@ -28,7 +28,8 @@
/**************************************************************/ /**************************************************************/
#define HEADER_MAGIC "Bochs Virtual HD Image" #define HEADER_MAGIC "Bochs Virtual HD Image"
#define HEADER_VERSION 0x00010000 #define HEADER_VERSION 0x00020000
#define HEADER_V1 0x00010000
#define HEADER_SIZE 512 #define HEADER_SIZE 512
#define REDOLOG_TYPE "Redolog" #define REDOLOG_TYPE "Redolog"
...@@ -37,7 +38,7 @@ ...@@ -37,7 +38,7 @@
// not allocated: 0xffffffff // not allocated: 0xffffffff
// always little-endian // always little-endian
struct bochs_header { struct bochs_header_v1 {
char magic[32]; // "Bochs Virtual HD Image" char magic[32]; // "Bochs Virtual HD Image"
char type[16]; // "Redolog" char type[16]; // "Redolog"
char subtype[16]; // "Undoable" / "Volatile" / "Growing" char subtype[16]; // "Undoable" / "Volatile" / "Growing"
...@@ -56,6 +57,27 @@ struct bochs_header { ...@@ -56,6 +57,27 @@ struct bochs_header {
} extra; } extra;
}; };
// always little-endian
struct bochs_header {
char magic[32]; // "Bochs Virtual HD Image"
char type[16]; // "Redolog"
char subtype[16]; // "Undoable" / "Volatile" / "Growing"
uint32_t version;
uint32_t header; // size of header
union {
struct {
uint32_t catalog; // num of entries
uint32_t bitmap; // bitmap size
uint32_t extent; // extent size
uint32_t reserved; // for ???
uint64_t disk; // disk size
char padding[HEADER_SIZE - 64 - 8 - 24];
} redolog;
char padding[HEADER_SIZE - 64 - 8];
} extra;
};
typedef struct BDRVBochsState { typedef struct BDRVBochsState {
int fd; int fd;
...@@ -79,7 +101,8 @@ static int bochs_probe(const uint8_t *buf, int buf_size, const char *filename) ...@@ -79,7 +101,8 @@ static int bochs_probe(const uint8_t *buf, int buf_size, const char *filename)
if (!strcmp(bochs->magic, HEADER_MAGIC) && if (!strcmp(bochs->magic, HEADER_MAGIC) &&
!strcmp(bochs->type, REDOLOG_TYPE) && !strcmp(bochs->type, REDOLOG_TYPE) &&
!strcmp(bochs->subtype, GROWING_TYPE) && !strcmp(bochs->subtype, GROWING_TYPE) &&
(le32_to_cpu(bochs->version) == HEADER_VERSION)) ((le32_to_cpu(bochs->version) == HEADER_VERSION) ||
(le32_to_cpu(bochs->version) == HEADER_V1)))
return 100; return 100;
return 0; return 0;
...@@ -90,6 +113,7 @@ static int bochs_open(BlockDriverState *bs, const char *filename, int flags) ...@@ -90,6 +113,7 @@ static int bochs_open(BlockDriverState *bs, const char *filename, int flags)
BDRVBochsState *s = bs->opaque; BDRVBochsState *s = bs->opaque;
int fd, i; int fd, i;
struct bochs_header bochs; struct bochs_header bochs;
struct bochs_header_v1 header_v1;
fd = open(filename, O_RDWR | O_BINARY); fd = open(filename, O_RDWR | O_BINARY);
if (fd < 0) { if (fd < 0) {
...@@ -109,11 +133,17 @@ static int bochs_open(BlockDriverState *bs, const char *filename, int flags) ...@@ -109,11 +133,17 @@ static int bochs_open(BlockDriverState *bs, const char *filename, int flags)
if (strcmp(bochs.magic, HEADER_MAGIC) || if (strcmp(bochs.magic, HEADER_MAGIC) ||
strcmp(bochs.type, REDOLOG_TYPE) || strcmp(bochs.type, REDOLOG_TYPE) ||
strcmp(bochs.subtype, GROWING_TYPE) || strcmp(bochs.subtype, GROWING_TYPE) ||
(le32_to_cpu(bochs.version) != HEADER_VERSION)) { ((le32_to_cpu(bochs.version) != HEADER_VERSION) &&
(le32_to_cpu(bochs.version) != HEADER_V1))) {
goto fail; goto fail;
} }
bs->total_sectors = le64_to_cpu(bochs.extra.redolog.disk) / 512; if (le32_to_cpu(bochs.version) == HEADER_V1) {
memcpy(&header_v1, &bochs, sizeof(bochs));
bs->total_sectors = le64_to_cpu(header_v1.extra.redolog.disk) / 512;
} else {
bs->total_sectors = le64_to_cpu(bochs.extra.redolog.disk) / 512;
}
lseek(s->fd, le32_to_cpu(bochs.header), SEEK_SET); lseek(s->fd, le32_to_cpu(bochs.header), SEEK_SET);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册