From bfea65d6f229fd65c78ae4daaddf0d0711d0aedd Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Thu, 21 Nov 2013 16:27:19 +0100 Subject: [PATCH 09/14] improve debuggability of BLOCK_IO_ERROR / BLOCK_JOB_ERROR (RHEL 6->7 fwd) RH-Author: Laszlo Ersek Message-id: <1385051239-3677-4-git-send-email-lersek@redhat.com> Patchwork-id: 55837 O-Subject: [RHEL-7.0 qemu-kvm PATCH 3/3] improve debuggability of BLOCK_IO_ERROR / BLOCK_JOB_ERROR (RHEL 6->7 fwd) Bugzilla: 895041 RH-Acked-by: Paolo Bonzini RH-Acked-by: Jiri Denemark RH-Acked-by: Luiz Capitulino Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=895041 Forward-port of RHEL-6-only commit commit 1a2b98f958fb770b70fa5a244e86c93655400858 Author: Luiz Capitulino Date: Thu Nov 4 13:51:42 2010 -0200 QMP: Improve debuggability of the BLOCK_IO_ERROR event Again, the code & docs are extended to BLOCK_JOB_ERROR. In the printf() added to bdrv_emit_qmp_error_event() I could have scavenged the static global "monitor_event_names", but I would have had to make it extern (or rather add a public getter function), which I deemed too much. Signed-off-by: Laszlo Ersek --- block.c | 19 +++++++++++++++++++ QMP/qmp-events.txt | 20 ++++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) Signed-off-by: Miroslav Rezanina --- QMP/qmp-events.txt | 20 ++++++++++++++++++-- block.c | 19 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/QMP/qmp-events.txt b/QMP/qmp-events.txt index c8c6d75..fc4b7db 100644 --- a/QMP/qmp-events.txt +++ b/QMP/qmp-events.txt @@ -59,6 +59,11 @@ Data: "eperm": errno EPERM "enospc": errno ENOSPC "eother": any other errno (other than EIO, EPERM, ENOSPC) +- "__com.redhat_debug_info": RHEL7 extension containing debug information for + humans, applications should NOT read any + information from this member (json-object): + - "errno": errno value (json-int) + - "message": error message returned by strerror() (json-string) Example: @@ -66,7 +71,10 @@ Example: "data": { "device": "ide0-hd1", "operation": "write", "action": "stop", - "__com.redhat_reason": "enospc" }, + "__com.redhat_reason": "enospc", + "__com.redhat_debug_info": { + "message": "No space left on device", + "errno": 28 } } "timestamp": { "seconds": 1265044230, "microseconds": 450486 } } Note: If action is "stop", a STOP event will eventually follow the @@ -144,6 +152,11 @@ Data: "eperm": errno EPERM "enospc": errno ENOSPC "eother": any other errno (other than EIO, EPERM, ENOSPC) +- "__com.redhat_debug_info": RHEL7 extension containing debug information for + humans, applications should NOT read any + information from this member (json-object): + - "errno": errno value (json-int) + - "message": error message returned by strerror() (json-string) Example: @@ -151,7 +164,10 @@ Example: "data": { "device": "ide0-hd1", "operation": "write", "action": "stop", - "__com.redhat_reason": "enospc" }, + "__com.redhat_reason": "enospc", + "__com.redhat_debug_info": { + "message": "No space left on device", + "errno": 28 } } "timestamp": { "seconds": 1265044230, "microseconds": 450486 } } BLOCK_JOB_READY diff --git a/block.c b/block.c index 68755bf..8ef07bb 100644 --- a/block.c +++ b/block.c @@ -1748,6 +1748,18 @@ static void bdrv_put_rhel7_reason(QDict *event, int error) qdict_put(event, BDRV_REASON_KEY, qstring_from_str(reason)); } +#define BDRV_DEBUG_KEY RFQDN_REDHAT "debug_info" + +/* RHEL7 vendor extension */ +static void bdrv_put_rhel7_debug_info(QDict *event, int error) +{ + QObject *info; + + info = qobject_from_jsonf("{ 'errno': %d, 'message': %s }", error, + strerror(error)); + qdict_put_obj(event, BDRV_DEBUG_KEY, info); +} + void bdrv_emit_qmp_error_event(const BlockDriverState *bdrv, enum MonitorEvent ev, BlockErrorAction action, @@ -1771,11 +1783,18 @@ void bdrv_emit_qmp_error_event(const BlockDriverState *bdrv, abort(); } + fprintf(stderr, "%s error in device '%s': %s (%d)\n", + ev == QEVENT_BLOCK_IO_ERROR ? "block I/O" : + ev == QEVENT_BLOCK_JOB_ERROR ? "block job" : + "other block", + bdrv->device_name, strerror(error), error); + data = qobject_from_jsonf("{ 'device': %s, 'action': %s, 'operation': %s }", bdrv->device_name, action_str, is_read ? "read" : "write"); bdrv_put_rhel7_reason(qobject_to_qdict(data), error); + bdrv_put_rhel7_debug_info(qobject_to_qdict(data), error); monitor_protocol_event(ev, data); qobject_decref(data); -- 1.7.1