qcow2: get rid of qcow2_backing_read1 routine
Since bdrv_co_preadv does all neccessary checks including reading after the end of the backing file, avoid duplication of verification before bdrv_co_preadv call. Signed-off-by: Edgar Kaziakhmedov <edgar.kaziakhmedov@virtuozzo.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
c200c4a470
commit
546a7dc40e
@ -1672,34 +1672,12 @@ static int64_t coroutine_fn qcow2_co_get_block_status(BlockDriverState *bs,
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* handle reading after the end of the backing file */
|
|
||||||
int qcow2_backing_read1(BlockDriverState *bs, QEMUIOVector *qiov,
|
|
||||||
int64_t offset, int bytes)
|
|
||||||
{
|
|
||||||
uint64_t bs_size = bs->total_sectors * BDRV_SECTOR_SIZE;
|
|
||||||
int n1;
|
|
||||||
|
|
||||||
if ((offset + bytes) <= bs_size) {
|
|
||||||
return bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (offset >= bs_size) {
|
|
||||||
n1 = 0;
|
|
||||||
} else {
|
|
||||||
n1 = bs_size - offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
qemu_iovec_memset(qiov, n1, 0, bytes - n1);
|
|
||||||
|
|
||||||
return n1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static coroutine_fn int qcow2_co_preadv(BlockDriverState *bs, uint64_t offset,
|
static coroutine_fn int qcow2_co_preadv(BlockDriverState *bs, uint64_t offset,
|
||||||
uint64_t bytes, QEMUIOVector *qiov,
|
uint64_t bytes, QEMUIOVector *qiov,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
BDRVQcow2State *s = bs->opaque;
|
BDRVQcow2State *s = bs->opaque;
|
||||||
int offset_in_cluster, n1;
|
int offset_in_cluster;
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int cur_bytes; /* number of bytes in current iteration */
|
unsigned int cur_bytes; /* number of bytes in current iteration */
|
||||||
uint64_t cluster_offset = 0;
|
uint64_t cluster_offset = 0;
|
||||||
@ -1734,26 +1712,13 @@ static coroutine_fn int qcow2_co_preadv(BlockDriverState *bs, uint64_t offset,
|
|||||||
case QCOW2_CLUSTER_UNALLOCATED:
|
case QCOW2_CLUSTER_UNALLOCATED:
|
||||||
|
|
||||||
if (bs->backing) {
|
if (bs->backing) {
|
||||||
/* read from the base image */
|
BLKDBG_EVENT(bs->file, BLKDBG_READ_BACKING_AIO);
|
||||||
n1 = qcow2_backing_read1(bs->backing->bs, &hd_qiov,
|
qemu_co_mutex_unlock(&s->lock);
|
||||||
offset, cur_bytes);
|
ret = bdrv_co_preadv(bs->backing, offset, cur_bytes,
|
||||||
if (n1 > 0) {
|
&hd_qiov, 0);
|
||||||
QEMUIOVector local_qiov;
|
qemu_co_mutex_lock(&s->lock);
|
||||||
|
if (ret < 0) {
|
||||||
qemu_iovec_init(&local_qiov, hd_qiov.niov);
|
goto fail;
|
||||||
qemu_iovec_concat(&local_qiov, &hd_qiov, 0, n1);
|
|
||||||
|
|
||||||
BLKDBG_EVENT(bs->file, BLKDBG_READ_BACKING_AIO);
|
|
||||||
qemu_co_mutex_unlock(&s->lock);
|
|
||||||
ret = bdrv_co_preadv(bs->backing, offset, n1,
|
|
||||||
&local_qiov, 0);
|
|
||||||
qemu_co_mutex_lock(&s->lock);
|
|
||||||
|
|
||||||
qemu_iovec_destroy(&local_qiov);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Note: in this case, no need to wait */
|
/* Note: in this case, no need to wait */
|
||||||
|
@ -528,9 +528,6 @@ uint32_t offset_to_reftable_index(BDRVQcow2State *s, uint64_t offset)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* qcow2.c functions */
|
/* qcow2.c functions */
|
||||||
int qcow2_backing_read1(BlockDriverState *bs, QEMUIOVector *qiov,
|
|
||||||
int64_t sector_num, int nb_sectors);
|
|
||||||
|
|
||||||
int64_t qcow2_refcount_metadata_size(int64_t clusters, size_t cluster_size,
|
int64_t qcow2_refcount_metadata_size(int64_t clusters, size_t cluster_size,
|
||||||
int refcount_order, bool generous_increase,
|
int refcount_order, bool generous_increase,
|
||||||
uint64_t *refblock_count);
|
uint64_t *refblock_count);
|
||||||
|
Loading…
Reference in New Issue
Block a user