mirror of https://github.com/xemu-project/xemu.git
block: use Error mechanism instead of -errno for block_job_create()
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 <stefanha@linux.vnet.ibm.com> Acked-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
parent
be5ea8ed44
commit
fd7f8c6537
4
block.c
4
block.c
|
@ -4083,11 +4083,13 @@ out:
|
||||||
}
|
}
|
||||||
|
|
||||||
void *block_job_create(const BlockJobType *job_type, BlockDriverState *bs,
|
void *block_job_create(const BlockJobType *job_type, BlockDriverState *bs,
|
||||||
BlockDriverCompletionFunc *cb, void *opaque)
|
BlockDriverCompletionFunc *cb, void *opaque,
|
||||||
|
Error **errp)
|
||||||
{
|
{
|
||||||
BlockJob *job;
|
BlockJob *job;
|
||||||
|
|
||||||
if (bs->job || bdrv_in_use(bs)) {
|
if (bs->job || bdrv_in_use(bs)) {
|
||||||
|
error_set(errp, QERR_DEVICE_IN_USE, bdrv_get_device_name(bs));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
bdrv_set_in_use(bs, 1);
|
bdrv_set_in_use(bs, 1);
|
||||||
|
|
|
@ -280,16 +280,16 @@ static BlockJobType stream_job_type = {
|
||||||
.set_speed = stream_set_speed,
|
.set_speed = stream_set_speed,
|
||||||
};
|
};
|
||||||
|
|
||||||
int stream_start(BlockDriverState *bs, BlockDriverState *base,
|
void stream_start(BlockDriverState *bs, BlockDriverState *base,
|
||||||
const char *base_id, BlockDriverCompletionFunc *cb,
|
const char *base_id, BlockDriverCompletionFunc *cb,
|
||||||
void *opaque)
|
void *opaque, Error **errp)
|
||||||
{
|
{
|
||||||
StreamBlockJob *s;
|
StreamBlockJob *s;
|
||||||
Coroutine *co;
|
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) {
|
if (!s) {
|
||||||
return -EBUSY; /* bs must already be in use */
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
s->base = base;
|
s->base = base;
|
||||||
|
@ -300,5 +300,4 @@ int stream_start(BlockDriverState *bs, BlockDriverState *base,
|
||||||
co = qemu_coroutine_create(stream_run);
|
co = qemu_coroutine_create(stream_run);
|
||||||
trace_stream_start(bs, base, s, co, opaque);
|
trace_stream_start(bs, base, s, co, opaque);
|
||||||
qemu_coroutine_enter(co, s);
|
qemu_coroutine_enter(co, s);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -346,6 +346,7 @@ int is_windows_drive(const char *filename);
|
||||||
* @bs: The block
|
* @bs: The block
|
||||||
* @cb: Completion function for the job.
|
* @cb: Completion function for the job.
|
||||||
* @opaque: Opaque pointer value passed to @cb.
|
* @opaque: Opaque pointer value passed to @cb.
|
||||||
|
* @errp: Error object.
|
||||||
*
|
*
|
||||||
* Create a new long-running block device job and return it. The job
|
* Create a new long-running block device job and return it. The job
|
||||||
* will call @cb asynchronously when the job completes. Note that
|
* will call @cb asynchronously when the job completes. Note that
|
||||||
|
@ -357,7 +358,8 @@ int is_windows_drive(const char *filename);
|
||||||
* called from a wrapper that is specific to the job type.
|
* called from a wrapper that is specific to the job type.
|
||||||
*/
|
*/
|
||||||
void *block_job_create(const BlockJobType *job_type, BlockDriverState *bs,
|
void *block_job_create(const BlockJobType *job_type, BlockDriverState *bs,
|
||||||
BlockDriverCompletionFunc *cb, void *opaque);
|
BlockDriverCompletionFunc *cb, void *opaque,
|
||||||
|
Error **errp);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* block_job_complete:
|
* block_job_complete:
|
||||||
|
@ -417,6 +419,7 @@ void block_job_cancel_sync(BlockJob *job);
|
||||||
* backing file if the job completes. Ignored if @base is %NULL.
|
* backing file if the job completes. Ignored if @base is %NULL.
|
||||||
* @cb: Completion function for the job.
|
* @cb: Completion function for the job.
|
||||||
* @opaque: Opaque pointer value passed to @cb.
|
* @opaque: Opaque pointer value passed to @cb.
|
||||||
|
* @errp: Error object.
|
||||||
*
|
*
|
||||||
* Start a streaming operation on @bs. Clusters that are unallocated
|
* Start a streaming operation on @bs. Clusters that are unallocated
|
||||||
* in @bs, but allocated in any image between @base and @bs (both
|
* in @bs, but allocated in any image between @base and @bs (both
|
||||||
|
@ -424,8 +427,8 @@ void block_job_cancel_sync(BlockJob *job);
|
||||||
* streaming job, the backing file of @bs will be changed to
|
* streaming job, the backing file of @bs will be changed to
|
||||||
* @base_id in the written image and to @base in the live BlockDriverState.
|
* @base_id in the written image and to @base in the live BlockDriverState.
|
||||||
*/
|
*/
|
||||||
int stream_start(BlockDriverState *bs, BlockDriverState *base,
|
void stream_start(BlockDriverState *bs, BlockDriverState *base,
|
||||||
const char *base_id, BlockDriverCompletionFunc *cb,
|
const char *base_id, BlockDriverCompletionFunc *cb,
|
||||||
void *opaque);
|
void *opaque, Error **errp);
|
||||||
|
|
||||||
#endif /* BLOCK_INT_H */
|
#endif /* BLOCK_INT_H */
|
||||||
|
|
14
blockdev.c
14
blockdev.c
|
@ -1095,7 +1095,7 @@ void qmp_block_stream(const char *device, bool has_base,
|
||||||
{
|
{
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
BlockDriverState *base_bs = NULL;
|
BlockDriverState *base_bs = NULL;
|
||||||
int ret;
|
Error *local_err = NULL;
|
||||||
|
|
||||||
bs = bdrv_find(device);
|
bs = bdrv_find(device);
|
||||||
if (!bs) {
|
if (!bs) {
|
||||||
|
@ -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);
|
stream_start(bs, base_bs, base, block_stream_cb, bs, &local_err);
|
||||||
if (ret < 0) {
|
if (error_is_set(&local_err)) {
|
||||||
switch (ret) {
|
error_propagate(errp, local_err);
|
||||||
case -EBUSY:
|
|
||||||
error_set(errp, QERR_DEVICE_IN_USE, device);
|
|
||||||
return;
|
return;
|
||||||
default:
|
|
||||||
error_set(errp, QERR_NOT_SUPPORTED);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Grab a reference so hotplug does not delete the BlockDriverState from
|
/* Grab a reference so hotplug does not delete the BlockDriverState from
|
||||||
|
|
Loading…
Reference in New Issue