From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:52798) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QrtXT-00058l-4J for qemu-devel@nongnu.org; Fri, 12 Aug 2011 11:20:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QrtXR-00023j-Qr for qemu-devel@nongnu.org; Fri, 12 Aug 2011 11:20:46 -0400 Received: from mail-pz0-f42.google.com ([209.85.210.42]:65257) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QrtXR-0001yO-EM for qemu-devel@nongnu.org; Fri, 12 Aug 2011 11:20:45 -0400 Received: by mail-pz0-f42.google.com with SMTP id 37so6748610pzk.29 for ; Fri, 12 Aug 2011 08:20:45 -0700 (PDT) From: Fam Zheng Date: Fri, 12 Aug 2011 23:19:34 +0800 Message-Id: <1313162374-13147-9-git-send-email-famcool@gmail.com> In-Reply-To: <1313162374-13147-1-git-send-email-famcool@gmail.com> References: <1313162374-13147-1-git-send-email-famcool@gmail.com> Subject: [Qemu-devel] [PATCH v3 8/8] VMDK: bugfix, opening vSphere 4 exported image List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, Fam Zheng , hch@lst.de, stefanha@gmail.com 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 --- block/vmdk.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) diff --git a/block/vmdk.c b/block/vmdk.c index ad45b2f..e03603e 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));