mirror of https://github.com/xemu-project/xemu.git
vmdk: Switch to .bdrv_co_block_status()
We are gradually moving away from sector-based interfaces, towards byte-based. Update the vmdk driver accordingly. Drop the now-unused vmdk_find_index_in_cluster(). Also, fix a pre-existing bug: if find_extent() fails (unlikely, since the block layer did a bounds check), then we must return a failure, rather than 0. Signed-off-by: Eric Blake <eblake@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Reviewed-by: Fam Zheng <famz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
67635f6abe
commit
c72080b9b8
38
block/vmdk.c
38
block/vmdk.c
|
@ -1304,33 +1304,27 @@ static inline uint64_t vmdk_find_offset_in_cluster(VmdkExtent *extent,
|
||||||
return extent_relative_offset % cluster_size;
|
return extent_relative_offset % cluster_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint64_t vmdk_find_index_in_cluster(VmdkExtent *extent,
|
static int coroutine_fn vmdk_co_block_status(BlockDriverState *bs,
|
||||||
int64_t sector_num)
|
bool want_zero,
|
||||||
{
|
int64_t offset, int64_t bytes,
|
||||||
uint64_t offset;
|
int64_t *pnum, int64_t *map,
|
||||||
offset = vmdk_find_offset_in_cluster(extent, sector_num * BDRV_SECTOR_SIZE);
|
BlockDriverState **file)
|
||||||
return offset / BDRV_SECTOR_SIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int64_t coroutine_fn vmdk_co_get_block_status(BlockDriverState *bs,
|
|
||||||
int64_t sector_num, int nb_sectors, int *pnum, BlockDriverState **file)
|
|
||||||
{
|
{
|
||||||
BDRVVmdkState *s = bs->opaque;
|
BDRVVmdkState *s = bs->opaque;
|
||||||
int64_t index_in_cluster, n, ret;
|
int64_t index_in_cluster, n, ret;
|
||||||
uint64_t offset;
|
uint64_t cluster_offset;
|
||||||
VmdkExtent *extent;
|
VmdkExtent *extent;
|
||||||
|
|
||||||
extent = find_extent(s, sector_num, NULL);
|
extent = find_extent(s, offset >> BDRV_SECTOR_BITS, NULL);
|
||||||
if (!extent) {
|
if (!extent) {
|
||||||
return 0;
|
return -EIO;
|
||||||
}
|
}
|
||||||
qemu_co_mutex_lock(&s->lock);
|
qemu_co_mutex_lock(&s->lock);
|
||||||
ret = get_cluster_offset(bs, extent, NULL,
|
ret = get_cluster_offset(bs, extent, NULL, offset, false, &cluster_offset,
|
||||||
sector_num * 512, false, &offset,
|
|
||||||
0, 0);
|
0, 0);
|
||||||
qemu_co_mutex_unlock(&s->lock);
|
qemu_co_mutex_unlock(&s->lock);
|
||||||
|
|
||||||
index_in_cluster = vmdk_find_index_in_cluster(extent, sector_num);
|
index_in_cluster = vmdk_find_offset_in_cluster(extent, offset);
|
||||||
switch (ret) {
|
switch (ret) {
|
||||||
case VMDK_ERROR:
|
case VMDK_ERROR:
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
|
@ -1345,18 +1339,14 @@ static int64_t coroutine_fn vmdk_co_get_block_status(BlockDriverState *bs,
|
||||||
ret = BDRV_BLOCK_DATA;
|
ret = BDRV_BLOCK_DATA;
|
||||||
if (!extent->compressed) {
|
if (!extent->compressed) {
|
||||||
ret |= BDRV_BLOCK_OFFSET_VALID;
|
ret |= BDRV_BLOCK_OFFSET_VALID;
|
||||||
ret |= (offset + (index_in_cluster << BDRV_SECTOR_BITS))
|
*map = cluster_offset + index_in_cluster;
|
||||||
& BDRV_BLOCK_OFFSET_MASK;
|
|
||||||
}
|
}
|
||||||
*file = extent->file->bs;
|
*file = extent->file->bs;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
n = extent->cluster_sectors - index_in_cluster;
|
n = extent->cluster_sectors * BDRV_SECTOR_SIZE - index_in_cluster;
|
||||||
if (n > nb_sectors) {
|
*pnum = MIN(n, bytes);
|
||||||
n = nb_sectors;
|
|
||||||
}
|
|
||||||
*pnum = n;
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2410,7 +2400,7 @@ static BlockDriver bdrv_vmdk = {
|
||||||
.bdrv_close = vmdk_close,
|
.bdrv_close = vmdk_close,
|
||||||
.bdrv_create = vmdk_create,
|
.bdrv_create = vmdk_create,
|
||||||
.bdrv_co_flush_to_disk = vmdk_co_flush,
|
.bdrv_co_flush_to_disk = vmdk_co_flush,
|
||||||
.bdrv_co_get_block_status = vmdk_co_get_block_status,
|
.bdrv_co_block_status = vmdk_co_block_status,
|
||||||
.bdrv_get_allocated_file_size = vmdk_get_allocated_file_size,
|
.bdrv_get_allocated_file_size = vmdk_get_allocated_file_size,
|
||||||
.bdrv_has_zero_init = vmdk_has_zero_init,
|
.bdrv_has_zero_init = vmdk_has_zero_init,
|
||||||
.bdrv_get_specific_info = vmdk_get_specific_info,
|
.bdrv_get_specific_info = vmdk_get_specific_info,
|
||||||
|
|
Loading…
Reference in New Issue