[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 7/8] VMDK: bugfix, open Haiku vmdk image
From: |
Fam Zheng |
Subject: |
[Qemu-devel] [PATCH v3 7/8] VMDK: bugfix, open Haiku vmdk image |
Date: |
Fri, 12 Aug 2011 23:19:33 +0800 |
Haiku provides a specially formed vmdk image, which let qemu abort. It a
combination of sparse header and flat data (i.e. with not l1/l2 table at
all). The fix is turn to descriptor when sparse header is zero in field
'capacity'.
Signed-off-by: Fam Zheng <address@hidden>
---
block/vmdk.c | 15 +++++++++++----
1 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/block/vmdk.c b/block/vmdk.c
index 7b1ae82..ad45b2f 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -408,6 +408,9 @@ static int vmdk_open_vmdk3(BlockDriverState *bs,
return ret;
}
+static int vmdk_open_desc_file(BlockDriverState *bs, int flags,
+ int64_t desc_offset);
+
static int vmdk_open_vmdk4(BlockDriverState *bs,
BlockDriverState *file,
int flags)
@@ -422,6 +425,9 @@ static int vmdk_open_vmdk4(BlockDriverState *bs,
if (ret < 0) {
return ret;
}
+ if (header.capacity == 0 && header.desc_offset) {
+ return vmdk_open_desc_file(bs, flags, header.desc_offset << 9);
+ }
l1_entry_sectors = le32_to_cpu(header.num_gtes_per_gte)
* le64_to_cpu(header.granularity);
if (l1_entry_sectors <= 0) {
@@ -559,7 +565,7 @@ static int vmdk_parse_extents(const char *desc,
BlockDriverState *bs,
extent = vmdk_add_extent(bs, extent_file, true, sectors,
0, 0, 0, 0, sectors);
- extent->flat_start_offset = flat_offset;
+ extent->flat_start_offset = flat_offset << 9;
} else if (!strcmp(type, "SPARSE")) {
/* SPARSE extent */
ret = vmdk_open_sparse(bs, extent_file, bs->open_flags);
@@ -582,14 +588,15 @@ next_line:
return 0;
}
-static int vmdk_open_desc_file(BlockDriverState *bs, int flags)
+static int vmdk_open_desc_file(BlockDriverState *bs, int flags,
+ int64_t desc_offset)
{
int ret;
char buf[2048];
char ct[128];
BDRVVmdkState *s = bs->opaque;
- ret = bdrv_pread(bs->file, 0, buf, sizeof(buf));
+ ret = bdrv_pread(bs->file, desc_offset, buf, sizeof(buf));
if (ret < 0) {
return ret;
}
@@ -635,7 +642,7 @@ static int vmdk_open(BlockDriverState *bs, int flags)
s->parent_cid = vmdk_read_cid(bs, 1);
return 0;
} else {
- return vmdk_open_desc_file(bs, flags);
+ return vmdk_open_desc_file(bs, flags, 0);
}
}
- [Qemu-devel] [PATCH v3 0/8] Add various VMDK subformats support, Fam Zheng, 2011/08/12
- [Qemu-devel] [PATCH v3 1/8] VMDK: enable twoGbMaxExtentFlat, Fam Zheng, 2011/08/12
- [Qemu-devel] [PATCH v3 2/8] VMDK: add twoGbMaxExtentSparse support, Fam Zheng, 2011/08/12
- [Qemu-devel] [PATCH v3 3/8] VMDK: separate vmdk_read_extent/vmdk_write_extent, Fam Zheng, 2011/08/12
- [Qemu-devel] [PATCH v3 4/8] VMDK: Opening compressed extent., Fam Zheng, 2011/08/12
- [Qemu-devel] [PATCH v3 5/8] VMDK: read/write compressed extent, Fam Zheng, 2011/08/12
- [Qemu-devel] [PATCH v3 6/8] VMDK: creating streamOptimized subformat, Fam Zheng, 2011/08/12
- [Qemu-devel] [PATCH v3 7/8] VMDK: bugfix, open Haiku vmdk image,
Fam Zheng <=
- [Qemu-devel] [PATCH v3 8/8] VMDK: bugfix, opening vSphere 4 exported image, Fam Zheng, 2011/08/12