Skip to content

Commit

Permalink
block: Add qdev ID to DEVICE_TRAY_MOVED
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Max Reitz <[email protected]>
  • Loading branch information
kevmw committed Oct 7, 2016
1 parent bbc8ea9 commit 2d76e72
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 11 deletions.
7 changes: 0 additions & 7 deletions block.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

/**
Expand Down
33 changes: 32 additions & 1 deletion block/block-backend.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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);
}
}
}
Expand Down Expand Up @@ -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);

}
}

Expand Down
3 changes: 3 additions & 0 deletions docs/qmp-commands.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3239,6 +3239,7 @@ Example:
"microseconds": 716996 },
"event": "DEVICE_TRAY_MOVED",
"data": { "device": "ide1-cd0",
"id": "ide0-1-0",
"tray-open": true } }

<- { "return": {} }
Expand Down Expand Up @@ -3267,6 +3268,7 @@ Example:
"microseconds": 272147 },
"event": "DEVICE_TRAY_MOVED",
"data": { "device": "ide1-cd0",
"id": "ide0-1-0",
"tray-open": false } }

<- { "return": {} }
Expand Down Expand Up @@ -3303,6 +3305,7 @@ Example:
"microseconds": 549958 },
"event": "DEVICE_TRAY_MOVED",
"data": { "device": "ide1-cd0",
"id": "ide0-1-0",
"tray-open": true } }

<- { "return": {} }
Expand Down
6 changes: 5 additions & 1 deletion docs/qmp-events.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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 } }
Expand Down
8 changes: 6 additions & 2 deletions qapi/block.json
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 2d76e72

Please sign in to comment.