On Tue, 06/14 19:17, Stefan Hajnoczi wrote:
>  
> +static void block_job_attached_aio_context(AioContext *new_context,
> +                                           void *opaque)
> +{
> +    BlockJob *job = opaque;
> +
> +    if (job->driver->attached_aio_context) {
> +        job->driver->attached_aio_context(job, new_context);
> +    }
> +
> +    block_job_resume(job);
> +}
> +
> +static void block_job_detach_aio_context(void *opaque)
> +{
> +    BlockJob *job = opaque;
> +
> +    /* In case the job terminates during aio_poll()... */
> +    block_job_ref(job);
> +
> +    block_job_pause(job);
> +
> +    if (!job->paused) {
> +        /* If job is !job->busy this kicks it into the next pause point. */
> +        block_job_enter(job);
> +    }
> +    while (!job->paused && !job->completed) {
> +        aio_poll(blk_get_aio_context(job->blk), true);

For the complete part, we should do it like block_job_finish_sync:

    while (!job->completed) {
        aio_poll(job->deferred_to_main_loop ? qemu_get_aio_context() :
                                              blk_get_aio_context(job->blk),
                 true);
    }

> +    }
> +
> +    block_job_unref(job);
> +}
> +

Fam

Reply via email to