aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Wolf <kwolf@redhat.com>2016-09-29 18:30:53 +0200
committerKevin Wolf <kwolf@redhat.com>2016-10-07 13:34:22 +0200
commit2d76e724cf9e3f9fec6070a8af79c7ee4c2e763e (patch)
tree771cea6c18fb0f0007ab2d716023e516e329eed3
parentbbc8ea98bc8a2ba8174d106184f3089248d5ec5d (diff)
block: Add qdev ID to DEVICE_TRAY_MOVED
The event currently only contains the BlockBackend name. However, with anonymous BlockBackends, this is always the empty string. Add the qdev ID (or if none was given, the QOM path) so that the user can still see which device caused the event. Event generation has to be moved from bdrv_eject() to the BlockBackend because the BDS doesn't know the attached device, but that's easy because blk_eject() is the only user of it. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com>
-rw-r--r--block.c7
-rw-r--r--block/block-backend.c33
-rw-r--r--docs/qmp-commands.txt3
-rw-r--r--docs/qmp-events.txt6
-rw-r--r--qapi/block.json8
5 files changed, 46 insertions, 11 deletions
diff --git a/block.c b/block.c
index 40eb570389..7f3e7bcdc3 100644
--- a/block.c
+++ b/block.c
@@ -3360,17 +3360,10 @@ int bdrv_media_changed(BlockDriverState *bs)
void bdrv_eject(BlockDriverState *bs, bool eject_flag)
{
BlockDriver *drv = bs->drv;
- const char *device_name;
if (drv && drv->bdrv_eject) {
drv->bdrv_eject(bs, eject_flag);
}
-
- device_name = bdrv_get_device_name(bs);
- if (device_name[0] != '\0') {
- qapi_event_send_device_tray_moved(device_name,
- eject_flag, &error_abort);
- }
}
/**
diff --git a/block/block-backend.c b/block/block-backend.c
index d97afa1ef0..1a724a8d89 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -565,6 +565,23 @@ void *blk_get_attached_dev(BlockBackend *blk)
return blk->dev;
}
+/* Return the qdev ID, or if no ID is assigned the QOM path, of the block
+ * device attached to the BlockBackend. */
+static char *blk_get_attached_dev_id(BlockBackend *blk)
+{
+ DeviceState *dev;
+
+ assert(!blk->legacy_dev);
+ dev = blk->dev;
+
+ if (!dev) {
+ return g_strdup("");
+ } else if (dev->id) {
+ return g_strdup(dev->id);
+ }
+ return object_get_canonical_path(OBJECT(dev));
+}
+
/*
* Return the BlockBackend which has the device model @dev attached if it
* exists, else null.
@@ -612,13 +629,17 @@ void blk_dev_change_media_cb(BlockBackend *blk, bool load)
if (blk->dev_ops && blk->dev_ops->change_media_cb) {
bool tray_was_open, tray_is_open;
+ assert(!blk->legacy_dev);
+
tray_was_open = blk_dev_is_tray_open(blk);
blk->dev_ops->change_media_cb(blk->dev_opaque, load);
tray_is_open = blk_dev_is_tray_open(blk);
if (tray_was_open != tray_is_open) {
- qapi_event_send_device_tray_moved(blk_name(blk), tray_is_open,
+ char *id = blk_get_attached_dev_id(blk);
+ qapi_event_send_device_tray_moved(blk_name(blk), id, tray_is_open,
&error_abort);
+ g_free(id);
}
}
}
@@ -1316,9 +1337,19 @@ void blk_lock_medium(BlockBackend *blk, bool locked)
void blk_eject(BlockBackend *blk, bool eject_flag)
{
BlockDriverState *bs = blk_bs(blk);
+ char *id;
+
+ /* blk_eject is only called by qdevified devices */
+ assert(!blk->legacy_dev);
if (bs) {
bdrv_eject(bs, eject_flag);
+
+ id = blk_get_attached_dev_id(blk);
+ qapi_event_send_device_tray_moved(blk_name(blk), id,
+ eject_flag, &error_abort);
+ g_free(id);
+
}
}
diff --git a/docs/qmp-commands.txt b/docs/qmp-commands.txt
index e0adcebc67..e044029ffc 100644
--- a/docs/qmp-commands.txt
+++ b/docs/qmp-commands.txt
@@ -3239,6 +3239,7 @@ Example:
"microseconds": 716996 },
"event": "DEVICE_TRAY_MOVED",
"data": { "device": "ide1-cd0",
+ "id": "ide0-1-0",
"tray-open": true } }
<- { "return": {} }
@@ -3267,6 +3268,7 @@ Example:
"microseconds": 272147 },
"event": "DEVICE_TRAY_MOVED",
"data": { "device": "ide1-cd0",
+ "id": "ide0-1-0",
"tray-open": false } }
<- { "return": {} }
@@ -3303,6 +3305,7 @@ Example:
"microseconds": 549958 },
"event": "DEVICE_TRAY_MOVED",
"data": { "device": "ide1-cd0",
+ "id": "ide0-1-0",
"tray-open": true } }
<- { "return": {} }
diff --git a/docs/qmp-events.txt b/docs/qmp-events.txt
index 62a9f9ca66..e0a2365c63 100644
--- a/docs/qmp-events.txt
+++ b/docs/qmp-events.txt
@@ -220,12 +220,16 @@ or by HMP/QMP commands.
Data:
-- "device": device name (json-string)
+- "device": Block device name. This is always present for compatibility
+ reasons, but it can be empty ("") if the image does not have a
+ device name associated. (json-string)
+- "id": The name or QOM path of the guest device (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",
+ "id": "/machine/unattached/device[22]",
"tray-open": true
},
"timestamp": { "seconds": 1265044230, "microseconds": 450486 } }
diff --git a/qapi/block.json b/qapi/block.json
index c896bd1d3b..4661fc93c8 100644
--- a/qapi/block.json
+++ b/qapi/block.json
@@ -195,14 +195,18 @@
# Emitted whenever the tray of a removable device is moved by the guest or by
# HMP/QMP commands
#
-# @device: device name
+# @device: Block device name. This is always present for compatibility
+# reasons, but it can be empty ("") if the image does not
+# have a device name associated.
+#
+# @id: The name or QOM path of the guest device
#
# @tray-open: true if the tray has been opened or false if it has been closed
#
# Since: 1.1
##
{ 'event': 'DEVICE_TRAY_MOVED',
- 'data': { 'device': 'str', 'tray-open': 'bool' } }
+ 'data': { 'device': 'str', 'id': 'str', 'tray-open': 'bool' } }
##
# @QuorumOpType