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>
This commit is contained in:
parent
86c6b429bf
commit
dd3f6ee211
54
block/vmdk.c
54
block/vmdk.c
|
@ -833,6 +833,43 @@ static int vmdk_is_allocated(BlockDriverState *bs, int64_t sector_num,
|
||||||
return ret;
|
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,
|
static int vmdk_read(BlockDriverState *bs, int64_t sector_num,
|
||||||
uint8_t *buf, int nb_sectors)
|
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);
|
memset(buf, 0, 512 * n);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ret = bdrv_pread(extent->file,
|
ret = vmdk_read_extent(extent,
|
||||||
cluster_offset + index_in_cluster * 512,
|
cluster_offset, index_in_cluster * 512,
|
||||||
buf, n * 512);
|
buf, n);
|
||||||
if (ret < 0) {
|
if (ret) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -921,11 +958,10 @@ static int vmdk_write(BlockDriverState *bs, int64_t sector_num,
|
||||||
n = nb_sectors;
|
n = nb_sectors;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = bdrv_pwrite(extent->file,
|
ret = vmdk_write_extent(extent,
|
||||||
cluster_offset + index_in_cluster * 512,
|
cluster_offset, index_in_cluster * 512,
|
||||||
buf,
|
buf, n, sector_num);
|
||||||
n * 512);
|
if (ret) {
|
||||||
if (ret < 0) {
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
if (m_data.valid) {
|
if (m_data.valid) {
|
||||||
|
|
Loading…
Reference in New Issue