From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:55180) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R0xiN-0002ed-9x for qemu-devel@nongnu.org; Tue, 06 Sep 2011 11:37:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1R0xiE-0003qe-Mq for qemu-devel@nongnu.org; Tue, 06 Sep 2011 11:37:31 -0400 Received: from mx1.redhat.com ([209.132.183.28]:59147) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R0xiE-0003qW-DO for qemu-devel@nongnu.org; Tue, 06 Sep 2011 11:37:22 -0400 From: Kevin Wolf Date: Tue, 6 Sep 2011 17:39:41 +0200 Message-Id: <1315323586-23840-27-git-send-email-kwolf@redhat.com> In-Reply-To: <1315323586-23840-1-git-send-email-kwolf@redhat.com> References: <1315323586-23840-1-git-send-email-kwolf@redhat.com> Subject: [Qemu-devel] [PATCH 26/31] VMDK: bugfix, opening vSphere 4 exported image List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: anthony@codemonkey.ws Cc: kwolf@redhat.com, qemu-devel@nongnu.org From: Fam Zheng The vSphere 4 exported image is streamOptimized extent, which is not quite correctly handled. Ignore rdgOffset when RGD flag bit not set. Signed-off-by: Fam Zheng Reviewed-by: Stefan Hajnoczi Signed-off-by: Kevin Wolf --- block/vmdk.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) diff --git a/block/vmdk.c b/block/vmdk.c index 892b18e..6c8edfc 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -31,6 +31,7 @@ #define VMDK3_MAGIC (('C' << 24) | ('O' << 16) | ('W' << 8) | 'D') #define VMDK4_MAGIC (('K' << 24) | ('D' << 16) | ('M' << 8) | 'V') #define VMDK4_COMPRESSION_DEFLATE 1 +#define VMDK4_FLAG_RGD (1 << 1) #define VMDK4_FLAG_COMPRESS (1 << 16) #define VMDK4_FLAG_MARKER (1 << 17) @@ -55,8 +56,8 @@ typedef struct { int64_t desc_offset; int64_t desc_size; int32_t num_gtes_per_gte; - int64_t rgd_offset; int64_t gd_offset; + int64_t rgd_offset; int64_t grain_offset; char filler[1]; char check_bytes[4]; @@ -420,6 +421,7 @@ static int vmdk_open_vmdk4(BlockDriverState *bs, uint32_t l1_size, l1_entry_sectors; VMDK4Header header; VmdkExtent *extent; + int64_t l1_backup_offset = 0; ret = bdrv_pread(file, sizeof(magic), &header, sizeof(header)); if (ret < 0) { @@ -435,10 +437,13 @@ static int vmdk_open_vmdk4(BlockDriverState *bs, } l1_size = (le64_to_cpu(header.capacity) + l1_entry_sectors - 1) / l1_entry_sectors; + if (le32_to_cpu(header.flags) & VMDK4_FLAG_RGD) { + l1_backup_offset = le64_to_cpu(header.rgd_offset) << 9; + } extent = vmdk_add_extent(bs, file, false, le64_to_cpu(header.capacity), le64_to_cpu(header.gd_offset) << 9, - le64_to_cpu(header.rgd_offset) << 9, + l1_backup_offset, l1_size, le32_to_cpu(header.num_gtes_per_gte), le64_to_cpu(header.granularity)); -- 1.7.6