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