mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-10-07 03:29:37 +00:00
qed: Switch to .bdrv_co_block_status()
We are gradually moving away from sector-based interfaces, towards byte-based. Update the qed driver accordingly, taking the opportunity to inline qed_is_allocated_cb() into its lone caller (the callback used to be important, until we switched qed to coroutines). There is no intent to optimize based on the want_zero flag for this format. 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
a320fb04b6
commit
b8d739fd6f
84
block/qed.c
84
block/qed.c
|
@ -688,74 +688,46 @@ finish:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct {
|
static int coroutine_fn bdrv_qed_co_block_status(BlockDriverState *bs,
|
||||||
BlockDriverState *bs;
|
bool want_zero,
|
||||||
Coroutine *co;
|
int64_t pos, int64_t bytes,
|
||||||
uint64_t pos;
|
int64_t *pnum, int64_t *map,
|
||||||
int64_t status;
|
|
||||||
int *pnum;
|
|
||||||
BlockDriverState **file;
|
|
||||||
} QEDIsAllocatedCB;
|
|
||||||
|
|
||||||
/* Called with table_lock held. */
|
|
||||||
static void qed_is_allocated_cb(void *opaque, int ret, uint64_t offset, size_t len)
|
|
||||||
{
|
|
||||||
QEDIsAllocatedCB *cb = opaque;
|
|
||||||
BDRVQEDState *s = cb->bs->opaque;
|
|
||||||
*cb->pnum = len / BDRV_SECTOR_SIZE;
|
|
||||||
switch (ret) {
|
|
||||||
case QED_CLUSTER_FOUND:
|
|
||||||
offset |= qed_offset_into_cluster(s, cb->pos);
|
|
||||||
cb->status = BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID | offset;
|
|
||||||
*cb->file = cb->bs->file->bs;
|
|
||||||
break;
|
|
||||||
case QED_CLUSTER_ZERO:
|
|
||||||
cb->status = BDRV_BLOCK_ZERO;
|
|
||||||
break;
|
|
||||||
case QED_CLUSTER_L2:
|
|
||||||
case QED_CLUSTER_L1:
|
|
||||||
cb->status = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert(ret < 0);
|
|
||||||
cb->status = ret;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cb->co) {
|
|
||||||
aio_co_wake(cb->co);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int64_t coroutine_fn bdrv_qed_co_get_block_status(BlockDriverState *bs,
|
|
||||||
int64_t sector_num,
|
|
||||||
int nb_sectors, int *pnum,
|
|
||||||
BlockDriverState **file)
|
BlockDriverState **file)
|
||||||
{
|
{
|
||||||
BDRVQEDState *s = bs->opaque;
|
BDRVQEDState *s = bs->opaque;
|
||||||
size_t len = (size_t)nb_sectors * BDRV_SECTOR_SIZE;
|
size_t len = MIN(bytes, SIZE_MAX);
|
||||||
QEDIsAllocatedCB cb = {
|
int status;
|
||||||
.bs = bs,
|
|
||||||
.pos = (uint64_t)sector_num * BDRV_SECTOR_SIZE,
|
|
||||||
.status = BDRV_BLOCK_OFFSET_MASK,
|
|
||||||
.pnum = pnum,
|
|
||||||
.file = file,
|
|
||||||
};
|
|
||||||
QEDRequest request = { .l2_table = NULL };
|
QEDRequest request = { .l2_table = NULL };
|
||||||
uint64_t offset;
|
uint64_t offset;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
qemu_co_mutex_lock(&s->table_lock);
|
qemu_co_mutex_lock(&s->table_lock);
|
||||||
ret = qed_find_cluster(s, &request, cb.pos, &len, &offset);
|
ret = qed_find_cluster(s, &request, pos, &len, &offset);
|
||||||
qed_is_allocated_cb(&cb, ret, offset, len);
|
|
||||||
|
|
||||||
/* The callback was invoked immediately */
|
*pnum = len;
|
||||||
assert(cb.status != BDRV_BLOCK_OFFSET_MASK);
|
switch (ret) {
|
||||||
|
case QED_CLUSTER_FOUND:
|
||||||
|
*map = offset | qed_offset_into_cluster(s, pos);
|
||||||
|
status = BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID;
|
||||||
|
*file = bs->file->bs;
|
||||||
|
break;
|
||||||
|
case QED_CLUSTER_ZERO:
|
||||||
|
status = BDRV_BLOCK_ZERO;
|
||||||
|
break;
|
||||||
|
case QED_CLUSTER_L2:
|
||||||
|
case QED_CLUSTER_L1:
|
||||||
|
status = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(ret < 0);
|
||||||
|
status = ret;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
qed_unref_l2_cache_entry(request.l2_table);
|
qed_unref_l2_cache_entry(request.l2_table);
|
||||||
qemu_co_mutex_unlock(&s->table_lock);
|
qemu_co_mutex_unlock(&s->table_lock);
|
||||||
|
|
||||||
return cb.status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BDRVQEDState *acb_to_s(QEDAIOCB *acb)
|
static BDRVQEDState *acb_to_s(QEDAIOCB *acb)
|
||||||
|
@ -1594,7 +1566,7 @@ static BlockDriver bdrv_qed = {
|
||||||
.bdrv_child_perm = bdrv_format_default_perms,
|
.bdrv_child_perm = bdrv_format_default_perms,
|
||||||
.bdrv_create = bdrv_qed_create,
|
.bdrv_create = bdrv_qed_create,
|
||||||
.bdrv_has_zero_init = bdrv_has_zero_init_1,
|
.bdrv_has_zero_init = bdrv_has_zero_init_1,
|
||||||
.bdrv_co_get_block_status = bdrv_qed_co_get_block_status,
|
.bdrv_co_block_status = bdrv_qed_co_block_status,
|
||||||
.bdrv_co_readv = bdrv_qed_co_readv,
|
.bdrv_co_readv = bdrv_qed_co_readv,
|
||||||
.bdrv_co_writev = bdrv_qed_co_writev,
|
.bdrv_co_writev = bdrv_qed_co_writev,
|
||||||
.bdrv_co_pwrite_zeroes = bdrv_qed_co_pwrite_zeroes,
|
.bdrv_co_pwrite_zeroes = bdrv_qed_co_pwrite_zeroes,
|
||||||
|
|
Loading…
Reference in a new issue