Am 14.01.21 um 20:18 schrieb Jason Dillaman:
> On Sun, Dec 27, 2020 at 11:42 AM Peter Lieven <p...@kamp.de> wrote:
>> Signed-off-by: Peter Lieven <p...@kamp.de>
>> ---
>>  block/rbd.c | 21 +++++++++++++++++++--
>>  1 file changed, 19 insertions(+), 2 deletions(-)
>>
>> diff --git a/block/rbd.c b/block/rbd.c
>> index a2da70e37f..27b232f4d8 100644
>> --- a/block/rbd.c
>> +++ b/block/rbd.c
>> @@ -91,6 +91,7 @@ typedef struct BDRVRBDState {
>>      char *namespace;
>>      uint64_t image_size;
>>      uint64_t object_size;
>> +    AioContext *aio_context;
>>  } BDRVRBDState;
>>
>>  static int qemu_rbd_connect(rados_t *cluster, rados_ioctx_t *io_ctx,
>> @@ -749,6 +750,8 @@ static int qemu_rbd_open(BlockDriverState *bs, QDict 
>> *options, int flags,
>>          }
>>      }
>>
>> +    s->aio_context = bdrv_get_aio_context(bs);
>> +
>>      /* When extending regular files, we get zeros from the OS */
>>      bs->supported_truncate_flags = BDRV_REQ_ZERO_WRITE;
>>
>> @@ -839,8 +842,7 @@ static void rbd_finish_aiocb(rbd_completion_t c, RADOSCB 
>> *rcb)
>>      rcb->ret = rbd_aio_get_return_value(c);
>>      rbd_aio_release(c);
>>
>> -    replay_bh_schedule_oneshot_event(bdrv_get_aio_context(acb->common.bs),
>> -                                     rbd_finish_bh, rcb);
>> +    replay_bh_schedule_oneshot_event(acb->s->aio_context, rbd_finish_bh, 
>> rcb);
>>  }
>>
>>  static BlockAIOCB *rbd_start_aio(BlockDriverState *bs,
>> @@ -1151,6 +1153,18 @@ static const char *const 
>> qemu_rbd_strong_runtime_opts[] = {
>>      NULL
>>  };
>>
>> +static void qemu_rbd_attach_aio_context(BlockDriverState *bs,
>> +                                       AioContext *new_context)
>> +{
>> +    BDRVRBDState *s = bs->opaque;
>> +    s->aio_context = new_context;
>> +}
>> +
>> +static void qemu_rbd_detach_aio_context(BlockDriverState *bs)
>> +{
> I don't know enough about the internals of QEMU, but this seems
> suspicious to be a no-op.


You are right, I was believing attach and detach aio_context functions always 
needs to be implemented both at the same time.

Normally this is the point where internal timers will be deleted or polling an 
fd will be stopped.

We can leave it completely out or set s->aio_context = NULL if we don't want to 
omit it.


Peter




Reply via email to