From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:51311) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qm0QC-0003FX-1z for qemu-devel@nongnu.org; Wed, 27 Jul 2011 05:28:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Qm0QB-0001lv-4J for qemu-devel@nongnu.org; Wed, 27 Jul 2011 05:28:55 -0400 Received: from mail-yx0-f173.google.com ([209.85.213.173]:54031) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qm0QB-0001lm-1D for qemu-devel@nongnu.org; Wed, 27 Jul 2011 05:28:55 -0400 Received: by yxt3 with SMTP id 3so741089yxt.4 for ; Wed, 27 Jul 2011 02:28:54 -0700 (PDT) From: Fam Zheng Date: Wed, 27 Jul 2011 17:27:43 +0800 Message-Id: <1311758866-30029-4-git-send-email-famcool@gmail.com> In-Reply-To: <1311758866-30029-1-git-send-email-famcool@gmail.com> References: <1311758866-30029-1-git-send-email-famcool@gmail.com> Subject: [Qemu-devel] [PATCH 3/6] VMDK: separate vmdk_read_extent/vmdk_write_extent 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 Factor out read/write extent code, since there will be more things to take care of once reading/writing compressed clusters is introduced. Signed-off-by: Fam Zheng --- block/vmdk.c | 54 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 45 insertions(+), 9 deletions(-) diff --git a/block/vmdk.c b/block/vmdk.c index 9d1ae32..0d989f6 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -829,6 +829,43 @@ static int vmdk_is_allocated(BlockDriverState *bs, int64_t sector_num, return ret; } +static int vmdk_write_extent(VmdkExtent *extent, int64_t cluster_offset, + int64_t offset_in_cluster, const uint8_t *buf, + int nb_sectors, int64_t sector_num) +{ + int ret; + const uint8_t *write_buf = buf; + int write_len = nb_sectors * 512; + + ret = bdrv_pwrite(extent->file, + cluster_offset + offset_in_cluster, + write_buf, + write_len); + if (ret != write_len) { + ret = ret < 0 ? ret : -EIO; + goto out; + } + ret = 0; + out: + return ret; +} + +static int vmdk_read_extent(VmdkExtent *extent, int64_t cluster_offset, + int64_t offset_in_cluster, uint8_t *buf, + int nb_sectors) +{ + int ret; + + ret = bdrv_pread(extent->file, + cluster_offset + offset_in_cluster, + buf, nb_sectors * 512); + if (ret == nb_sectors * 512) { + return 0; + } else { + return -EIO; + } +} + static int vmdk_read(BlockDriverState *bs, int64_t sector_num, uint8_t *buf, int nb_sectors) { @@ -865,10 +902,10 @@ static int vmdk_read(BlockDriverState *bs, int64_t sector_num, memset(buf, 0, 512 * n); } } else { - ret = bdrv_pread(extent->file, - cluster_offset + index_in_cluster * 512, - buf, n * 512); - if (ret < 0) { + ret = vmdk_read_extent(extent, + cluster_offset, index_in_cluster * 512, + buf, n); + if (ret) { return ret; } } @@ -917,11 +954,10 @@ static int vmdk_write(BlockDriverState *bs, int64_t sector_num, n = nb_sectors; } - ret = bdrv_pwrite(extent->file, - cluster_offset + index_in_cluster * 512, - buf, - n * 512); - if (ret < 0) { + ret = vmdk_write_extent(extent, + cluster_offset, index_in_cluster * 512, + buf, n, sector_num); + if (ret) { return ret; } if (m_data.valid) {