mirror of https://github.com/xqemu/xqemu.git
qapi event: convert other BLOCK_JOB events
Since BLOCK_JOB_COMPLETED, BLOCK_JOB_CANCELLED, BLOCK_JOB_READY are related, convert them in one patch. The block_job_event_* functions are used to keep encapsulation of BlockJob structure. Signed-off-by: Wenchao Xia <wenchaoqemu@gmail.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
parent
c120f0fa14
commit
bcada37b19
|
@ -427,7 +427,7 @@ static void coroutine_fn mirror_run(void *opaque)
|
||||||
*/
|
*/
|
||||||
s->common.offset = end * BDRV_SECTOR_SIZE;
|
s->common.offset = end * BDRV_SECTOR_SIZE;
|
||||||
if (!s->synced) {
|
if (!s->synced) {
|
||||||
block_job_ready(&s->common);
|
block_job_event_ready(&s->common);
|
||||||
s->synced = true;
|
s->synced = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
12
blockdev.c
12
blockdev.c
|
@ -1847,23 +1847,21 @@ void qmp_block_resize(bool has_device, const char *device,
|
||||||
static void block_job_cb(void *opaque, int ret)
|
static void block_job_cb(void *opaque, int ret)
|
||||||
{
|
{
|
||||||
BlockDriverState *bs = opaque;
|
BlockDriverState *bs = opaque;
|
||||||
QObject *obj;
|
const char *msg = NULL;
|
||||||
|
|
||||||
trace_block_job_cb(bs, bs->job, ret);
|
trace_block_job_cb(bs, bs->job, ret);
|
||||||
|
|
||||||
assert(bs->job);
|
assert(bs->job);
|
||||||
obj = qobject_from_block_job(bs->job);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
QDict *dict = qobject_to_qdict(obj);
|
msg = strerror(-ret);
|
||||||
qdict_put(dict, "error", qstring_from_str(strerror(-ret)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (block_job_is_cancelled(bs->job)) {
|
if (block_job_is_cancelled(bs->job)) {
|
||||||
monitor_protocol_event(QEVENT_BLOCK_JOB_CANCELLED, obj);
|
block_job_event_cancelled(bs->job);
|
||||||
} else {
|
} else {
|
||||||
monitor_protocol_event(QEVENT_BLOCK_JOB_COMPLETED, obj);
|
block_job_event_completed(bs->job, msg);
|
||||||
}
|
}
|
||||||
qobject_decref(obj);
|
|
||||||
|
|
||||||
bdrv_put_ref_bh_schedule(bs);
|
bdrv_put_ref_bh_schedule(bs);
|
||||||
}
|
}
|
||||||
|
|
32
blockjob.c
32
blockjob.c
|
@ -26,7 +26,6 @@
|
||||||
#include "config-host.h"
|
#include "config-host.h"
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
#include "monitor/monitor.h"
|
|
||||||
#include "block/block.h"
|
#include "block/block.h"
|
||||||
#include "block/blockjob.h"
|
#include "block/blockjob.h"
|
||||||
#include "block/block_int.h"
|
#include "block/block_int.h"
|
||||||
|
@ -233,26 +232,31 @@ static void block_job_iostatus_set_err(BlockJob *job, int error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void block_job_event_cancelled(BlockJob *job)
|
||||||
QObject *qobject_from_block_job(BlockJob *job)
|
|
||||||
{
|
{
|
||||||
return qobject_from_jsonf("{ 'type': %s,"
|
qapi_event_send_block_job_cancelled(job->driver->job_type,
|
||||||
"'device': %s,"
|
|
||||||
"'len': %" PRId64 ","
|
|
||||||
"'offset': %" PRId64 ","
|
|
||||||
"'speed': %" PRId64 " }",
|
|
||||||
BlockJobType_lookup[job->driver->job_type],
|
|
||||||
bdrv_get_device_name(job->bs),
|
bdrv_get_device_name(job->bs),
|
||||||
job->len,
|
job->len,
|
||||||
job->offset,
|
job->offset,
|
||||||
job->speed);
|
job->speed,
|
||||||
|
&error_abort);
|
||||||
}
|
}
|
||||||
|
|
||||||
void block_job_ready(BlockJob *job)
|
void block_job_event_completed(BlockJob *job, const char *msg)
|
||||||
{
|
{
|
||||||
QObject *data = qobject_from_block_job(job);
|
qapi_event_send_block_job_completed(job->driver->job_type,
|
||||||
monitor_protocol_event(QEVENT_BLOCK_JOB_READY, data);
|
bdrv_get_device_name(job->bs),
|
||||||
qobject_decref(data);
|
job->len,
|
||||||
|
job->offset,
|
||||||
|
job->speed,
|
||||||
|
!!msg,
|
||||||
|
msg,
|
||||||
|
&error_abort);
|
||||||
|
}
|
||||||
|
|
||||||
|
void block_job_event_ready(BlockJob *job)
|
||||||
|
{
|
||||||
|
qapi_event_send_block_job_ready(bdrv_get_device_name(job->bs), &error_abort);
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockErrorAction block_job_error_action(BlockJob *job, BlockDriverState *bs,
|
BlockErrorAction block_job_error_action(BlockJob *job, BlockDriverState *bs,
|
||||||
|
|
|
@ -28,77 +28,6 @@ Example:
|
||||||
"data": { "actual": 944766976 },
|
"data": { "actual": 944766976 },
|
||||||
"timestamp": { "seconds": 1267020223, "microseconds": 435656 } }
|
"timestamp": { "seconds": 1267020223, "microseconds": 435656 } }
|
||||||
|
|
||||||
BLOCK_JOB_CANCELLED
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
Emitted when a block job has been cancelled.
|
|
||||||
|
|
||||||
Data:
|
|
||||||
|
|
||||||
- "type": Job type (json-string; "stream" for image streaming
|
|
||||||
"commit" for block commit)
|
|
||||||
- "device": Device name (json-string)
|
|
||||||
- "len": Maximum progress value (json-int)
|
|
||||||
- "offset": Current progress value (json-int)
|
|
||||||
On success this is equal to len.
|
|
||||||
On failure this is less than len.
|
|
||||||
- "speed": Rate limit, bytes per second (json-int)
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
{ "event": "BLOCK_JOB_CANCELLED",
|
|
||||||
"data": { "type": "stream", "device": "virtio-disk0",
|
|
||||||
"len": 10737418240, "offset": 134217728,
|
|
||||||
"speed": 0 },
|
|
||||||
"timestamp": { "seconds": 1267061043, "microseconds": 959568 } }
|
|
||||||
|
|
||||||
BLOCK_JOB_COMPLETED
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
Emitted when a block job has completed.
|
|
||||||
|
|
||||||
Data:
|
|
||||||
|
|
||||||
- "type": Job type (json-string; "stream" for image streaming
|
|
||||||
"commit" for block commit)
|
|
||||||
- "device": Device name (json-string)
|
|
||||||
- "len": Maximum progress value (json-int)
|
|
||||||
- "offset": Current progress value (json-int)
|
|
||||||
On success this is equal to len.
|
|
||||||
On failure this is less than len.
|
|
||||||
- "speed": Rate limit, bytes per second (json-int)
|
|
||||||
- "error": Error message (json-string, optional)
|
|
||||||
Only present on failure. This field contains a human-readable
|
|
||||||
error message. There are no semantics other than that streaming
|
|
||||||
has failed and clients should not try to interpret the error
|
|
||||||
string.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
{ "event": "BLOCK_JOB_COMPLETED",
|
|
||||||
"data": { "type": "stream", "device": "virtio-disk0",
|
|
||||||
"len": 10737418240, "offset": 10737418240,
|
|
||||||
"speed": 0 },
|
|
||||||
"timestamp": { "seconds": 1267061043, "microseconds": 959568 } }
|
|
||||||
|
|
||||||
BLOCK_JOB_READY
|
|
||||||
---------------
|
|
||||||
|
|
||||||
Emitted when a block job is ready to complete.
|
|
||||||
|
|
||||||
Data:
|
|
||||||
|
|
||||||
- "device": device name (json-string)
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
{ "event": "BLOCK_JOB_READY",
|
|
||||||
"data": { "device": "ide0-hd1" },
|
|
||||||
"timestamp": { "seconds": 1265044230, "microseconds": 450486 } }
|
|
||||||
|
|
||||||
Note: The "ready to complete" status is always reset by a BLOCK_JOB_ERROR
|
|
||||||
event.
|
|
||||||
|
|
||||||
GUEST_PANICKED
|
GUEST_PANICKED
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
|
|
|
@ -217,12 +217,21 @@ void block_job_pause(BlockJob *job);
|
||||||
void block_job_resume(BlockJob *job);
|
void block_job_resume(BlockJob *job);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qobject_from_block_job:
|
* block_job_event_cancle:
|
||||||
* @job: The job whose information is requested.
|
* @job: The job whose information is requested.
|
||||||
*
|
*
|
||||||
* Return a QDict corresponding to @job's query-block-jobs entry.
|
* Send a BLOCK_JOB_CANCELLED event for the specified job.
|
||||||
*/
|
*/
|
||||||
QObject *qobject_from_block_job(BlockJob *job);
|
void block_job_event_cancelled(BlockJob *job);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* block_job_ready:
|
||||||
|
* @job: The job which is now ready to complete.
|
||||||
|
* @msg: Error message. Only present on failure.
|
||||||
|
*
|
||||||
|
* Send a BLOCK_JOB_COMPLETED event for the specified job.
|
||||||
|
*/
|
||||||
|
void block_job_event_completed(BlockJob *job, const char *msg);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* block_job_ready:
|
* block_job_ready:
|
||||||
|
@ -230,7 +239,7 @@ QObject *qobject_from_block_job(BlockJob *job);
|
||||||
*
|
*
|
||||||
* Send a BLOCK_JOB_READY event for the specified job.
|
* Send a BLOCK_JOB_READY event for the specified job.
|
||||||
*/
|
*/
|
||||||
void block_job_ready(BlockJob *job);
|
void block_job_event_ready(BlockJob *job);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* block_job_is_paused:
|
* block_job_is_paused:
|
||||||
|
|
|
@ -1472,6 +1472,62 @@
|
||||||
'data': { 'device': 'str', 'operation': 'IoOperationType',
|
'data': { 'device': 'str', 'operation': 'IoOperationType',
|
||||||
'action': 'BlockErrorAction' } }
|
'action': 'BlockErrorAction' } }
|
||||||
|
|
||||||
|
##
|
||||||
|
# @BLOCK_JOB_COMPLETED
|
||||||
|
#
|
||||||
|
# Emitted when a block job has completed
|
||||||
|
#
|
||||||
|
# @type: job type
|
||||||
|
#
|
||||||
|
# @device: device name
|
||||||
|
#
|
||||||
|
# @len: maximum progress value
|
||||||
|
#
|
||||||
|
# @offset: current progress value. On success this is equal to len.
|
||||||
|
# On failure this is less than len
|
||||||
|
#
|
||||||
|
# @speed: rate limit, bytes per second
|
||||||
|
#
|
||||||
|
# @error: #optional, error message. Only present on failure. This field
|
||||||
|
# contains a human-readable error message. There are no semantics
|
||||||
|
# other than that streaming has failed and clients should not try to
|
||||||
|
# interpret the error string
|
||||||
|
#
|
||||||
|
# Since: 1.1
|
||||||
|
##
|
||||||
|
{ 'event': 'BLOCK_JOB_COMPLETED',
|
||||||
|
'data': { 'type' : 'BlockJobType',
|
||||||
|
'device': 'str',
|
||||||
|
'len' : 'int',
|
||||||
|
'offset': 'int',
|
||||||
|
'speed' : 'int',
|
||||||
|
'*error': 'str' } }
|
||||||
|
|
||||||
|
##
|
||||||
|
# @BLOCK_JOB_CANCELLED
|
||||||
|
#
|
||||||
|
# Emitted when a block job has been cancelled
|
||||||
|
#
|
||||||
|
# @type: job type
|
||||||
|
#
|
||||||
|
# @device: device name
|
||||||
|
#
|
||||||
|
# @len: maximum progress value
|
||||||
|
#
|
||||||
|
# @offset: current progress value. On success this is equal to len.
|
||||||
|
# On failure this is less than len
|
||||||
|
#
|
||||||
|
# @speed: rate limit, bytes per second
|
||||||
|
#
|
||||||
|
# Since: 1.1
|
||||||
|
##
|
||||||
|
{ 'event': 'BLOCK_JOB_CANCELLED',
|
||||||
|
'data': { 'type' : 'BlockJobType',
|
||||||
|
'device': 'str',
|
||||||
|
'len' : 'int',
|
||||||
|
'offset': 'int',
|
||||||
|
'speed' : 'int' } }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @BLOCK_JOB_ERROR
|
# @BLOCK_JOB_ERROR
|
||||||
#
|
#
|
||||||
|
@ -1489,3 +1545,18 @@
|
||||||
'data': { 'device' : 'str',
|
'data': { 'device' : 'str',
|
||||||
'operation': 'IoOperationType',
|
'operation': 'IoOperationType',
|
||||||
'action' : 'BlockdevOnError' } }
|
'action' : 'BlockdevOnError' } }
|
||||||
|
|
||||||
|
##
|
||||||
|
# @BLOCK_JOB_READY
|
||||||
|
#
|
||||||
|
# Emitted when a block job is ready to complete
|
||||||
|
#
|
||||||
|
# @device: device name
|
||||||
|
#
|
||||||
|
# Note: The "ready to complete" status is always reset by a @BLOCK_JOB_ERROR
|
||||||
|
# event
|
||||||
|
#
|
||||||
|
# Since: 1.3
|
||||||
|
##
|
||||||
|
{ 'event': 'BLOCK_JOB_READY',
|
||||||
|
'data': { 'device': 'str' } }
|
||||||
|
|
Loading…
Reference in New Issue