Skip to content

Commit

Permalink
block: use Error mechanism instead of -errno for block_job_create()
Browse files Browse the repository at this point in the history
The block job API uses -errno return values internally and we convert
these to Error in the QMP functions.  This is ugly because the Error
should be created at the point where we still have all the relevant
information.  More importantly, it is hard to add new error cases to
this case since we quickly run out of -errno values without losing
information.

Go ahead and use Error directly and don't convert later.

Signed-off-by: Stefan Hajnoczi <[email protected]>
Acked-by: Kevin Wolf <[email protected]>
Signed-off-by: Luiz Capitulino <[email protected]>
  • Loading branch information
Stefan Hajnoczi authored and Luiz Capitulino committed Apr 27, 2012
1 parent be5ea8e commit fd7f8c6
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 22 deletions.
4 changes: 3 additions & 1 deletion block.c
Original file line number Diff line number Diff line change
Expand Up @@ -4083,11 +4083,13 @@ int bdrv_img_create(const char *filename, const char *fmt,
}

void *block_job_create(const BlockJobType *job_type, BlockDriverState *bs,
BlockDriverCompletionFunc *cb, void *opaque)
BlockDriverCompletionFunc *cb, void *opaque,
Error **errp)
{
BlockJob *job;

if (bs->job || bdrv_in_use(bs)) {
error_set(errp, QERR_DEVICE_IN_USE, bdrv_get_device_name(bs));
return NULL;
}
bdrv_set_in_use(bs, 1);
Expand Down
11 changes: 5 additions & 6 deletions block/stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -280,16 +280,16 @@ static BlockJobType stream_job_type = {
.set_speed = stream_set_speed,
};

int stream_start(BlockDriverState *bs, BlockDriverState *base,
const char *base_id, BlockDriverCompletionFunc *cb,
void *opaque)
void stream_start(BlockDriverState *bs, BlockDriverState *base,
const char *base_id, BlockDriverCompletionFunc *cb,
void *opaque, Error **errp)
{
StreamBlockJob *s;
Coroutine *co;

s = block_job_create(&stream_job_type, bs, cb, opaque);
s = block_job_create(&stream_job_type, bs, cb, opaque, errp);
if (!s) {
return -EBUSY; /* bs must already be in use */
return;
}

s->base = base;
Expand All @@ -300,5 +300,4 @@ int stream_start(BlockDriverState *bs, BlockDriverState *base,
co = qemu_coroutine_create(stream_run);
trace_stream_start(bs, base, s, co, opaque);
qemu_coroutine_enter(co, s);
return 0;
}
11 changes: 7 additions & 4 deletions block_int.h
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,7 @@ int is_windows_drive(const char *filename);
* @bs: The block
* @cb: Completion function for the job.
* @opaque: Opaque pointer value passed to @cb.
* @errp: Error object.
*
* Create a new long-running block device job and return it. The job
* will call @cb asynchronously when the job completes. Note that
Expand All @@ -357,7 +358,8 @@ int is_windows_drive(const char *filename);
* called from a wrapper that is specific to the job type.
*/
void *block_job_create(const BlockJobType *job_type, BlockDriverState *bs,
BlockDriverCompletionFunc *cb, void *opaque);
BlockDriverCompletionFunc *cb, void *opaque,
Error **errp);

/**
* block_job_complete:
Expand Down Expand Up @@ -417,15 +419,16 @@ void block_job_cancel_sync(BlockJob *job);
* backing file if the job completes. Ignored if @base is %NULL.
* @cb: Completion function for the job.
* @opaque: Opaque pointer value passed to @cb.
* @errp: Error object.
*
* Start a streaming operation on @bs. Clusters that are unallocated
* in @bs, but allocated in any image between @base and @bs (both
* exclusive) will be written to @bs. At the end of a successful
* streaming job, the backing file of @bs will be changed to
* @base_id in the written image and to @base in the live BlockDriverState.
*/
int stream_start(BlockDriverState *bs, BlockDriverState *base,
const char *base_id, BlockDriverCompletionFunc *cb,
void *opaque);
void stream_start(BlockDriverState *bs, BlockDriverState *base,
const char *base_id, BlockDriverCompletionFunc *cb,
void *opaque, Error **errp);

#endif /* BLOCK_INT_H */
16 changes: 5 additions & 11 deletions blockdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -1095,7 +1095,7 @@ void qmp_block_stream(const char *device, bool has_base,
{
BlockDriverState *bs;
BlockDriverState *base_bs = NULL;
int ret;
Error *local_err = NULL;

bs = bdrv_find(device);
if (!bs) {
Expand All @@ -1111,16 +1111,10 @@ void qmp_block_stream(const char *device, bool has_base,
}
}

ret = stream_start(bs, base_bs, base, block_stream_cb, bs);
if (ret < 0) {
switch (ret) {
case -EBUSY:
error_set(errp, QERR_DEVICE_IN_USE, device);
return;
default:
error_set(errp, QERR_NOT_SUPPORTED);
return;
}
stream_start(bs, base_bs, base, block_stream_cb, bs, &local_err);
if (error_is_set(&local_err)) {
error_propagate(errp, local_err);
return;
}

/* Grab a reference so hotplug does not delete the BlockDriverState from
Expand Down

0 comments on commit fd7f8c6

Please sign in to comment.