vpc: Switch to .bdrv_co_block_status()
We are gradually moving away from sector-based interfaces, towards byte-based. Update the vpc driver accordingly. 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
c72080b9b8
commit
2f83673b57
45
block/vpc.c
45
block/vpc.c
|
@ -706,53 +706,54 @@ fail:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int64_t coroutine_fn vpc_co_get_block_status(BlockDriverState *bs,
|
static int coroutine_fn vpc_co_block_status(BlockDriverState *bs,
|
||||||
int64_t sector_num, int nb_sectors, int *pnum, BlockDriverState **file)
|
bool want_zero,
|
||||||
|
int64_t offset, int64_t bytes,
|
||||||
|
int64_t *pnum, int64_t *map,
|
||||||
|
BlockDriverState **file)
|
||||||
{
|
{
|
||||||
BDRVVPCState *s = bs->opaque;
|
BDRVVPCState *s = bs->opaque;
|
||||||
VHDFooter *footer = (VHDFooter*) s->footer_buf;
|
VHDFooter *footer = (VHDFooter*) s->footer_buf;
|
||||||
int64_t start, offset;
|
int64_t image_offset;
|
||||||
bool allocated;
|
bool allocated;
|
||||||
int64_t ret;
|
int ret;
|
||||||
int n;
|
int64_t n;
|
||||||
|
|
||||||
if (be32_to_cpu(footer->type) == VHD_FIXED) {
|
if (be32_to_cpu(footer->type) == VHD_FIXED) {
|
||||||
*pnum = nb_sectors;
|
*pnum = bytes;
|
||||||
|
*map = offset;
|
||||||
*file = bs->file->bs;
|
*file = bs->file->bs;
|
||||||
return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID |
|
return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID;
|
||||||
(sector_num << BDRV_SECTOR_BITS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
qemu_co_mutex_lock(&s->lock);
|
qemu_co_mutex_lock(&s->lock);
|
||||||
|
|
||||||
offset = get_image_offset(bs, sector_num << BDRV_SECTOR_BITS, false, NULL);
|
image_offset = get_image_offset(bs, offset, false, NULL);
|
||||||
start = offset;
|
allocated = (image_offset != -1);
|
||||||
allocated = (offset != -1);
|
|
||||||
*pnum = 0;
|
*pnum = 0;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
/* All sectors in a block are contiguous (without using the bitmap) */
|
/* All sectors in a block are contiguous (without using the bitmap) */
|
||||||
n = ROUND_UP(sector_num + 1, s->block_size / BDRV_SECTOR_SIZE)
|
n = ROUND_UP(offset + 1, s->block_size) - offset;
|
||||||
- sector_num;
|
n = MIN(n, bytes);
|
||||||
n = MIN(n, nb_sectors);
|
|
||||||
|
|
||||||
*pnum += n;
|
*pnum += n;
|
||||||
sector_num += n;
|
offset += n;
|
||||||
nb_sectors -= n;
|
bytes -= n;
|
||||||
/* *pnum can't be greater than one block for allocated
|
/* *pnum can't be greater than one block for allocated
|
||||||
* sectors since there is always a bitmap in between. */
|
* sectors since there is always a bitmap in between. */
|
||||||
if (allocated) {
|
if (allocated) {
|
||||||
*file = bs->file->bs;
|
*file = bs->file->bs;
|
||||||
ret = BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID | start;
|
*map = image_offset;
|
||||||
|
ret = BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (nb_sectors == 0) {
|
if (bytes == 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
offset = get_image_offset(bs, sector_num << BDRV_SECTOR_BITS, false,
|
image_offset = get_image_offset(bs, offset, false, NULL);
|
||||||
NULL);
|
} while (image_offset == -1);
|
||||||
} while (offset == -1);
|
|
||||||
|
|
||||||
qemu_co_mutex_unlock(&s->lock);
|
qemu_co_mutex_unlock(&s->lock);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1098,7 +1099,7 @@ static BlockDriver bdrv_vpc = {
|
||||||
|
|
||||||
.bdrv_co_preadv = vpc_co_preadv,
|
.bdrv_co_preadv = vpc_co_preadv,
|
||||||
.bdrv_co_pwritev = vpc_co_pwritev,
|
.bdrv_co_pwritev = vpc_co_pwritev,
|
||||||
.bdrv_co_get_block_status = vpc_co_get_block_status,
|
.bdrv_co_block_status = vpc_co_block_status,
|
||||||
|
|
||||||
.bdrv_get_info = vpc_get_info,
|
.bdrv_get_info = vpc_get_info,
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue