nbd/server.c: add coroutine_fn annotations
These functions end up calling bdrv_*() implemented as generated_co_wrapper functions. In addition, they also happen to be always called in coroutine context, meaning all callers are coroutine_fn. This means that the g_c_w function will enter the qemu_in_coroutine() case and eventually suspend (or in other words call qemu_coroutine_yield()). Therefore we can mark such functions coroutine_fn too. Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> Message-Id: <20221128142337.657646-4-eesposit@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
43a0d4f08b
commit
6f58ac5539
29
nbd/server.c
29
nbd/server.c
@ -2138,14 +2138,15 @@ static int nbd_extent_array_add(NBDExtentArray *ea,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int blockstatus_to_extents(BlockDriverState *bs, uint64_t offset,
|
static int coroutine_fn blockstatus_to_extents(BlockDriverState *bs,
|
||||||
uint64_t bytes, NBDExtentArray *ea)
|
uint64_t offset, uint64_t bytes,
|
||||||
|
NBDExtentArray *ea)
|
||||||
{
|
{
|
||||||
while (bytes) {
|
while (bytes) {
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
int64_t num;
|
int64_t num;
|
||||||
int ret = bdrv_block_status_above(bs, NULL, offset, bytes, &num,
|
int ret = bdrv_co_block_status_above(bs, NULL, offset, bytes, &num,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return ret;
|
return ret;
|
||||||
@ -2165,13 +2166,14 @@ static int blockstatus_to_extents(BlockDriverState *bs, uint64_t offset,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int blockalloc_to_extents(BlockDriverState *bs, uint64_t offset,
|
static int coroutine_fn blockalloc_to_extents(BlockDriverState *bs,
|
||||||
uint64_t bytes, NBDExtentArray *ea)
|
uint64_t offset, uint64_t bytes,
|
||||||
|
NBDExtentArray *ea)
|
||||||
{
|
{
|
||||||
while (bytes) {
|
while (bytes) {
|
||||||
int64_t num;
|
int64_t num;
|
||||||
int ret = bdrv_is_allocated_above(bs, NULL, false, offset, bytes,
|
int ret = bdrv_co_is_allocated_above(bs, NULL, false, offset, bytes,
|
||||||
&num);
|
&num);
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return ret;
|
return ret;
|
||||||
@ -2217,11 +2219,12 @@ static int nbd_co_send_extents(NBDClient *client, uint64_t handle,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Get block status from the exported device and send it to the client */
|
/* Get block status from the exported device and send it to the client */
|
||||||
static int nbd_co_send_block_status(NBDClient *client, uint64_t handle,
|
static int
|
||||||
BlockDriverState *bs, uint64_t offset,
|
coroutine_fn nbd_co_send_block_status(NBDClient *client, uint64_t handle,
|
||||||
uint32_t length, bool dont_fragment,
|
BlockDriverState *bs, uint64_t offset,
|
||||||
bool last, uint32_t context_id,
|
uint32_t length, bool dont_fragment,
|
||||||
Error **errp)
|
bool last, uint32_t context_id,
|
||||||
|
Error **errp)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned int nb_extents = dont_fragment ? 1 : NBD_MAX_BLOCK_STATUS_EXTENTS;
|
unsigned int nb_extents = dont_fragment ? 1 : NBD_MAX_BLOCK_STATUS_EXTENTS;
|
||||||
|
Loading…
Reference in New Issue
Block a user