Commit 08be6fe2 authored by Kevin Wolf's avatar Kevin Wolf
Browse files

job: Add Job.aio_context



When block jobs need an AioContext, they just take it from their main
block node. Generic jobs don't have a main block node, so we need to
assign them an AioContext explicitly.

Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
Reviewed-by: default avatarJohn Snow <jsnow@redhat.com>
parent daa7f2f9
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -216,6 +216,7 @@ static void block_job_attached_aio_context(AioContext *new_context,
{
    BlockJob *job = opaque;

    job->job.aio_context = new_context;
    if (job->driver->attached_aio_context) {
        job->driver->attached_aio_context(job, new_context);
    }
@@ -247,6 +248,7 @@ static void block_job_detach_aio_context(void *opaque)
        block_job_drain(job);
    }

    job->job.aio_context = NULL;
    job_unref(&job->job);
}

@@ -899,7 +901,8 @@ void *block_job_create(const char *job_id, const BlockJobDriver *driver,
        return NULL;
    }

    job = job_create(job_id, &driver->job_driver, errp);
    job = job_create(job_id, &driver->job_driver, blk_get_aio_context(blk),
                     errp);
    if (job == NULL) {
        blk_unref(blk);
        return NULL;
+6 −1
Original line number Diff line number Diff line
@@ -47,6 +47,9 @@ typedef struct Job {
    /** Current state; See @JobStatus for details. */
    JobStatus status;

    /** AioContext to run the job coroutine in */
    AioContext *aio_context;

    /**
     * Set to true if the job should cancel itself.  The flag must
     * always be tested just before toggling the busy flag from false
@@ -79,9 +82,11 @@ struct JobDriver {
 *
 * @job_id: The id of the newly-created job, or %NULL for internal jobs
 * @driver: The class object for the newly-created job.
 * @ctx: The AioContext to run the job coroutine in.
 * @errp: Error object.
 */
void *job_create(const char *job_id, const JobDriver *driver, Error **errp);
void *job_create(const char *job_id, const JobDriver *driver, AioContext *ctx,
                 Error **errp);

/**
 * Add a reference to Job refcnt, it will be decreased with job_unref, and then
+3 −1
Original line number Diff line number Diff line
@@ -121,7 +121,8 @@ Job *job_get(const char *id)
    return NULL;
}

void *job_create(const char *job_id, const JobDriver *driver, Error **errp)
void *job_create(const char *job_id, const JobDriver *driver, AioContext *ctx,
                 Error **errp)
{
    Job *job;

@@ -140,6 +141,7 @@ void *job_create(const char *job_id, const JobDriver *driver, Error **errp)
    job->driver        = driver;
    job->id            = g_strdup(job_id);
    job->refcnt        = 1;
    job->aio_context   = ctx;

    job_state_transition(job, JOB_STATUS_CREATED);