Skip to content

Commit

Permalink
jobs: canonize Error object
Browse files Browse the repository at this point in the history
Jobs presently use both an Error object in the case of the create job,
and char strings in the case of generic errors elsewhere.

Unify the two paths as just j->err, and remove the extra argument from
job_completed. The integer error code for job_completed is kept for now,
to be removed shortly in a separate patch.

Signed-off-by: John Snow <jsnow@redhat.com>
Message-id: 20180830015734.19765-3-jsnow@redhat.com
[mreitz: Dropped a superfluous g_strdup()]
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
  • Loading branch information
jnsnow authored and XanClic committed Aug 31, 2018
1 parent f67432a commit 3d1f8b0
Show file tree
Hide file tree
Showing 11 changed files with 26 additions and 30 deletions.
2 changes: 1 addition & 1 deletion block/backup.c
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,7 @@ static void backup_complete(Job *job, void *opaque)
{
BackupCompleteData *data = opaque;

job_completed(job, data->ret, NULL);
job_completed(job, data->ret);
g_free(data);
}

Expand Down
2 changes: 1 addition & 1 deletion block/commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ static void commit_complete(Job *job, void *opaque)
* bdrv_set_backing_hd() to fail. */
block_job_remove_all_bdrv(bjob);

job_completed(job, ret, NULL);
job_completed(job, ret);
g_free(data);

/* If bdrv_drop_intermediate() didn't already do that, remove the commit
Expand Down
5 changes: 2 additions & 3 deletions block/create.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,22 +35,21 @@ typedef struct BlockdevCreateJob {
BlockDriver *drv;
BlockdevCreateOptions *opts;
int ret;
Error *err;
} BlockdevCreateJob;

static void blockdev_create_complete(Job *job, void *opaque)
{
BlockdevCreateJob *s = container_of(job, BlockdevCreateJob, common);

job_completed(job, s->ret, s->err);
job_completed(job, s->ret);
}

static int coroutine_fn blockdev_create_run(Job *job, Error **errp)
{
BlockdevCreateJob *s = container_of(job, BlockdevCreateJob, common);

job_progress_set_remaining(&s->common, 1);
s->ret = s->drv->bdrv_co_create(s->opts, &s->err);
s->ret = s->drv->bdrv_co_create(s->opts, errp);
job_progress_update(&s->common, 1);

qapi_free_BlockdevCreateOptions(s->opts);
Expand Down
2 changes: 1 addition & 1 deletion block/mirror.c
Original file line number Diff line number Diff line change
Expand Up @@ -710,7 +710,7 @@ static void mirror_exit(Job *job, void *opaque)
blk_insert_bs(bjob->blk, mirror_top_bs, &error_abort);

bs_opaque->job = NULL;
job_completed(job, data->ret, NULL);
job_completed(job, data->ret);

g_free(data);
bdrv_drained_end(src);
Expand Down
2 changes: 1 addition & 1 deletion block/stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ static void stream_complete(Job *job, void *opaque)
}

g_free(s->backing_file_str);
job_completed(job, data->ret, NULL);
job_completed(job, data->ret);
g_free(data);
}

Expand Down
14 changes: 8 additions & 6 deletions include/qemu/job.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,12 +124,16 @@ typedef struct Job {
/** Estimated progress_current value at the completion of the job */
int64_t progress_total;

/** Error string for a failed job (NULL if, and only if, job->ret == 0) */
char *error;

/** ret code passed to job_completed. */
int ret;

/**
* Error object for a failed job.
* If job->ret is nonzero and an error object was not set, it will be set
* to strerror(-job->ret) during job_completed.
*/
Error *err;

/** The completion function that will be called when the job completes. */
BlockCompletionFunc *cb;

