Skip to content

Commit

Permalink
job: Move .complete callback to Job
Browse files Browse the repository at this point in the history
This moves the .complete callback that tells a READY job to complete
from BlockJobDriver to JobDriver. The wrapper function job_complete()
doesn't require anything block job specific any more and can be moved
to Job.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
  • Loading branch information
kevmw committed May 23, 2018
1 parent b69f777 commit 3453d97
Show file tree
Hide file tree
Showing 9 changed files with 43 additions and 48 deletions.
10 changes: 5 additions & 5 deletions block/mirror.c
Expand Up @@ -905,16 +905,16 @@ static void coroutine_fn mirror_run(void *opaque)
job_defer_to_main_loop(&s->common.job, mirror_exit, data);
}

static void mirror_complete(BlockJob *job, Error **errp)
static void mirror_complete(Job *job, Error **errp)
{
MirrorBlockJob *s = container_of(job, MirrorBlockJob, common);
MirrorBlockJob *s = container_of(job, MirrorBlockJob, common.job);
BlockDriverState *target;

target = blk_bs(s->target);

if (!s->synced) {
error_setg(errp, "The active block job '%s' cannot be completed",
job->job.id);
job->id);
return;
}

Expand Down Expand Up @@ -995,8 +995,8 @@ static const BlockJobDriver mirror_job_driver = {
.drain = block_job_drain,
.start = mirror_run,
.pause = mirror_pause,
.complete = mirror_complete,
},
.complete = mirror_complete,
.attached_aio_context = mirror_attached_aio_context,
.drain = mirror_drain,
};
Expand All @@ -1010,8 +1010,8 @@ static const BlockJobDriver commit_active_job_driver = {
.drain = block_job_drain,
.start = mirror_run,
.pause = mirror_pause,
.complete = mirror_complete,
},
.complete = mirror_complete,
.attached_aio_context = mirror_attached_aio_context,
.drain = mirror_drain,
};
Expand Down
2 changes: 1 addition & 1 deletion blockdev.c
Expand Up @@ -3894,7 +3894,7 @@ void qmp_block_job_complete(const char *device, Error **errp)
}

trace_qmp_block_job_complete(job);
block_job_complete(job, errp);
job_complete(&job->job, errp);
aio_context_release(aio_context);
}

Expand Down
23 changes: 5 additions & 18 deletions blockjob.c
Expand Up @@ -481,24 +481,6 @@ int64_t block_job_ratelimit_get_delay(BlockJob *job, uint64_t n)
return ratelimit_calculate_delay(&job->limit, n);
}

void block_job_complete(BlockJob *job, Error **errp)
{
/* Should not be reachable via external interface for internal jobs */
assert(job->job.id);
if (job_apply_verb(&job->job, JOB_VERB_COMPLETE, errp)) {
return;
}
if (job->job.pause_count || job_is_cancelled(&job->job) ||
!job->driver->complete)
{
error_setg(errp, "The active block job '%s' cannot be completed",
job->job.id);
return;
}

job->driver->complete(job, errp);
}

void block_job_finalize(BlockJob *job, Error **errp)
{
assert(job && job->job.id);
Expand Down Expand Up @@ -571,6 +553,11 @@ void block_job_cancel_sync_all(void)
}
}

static void block_job_complete(BlockJob *job, Error **errp)
{
job_complete(&job->job, errp);
}

