qmp: add DEVICE_TRAY_MOVED event
It's emitted whenever the tray is moved by the guest or by HMP/QMP commands. Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Acked-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
bde25388d1
commit
6f382ed226
@ -26,6 +26,24 @@ Example:
|
||||
Note: If action is "stop", a STOP event will eventually follow the
|
||||
BLOCK_IO_ERROR event.
|
||||
|
||||
DEVICE_TRAY_MOVED
|
||||
-----------------
|
||||
|
||||
It's emitted whenever the tray of a removable device is moved by the guest
|
||||
or by HMP/QMP commands.
|
||||
|
||||
Data:
|
||||
|
||||
- "device": device name (json-string)
|
||||
- "tray-open": true if the tray has been opened or false if it has been closed
|
||||
(json-bool)
|
||||
|
||||
{ "event": "DEVICE_TRAY_MOVED",
|
||||
"data": { "device": "ide1-cd0",
|
||||
"tray-open": true
|
||||
},
|
||||
"timestamp": { "seconds": 1265044230, "microseconds": 450486 } }
|
||||
|
||||
RESET
|
||||
-----
|
||||
|
||||
|
24
block.c
24
block.c
@ -972,10 +972,30 @@ void bdrv_emit_qmp_error_event(const BlockDriverState *bdrv,
|
||||
qobject_decref(data);
|
||||
}
|
||||
|
||||
static void bdrv_emit_qmp_eject_event(BlockDriverState *bs, bool ejected)
|
||||
{
|
||||
QObject *data;
|
||||
|
||||
data = qobject_from_jsonf("{ 'device': %s, 'tray-open': %i }",
|
||||
bdrv_get_device_name(bs), ejected);
|
||||
monitor_protocol_event(QEVENT_DEVICE_TRAY_MOVED, data);
|
||||
|
||||
qobject_decref(data);
|
||||
}
|
||||
|
||||
static void bdrv_dev_change_media_cb(BlockDriverState *bs, bool load)
|
||||
{
|
||||
if (bs->dev_ops && bs->dev_ops->change_media_cb) {
|
||||
bool tray_was_closed = !bdrv_dev_is_tray_open(bs);
|
||||
bs->dev_ops->change_media_cb(bs->dev_opaque, load);
|
||||
if (tray_was_closed) {
|
||||
/* tray open */
|
||||
bdrv_emit_qmp_eject_event(bs, true);
|
||||
}
|
||||
if (load) {
|
||||
/* tray close */
|
||||
bdrv_emit_qmp_eject_event(bs, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -3616,6 +3636,10 @@ void bdrv_eject(BlockDriverState *bs, bool eject_flag)
|
||||
if (drv && drv->bdrv_eject) {
|
||||
drv->bdrv_eject(bs, eject_flag);
|
||||
}
|
||||
|
||||
if (bs->device_name[0] != '\0') {
|
||||
bdrv_emit_qmp_eject_event(bs, eject_flag);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -485,6 +485,9 @@ void monitor_protocol_event(MonitorEvent event, QObject *data)
|
||||
case QEVENT_BLOCK_JOB_CANCELLED:
|
||||
event_name = "BLOCK_JOB_CANCELLED";
|
||||
break;
|
||||
case QEVENT_DEVICE_TRAY_MOVED:
|
||||
event_name = "DEVICE_TRAY_MOVED";
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user