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:
Eric Blake 2018-02-13 14:26:59 -06:00 committed by Kevin Wolf
parent c72080b9b8
commit 2f83673b57
1 changed files with 23 additions and 22 deletions

View File

@ -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,