int block_job_complete_sync(BlockJob *job, Error **errp)
{
return block_job_finish_sync(job, &block_job_complete, errp);
Expand Down
10 changes: 0 additions & 10 deletions include/block/blockjob.h
Expand Up @@ -153,16 +153,6 @@ void block_job_set_speed(BlockJob *job, int64_t speed, Error **errp);
*/
void block_job_cancel(BlockJob *job, bool force);

/**
* block_job_complete:
* @job: The job to be completed.
* @errp: Error object.
*
* Asynchronously complete the specified job.
*/
void block_job_complete(BlockJob *job, Error **errp);


/**
* block_job_finalize:
* @job: The job to fully commit and finish.
Expand Down
6 changes: 0 additions & 6 deletions include/block/blockjob_int.h
Expand Up @@ -38,12 +38,6 @@ struct BlockJobDriver {
/** Generic JobDriver callbacks and settings */
JobDriver job_driver;

/**
* Optional callback for job types whose completion must be triggered
* manually.
*/
void (*complete)(BlockJob *job, Error **errp);

/**
* If the callback is not NULL, prepare will be invoked when all the jobs
* belonging to the same transaction complete; or upon this job's completion
Expand Down
8 changes: 8 additions & 0 deletions include/qemu/job.h
Expand Up @@ -167,6 +167,12 @@ struct JobDriver {
*/
void (*user_resume)(Job *job);

/**
* Optional callback for job types whose completion must be triggered
* manually.
*/
void (*complete)(Job *job, Error **errp);

/*
* If the callback is not NULL, it will be invoked when the job has to be
* synchronously cancelled or completed; it should drain any activities
Expand Down Expand Up @@ -363,6 +369,8 @@ int job_apply_verb(Job *job, JobVerb verb, Error **errp);
/** The @job could not be started, free it. */
void job_early_fail(Job *job);

/** Asynchronously complete the specified @job. */
void job_complete(Job *job, Error **errp);;

typedef void JobDeferToMainLoopFn(Job *job, void *opaque);

Expand Down
16 changes: 16 additions & 0 deletions job.c
Expand Up @@ -556,6 +556,22 @@ int job_finalize_single(Job *job)
return 0;
}

void job_complete(Job *job, Error **errp)
{
/* Should not be reachable via external interface for internal jobs */
assert(job->id);
if (job_apply_verb(job, JOB_VERB_COMPLETE, errp)) {
return;
}
if (job->pause_count || job_is_cancelled(job) || !job->driver->complete) {
error_setg(errp, "The active block job '%s' cannot be completed",
job->id);
return;
}

job->driver->complete(job, errp);
}


typedef struct {
Job *job;
Expand Down
6 changes: 3 additions & 3 deletions tests/test-bdrv-drain.c
Expand Up @@ -514,9 +514,9 @@ static void coroutine_fn test_job_start(void *opaque)
job_defer_to_main_loop(&s->common.job, test_job_completed, NULL);
}

static void test_job_complete(BlockJob *job, Error **errp)
static void test_job_complete(Job *job, Error **errp)
{
TestBlockJob *s = container_of(job, TestBlockJob, common);
TestBlockJob *s = container_of(job, TestBlockJob, common.job);
s->should_complete = true;
}

Expand All @@ -527,8 +527,8 @@ BlockJobDriver test_job_driver = {
.user_resume = block_job_user_resume,
.drain = block_job_drain,
.start = test_job_start,
.complete = test_job_complete,
},
.complete = test_job_complete,
};

static void test_blockjob_common(enum drain_type drain_type)
Expand Down
10 changes: 5 additions & 5 deletions tests/test-blockjob.c
Expand Up @@ -171,9 +171,9 @@ static void cancel_job_completed(Job *job, void *opaque)
block_job_completed(bjob, 0);
}

static void cancel_job_complete(BlockJob *job, Error **errp)
static void cancel_job_complete(Job *job, Error **errp)
{
CancelJob *s = container_of(job, CancelJob, common);
CancelJob *s = container_of(job, CancelJob, common.job);
s->should_complete = true;
}

Expand Down Expand Up @@ -204,8 +204,8 @@ static const BlockJobDriver test_cancel_driver = {
.user_resume = block_job_user_resume,
.drain = block_job_drain,
.start = cancel_job_start,
.complete = cancel_job_complete,
},
.complete = cancel_job_complete,
};

static CancelJob *create_common(BlockJob **pjob)
Expand Down Expand Up @@ -333,7 +333,7 @@ static void test_cancel_pending(void)
block_job_enter(job);
assert(job->job.status == JOB_STATUS_READY);

block_job_complete(job, &error_abort);
job_complete(&job->job, &error_abort);
block_job_enter(job);
while (!s->completed) {
aio_poll(qemu_get_aio_context(), true);
Expand All @@ -357,7 +357,7 @@ static void test_cancel_concluded(void)
block_job_enter(job);
assert(job->job.status == JOB_STATUS_READY);

block_job_complete(job, &error_abort);
job_complete(&job->job, &error_abort);
block_job_enter(job);
while (!s->completed) {
aio_poll(qemu_get_aio_context(), true);
Expand Down

0 comments on commit 3453d97

Please sign in to comment.