From patchwork Sun Jul 3 15:06:45 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Feiran Zheng X-Patchwork-Id: 103018 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 04CCFB6F64 for ; Mon, 4 Jul 2011 01:34:50 +1000 (EST) Received: from localhost ([::1]:38508 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QdOh4-0002vW-OK for incoming@patchwork.ozlabs.org; Sun, 03 Jul 2011 11:34:47 -0400 Received: from eggs.gnu.org ([140.186.70.92]:59315) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QdOHC-0004sK-IV for qemu-devel@nongnu.org; Sun, 03 Jul 2011 11:08:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QdOHA-0004rc-It for qemu-devel@nongnu.org; Sun, 03 Jul 2011 11:08:02 -0400 Received: from mail-iy0-f173.google.com ([209.85.210.173]:59124) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QdOHA-0004pv-6Z for qemu-devel@nongnu.org; Sun, 03 Jul 2011 11:08:00 -0400 Received: by mail-iy0-f173.google.com with SMTP id 3so4487944iyb.4 for ; Sun, 03 Jul 2011 08:07:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=nj1vwCWKHvh5EQOzYsmJ1PTymDXxQtRzw8mmnpSy+P4=; b=odeO6Tv0xoWbl+KI4wwmnVevjjyAxPBlVKO2W6m5IYwCo2K/Tl6ak+vppUuNEr7V57 kbfISalLDB9IaQtJv4xUc4Df1aFnXmBLtvD8EJ3SBUYIv1ComjCmeQzTFT9cubl7mVyB XX+t08/exbZdNsCxiqZQ8pBkf6x6bBRhE87tI= Received: by 10.42.228.1 with SMTP id jc1mr5467157icb.352.1309705679862; Sun, 03 Jul 2011 08:07:59 -0700 (PDT) Received: from localhost.localdomain ([111.187.70.55]) by mx.google.com with ESMTPS id d6sm5419466icx.13.2011.07.03.08.07.56 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 03 Jul 2011 08:07:59 -0700 (PDT) From: Fam Zheng To: qemu-devel@nongnu.org Date: Sun, 3 Jul 2011 23:06:45 +0800 Message-Id: <1309705612-27079-6-git-send-email-famcool@gmail.com> X-Mailer: git-send-email 1.7.6 In-Reply-To: <1309705612-27079-1-git-send-email-famcool@gmail.com> References: <1309705612-27079-1-git-send-email-famcool@gmail.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 209.85.210.173 Cc: kwolf@redhat.com, Fam Zheng , hch@lst.de, stefanha@gmail.com Subject: [Qemu-devel] [PATCH v7 05/12] VMDK: add field BDRVVmdkState.desc_offset X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org There are several occurrence of magic number 0x200 as the descriptor offset within mono sparse image file. This is not the case for images with separate descriptor file. So a field is added to BDRVVmdkState to hold the correct value. Signed-off-by: Fam Zheng --- block/vmdk.c | 27 ++++++++++++++++++--------- 1 files changed, 18 insertions(+), 9 deletions(-) diff --git a/block/vmdk.c b/block/vmdk.c index 0b4de38..32a9e2e 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -81,6 +81,7 @@ typedef struct VmdkExtent { } VmdkExtent; typedef struct BDRVVmdkState { + int desc_offset; uint32_t parent_cid; int num_extents; /* Extent array with num_extents entries, ascend ordered by address */ @@ -174,10 +175,11 @@ static uint32_t vmdk_read_cid(BlockDriverState *bs, int parent) uint32_t cid; const char *p_name, *cid_str; size_t cid_str_size; + BDRVVmdkState *s = bs->opaque; - /* the descriptor offset = 0x200 */ - if (bdrv_pread(bs->file, 0x200, desc, DESC_SIZE) != DESC_SIZE) + if (bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE) != DESC_SIZE) { return 0; + } if (parent) { cid_str = "parentCID"; @@ -199,10 +201,12 @@ static int vmdk_write_cid(BlockDriverState *bs, uint32_t cid) { char desc[DESC_SIZE], tmp_desc[DESC_SIZE]; char *p_name, *tmp_str; + BDRVVmdkState *s = bs->opaque; - /* the descriptor offset = 0x200 */ - if (bdrv_pread(bs->file, 0x200, desc, DESC_SIZE) != DESC_SIZE) - return -1; + memset(desc, 0, sizeof(desc)); + if (bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE) != DESC_SIZE) { + return -EIO; + } tmp_str = strstr(desc,"parentCID"); pstrcpy(tmp_desc, sizeof(tmp_desc), tmp_str); @@ -212,8 +216,9 @@ static int vmdk_write_cid(BlockDriverState *bs, uint32_t cid) pstrcat(desc, sizeof(desc), tmp_desc); } - if (bdrv_pwrite_sync(bs->file, 0x200, desc, DESC_SIZE) < 0) - return -1; + if (bdrv_pwrite_sync(bs->file, s->desc_offset, desc, DESC_SIZE) < 0) { + return -EIO; + } return 0; } @@ -401,10 +406,11 @@ static int vmdk_parent_open(BlockDriverState *bs) { char *p_name; char desc[DESC_SIZE]; + BDRVVmdkState *s = bs->opaque; - /* the descriptor offset = 0x200 */ - if (bdrv_pread(bs->file, 0x200, desc, DESC_SIZE) != DESC_SIZE) + if (bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE) != DESC_SIZE) { return -1; + } if ((p_name = strstr(desc,"parentFileNameHint")) != NULL) { char *end_name; @@ -505,8 +511,10 @@ static int vmdk_open_vmdk3(BlockDriverState *bs, int flags) int ret; uint32_t magic; VMDK3Header header; + BDRVVmdkState *s = bs->opaque; VmdkExtent *extent; + s->desc_offset = 0x200; ret = bdrv_pread(bs->file, sizeof(magic), &header, sizeof(header)); if (ret < 0) { goto fail; @@ -538,6 +546,7 @@ static int vmdk_open_vmdk4(BlockDriverState *bs, int flags) BDRVVmdkState *s = bs->opaque; VmdkExtent *extent; + s->desc_offset = 0x200; ret = bdrv_pread(bs->file, sizeof(magic), &header, sizeof(header)); if (ret < 0) { goto fail;