Expand Down Expand Up @@ -484,15 +488,13 @@ void job_transition_to_ready(Job *job);
/**
* @job: The job being completed.
* @ret: The status code.
* @error: The error message for a failing job (only with @ret < 0). If @ret is
* negative, but NULL is given for @error, strerror() is used.
*
* Marks @job as completed. If @ret is non-zero, the job transaction it is part
* of is aborted. If @ret is zero, the job moves into the WAITING state. If it
* is the last job to complete in its transaction, all jobs in the transaction
* move from WAITING to PENDING.
*/
void job_completed(Job *job, int ret, Error *error);
void job_completed(Job *job, int ret);

/** Asynchronously complete the specified @job. */
void job_complete(Job *job, Error **errp);
Expand Down
5 changes: 3 additions & 2 deletions job-qmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,9 @@ static JobInfo *job_query_single(Job *job, Error **errp)
.status = job->status,
.current_progress = job->progress_current,
.total_progress = job->progress_total,
.has_error = !!job->error,
.error = g_strdup(job->error),
.has_error = !!job->err,
.error = job->err ? \
g_strdup(error_get_pretty(job->err)) : NULL,
};

return info;
Expand Down
18 changes: 6 additions & 12 deletions job.c
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,7 @@ void job_unref(Job *job)

QLIST_REMOVE(job, job_list);

g_free(job->error);
error_free(job->err);
g_free(job->id);
g_free(job);
}
Expand Down Expand Up @@ -546,7 +546,7 @@ static void coroutine_fn job_co_entry(void *opaque)

assert(job && job->driver && job->driver->run);
job_pause_point(job);
job->ret = job->driver->run(job, NULL);
job->ret = job->driver->run(job, &job->err);
}


Expand Down Expand Up @@ -666,8 +666,8 @@ static void job_update_rc(Job *job)
job->ret = -ECANCELED;
}
if (job->ret) {
if (!job->error) {
job->error = g_strdup(strerror(-job->ret));
if (!job->err) {
error_setg(&job->err, "%s", strerror(-job->ret));
}
job_state_transition(job, JOB_STATUS_ABORTING);
}
Expand Down Expand Up @@ -865,17 +865,11 @@ static void job_completed_txn_success(Job *job)
}
}

void job_completed(Job *job, int ret, Error *error)
void job_completed(Job *job, int ret)
{
assert(job && job->txn && !job_is_completed(job));

job->ret = ret;
if (error) {
assert(job->ret < 0);
job->error = g_strdup(error_get_pretty(error));
error_free(error);
}

job_update_rc(job);
trace_job_completed(job, ret, job->ret);
if (job->ret) {
Expand All @@ -893,7 +887,7 @@ void job_cancel(Job *job, bool force)
}
job_cancel_async(job, force);
if (!job_started(job)) {
job_completed(job, -ECANCELED, NULL);
job_completed(job, -ECANCELED);
} else if (job->deferred_to_main_loop) {
job_completed_txn_abort(job);
} else {
Expand Down
2 changes: 1 addition & 1 deletion tests/test-bdrv-drain.c
Original file line number Diff line number Diff line change
Expand Up @@ -754,7 +754,7 @@ typedef struct TestBlockJob {

static void test_job_completed(Job *job, void *opaque)
{
job_completed(job, 0, NULL);
job_completed(job, 0);
}

static int coroutine_fn test_job_run(Job *job, Error **errp)
Expand Down
2 changes: 1 addition & 1 deletion tests/test-blockjob-txn.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ static void test_block_job_complete(Job *job, void *opaque)
rc = -ECANCELED;
}

job_completed(job, rc, NULL);
job_completed(job, rc);
bdrv_unref(bs);
}

Expand Down
2 changes: 1 addition & 1 deletion tests/test-blockjob.c
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ static void cancel_job_completed(Job *job, void *opaque)
{
CancelJob *s = opaque;
s->completed = true;
job_completed(job, 0, NULL);
job_completed(job, 0);
}

static void cancel_job_complete(Job *job, Error **errp)
Expand Down

0 comments on commit 3d1f8b0

Please sign in to comment.