summaryrefslogtreecommitdiff
path: root/block.c
diff options
context:
space:
mode:
authorLuiz Capitulino <lcapitulino@redhat.com>2010-02-03 12:41:01 -0200
committerAnthony Liguori <aliguori@us.ibm.com>2010-02-10 11:57:03 -0600
commit2582bfedd2049cefd3337dad69b047669133dacd (patch)
treed8a6d114af8c3b9b81fbe8d4f784367c50b33269 /block.c
parentaa1db6edaf5ba99b6a0fa6e6a45e7568ba5fa4c9 (diff)
downloadqemu-2582bfedd2049cefd3337dad69b047669133dacd.tar.gz
qemu-2582bfedd2049cefd3337dad69b047669133dacd.tar.bz2
qemu-2582bfedd2049cefd3337dad69b047669133dacd.zip
block: BLOCK_IO_ERROR QMP event
This commit introduces the bdrv_mon_event() function, which should be called by block subsystems (eg. IDE) when a I/O error occurs, so that an QMP event is emitted. The following information is currently provided in the event: - device name - operation (ie. "read" or "write") - action taken (eg. "stop") Event example: { "event": "BLOCK_IO_ERROR", "data": { "device": "ide0-hd1", "operation": "write", "action": "stop" }, "timestamp": { "seconds": 1265044230, "microseconds": 450486 } } Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'block.c')
-rw-r--r--block.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/block.c b/block.c
index e9fd8808bb..baf646c308 100644
--- a/block.c
+++ b/block.c
@@ -1170,6 +1170,35 @@ int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
return bs->drv->bdrv_is_allocated(bs, sector_num, nb_sectors, pnum);
}
+void bdrv_mon_event(const BlockDriverState *bdrv,
+ BlockMonEventAction action, int is_read)
+{
+ QObject *data;
+ const char *action_str;
+
+ switch (action) {
+ case BDRV_ACTION_REPORT:
+ action_str = "report";
+ break;
+ case BDRV_ACTION_IGNORE:
+ action_str = "ignore";
+ break;
+ case BDRV_ACTION_STOP:
+ action_str = "stop";
+ break;
+ default:
+ abort();
+ }
+
+ data = qobject_from_jsonf("{ 'device': %s, 'action': %s, 'operation': %s }",
+ bdrv->device_name,
+ action_str,
+ is_read ? "read" : "write");
+ monitor_protocol_event(QEVENT_BLOCK_IO_ERROR, data);
+
+ qobject_decref(data);
+}
+
static void bdrv_print_dict(QObject *obj, void *opaque)
{
QDict *bs_dict;