diff options
author | Fam Zheng <famcool@gmail.com> | 2011-08-12 23:19:29 +0800 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2011-09-06 12:25:32 +0200 |
commit | dd3f6ee211d248bc8cf27cc839e94dfa42348cd9 (patch) | |
tree | b0de8ceee334fb16a33dff33ce42a6efefe48241 /block | |
parent | 86c6b429bf0df583a09fc8a3286b2467d6241e7e (diff) |
VMDK: separate vmdk_read_extent/vmdk_write_extent
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 <famcool@gmail.com>
Reviewed-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/vmdk.c | 54 |
1 files changed, 45 insertions, 9 deletions
diff --git a/block/vmdk.c b/block/vmdk.c index 49473f6d44..106fdbd2de 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -833,6 +833,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) { @@ -869,10 +906,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; } } @@ -921,11 +958,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) { |