|
|
1bdc94 |
From 171f9db1f1217a217c7c13b3282b66eec7a165d1 Mon Sep 17 00:00:00 2001
|
|
|
4a2fec |
From: Luiz Capitulino <lcapitulino@redhat.com>
|
|
|
4a2fec |
Date: Wed, 15 Mar 2017 13:25:17 +0100
|
|
|
4a2fec |
Subject: qmp: add __com.redhat_reason to the BLOCK_IO_ERROR event
|
|
|
4a2fec |
|
|
|
4a2fec |
Patchwork-id: 64969
|
|
|
4a2fec |
O-Subject: [RHEL7.2 qemu-kvm-rhev PATCH 1/2] qmp: add error reason to the BLOCK_IO_ERROR event
|
|
|
4a2fec |
Bugzilla: 1199174
|
|
|
4a2fec |
RH-Acked-by: Markus Armbruster <armbru@redhat.com>
|
|
|
4a2fec |
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
|
|
4a2fec |
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
|
|
4a2fec |
|
|
|
4a2fec |
This commit forward ports the following RHEL-7.0 commit to RHEL-7.2:
|
|
|
4a2fec |
|
|
|
4a2fec |
commit 771a3a333eb0c9299a69a78ddb9c4181850b827d
|
|
|
4a2fec |
Author: Laszlo Ersek <lersek@redhat.com>
|
|
|
4a2fec |
Date: Thu Nov 21 16:27:18 2013 +0100
|
|
|
4a2fec |
|
|
|
4a2fec |
error reason in BLOCK_IO_ERROR / BLOCK_JOB_ERROR events (RHEL 6->7 fwd)
|
|
|
4a2fec |
|
|
|
4a2fec |
I had to redo the work because now events use the QAPI, but it
|
|
|
4a2fec |
was straightforward.
|
|
|
4a2fec |
|
|
|
4a2fec |
There's one significant difference though: this commit does not
|
|
|
4a2fec |
extend the BLOCK_JOB_ERROR event as did the RHEL-7.0 commit. The
|
|
|
4a2fec |
reason is that this extension was supposed to be used only by vdsm
|
|
|
4a2fec |
and I don't think there's a requirement to have the extension
|
|
|
4a2fec |
in BLOCK_JOB_ERROR too. Let's not spread it.
|
|
|
4a2fec |
|
|
|
4a2fec |
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
|
|
|
4a2fec |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
4a2fec |
|
|
|
4a2fec |
Rebase notes (2.10.0):
|
|
|
4a2fec |
- Properly updated example
|
|
|
4a2fec |
|
|
|
4a2fec |
Rebase notes (2.9.0):
|
|
|
4a2fec |
- moved documentation to schema
|
|
|
4a2fec |
|
|
|
4a2fec |
(cherry picked from commit 2f9487b60f700de33551208c543f5d3b4fa89236)
|
|
|
1bdc94 |
(cherry picked from commit e2bf476c86cf5697ef3ea6aab2249aa85b8be2cd)
|
|
|
1bdc94 |
(cherry picked from commit 025b8d9385cab3c7c00e0caf9af84722a9ac914c)
|
|
|
1bdc94 |
(cherry picked from commit 264ccd5fc938bc26362046a697ad0d535531e69b)
|
|
|
1bdc94 |
(cherry picked from commit 88802f4552223d31f0ea9cf6c943ad3b091120cd)
|
|
|
4a2fec |
---
|
|
|
4a2fec |
block/block-backend.c | 27 +++++++++++++++++++++++----
|
|
|
4a2fec |
qapi/block-core.json | 20 ++++++++++++++++++--
|
|
|
4a2fec |
2 files changed, 41 insertions(+), 6 deletions(-)
|
|
|
4a2fec |
|
|
|
4a2fec |
diff --git a/block/block-backend.c b/block/block-backend.c
|
|
|
1bdc94 |
index 681b240..fd342db 100644
|
|
|
4a2fec |
--- a/block/block-backend.c
|
|
|
4a2fec |
+++ b/block/block-backend.c
|
|
|
1bdc94 |
@@ -1650,9 +1650,25 @@ BlockErrorAction blk_get_error_action(BlockBackend *blk, bool is_read,
|
|
|
4a2fec |
}
|
|
|
4a2fec |
}
|
|
|
4a2fec |
|
|
|
4a2fec |
+/* https://bugzilla.redhat.com/show_bug.cgi?id=1199174 */
|
|
|
4a2fec |
+static RHEL7BlockErrorReason get_rhel7_error_reason(int error)
|
|
|
4a2fec |
+{
|
|
|
4a2fec |
+ switch (error) {
|
|
|
4a2fec |
+ case ENOSPC:
|
|
|
4a2fec |
+ return RHEL7_BLOCK_ERROR_REASON_ENOSPC;
|
|
|
4a2fec |
+ case EPERM:
|
|
|
4a2fec |
+ return RHEL7_BLOCK_ERROR_REASON_EPERM;
|
|
|
4a2fec |
+ case EIO:
|
|
|
4a2fec |
+ return RHEL7_BLOCK_ERROR_REASON_EIO;
|
|
|
4a2fec |
+ default:
|
|
|
4a2fec |
+ return RHEL7_BLOCK_ERROR_REASON_EOTHER;
|
|
|
4a2fec |
+ }
|
|
|
4a2fec |
+}
|
|
|
4a2fec |
+
|
|
|
4a2fec |
static void send_qmp_error_event(BlockBackend *blk,
|
|
|
4a2fec |
BlockErrorAction action,
|
|
|
4a2fec |
- bool is_read, int error)
|
|
|
4a2fec |
+ bool is_read, int error,
|
|
|
4a2fec |
+ RHEL7BlockErrorReason res)
|
|
|
4a2fec |
{
|
|
|
4a2fec |
IoOperationType optype;
|
|
|
1bdc94 |
BlockDriverState *bs = blk_bs(blk);
|
|
|
1bdc94 |
@@ -1662,7 +1678,7 @@ static void send_qmp_error_event(BlockBackend *blk,
|
|
|
1bdc94 |
bs ? bdrv_get_node_name(bs) : NULL, optype,
|
|
|
4a2fec |
action, blk_iostatus_is_enabled(blk),
|
|
|
4a2fec |
error == ENOSPC, strerror(error),
|
|
|
4a2fec |
- &error_abort);
|
|
|
4a2fec |
+ res, &error_abort);
|
|
|
4a2fec |
}
|
|
|
4a2fec |
|
|
|
4a2fec |
/* This is done by device models because, while the block layer knows
|
|
|
1bdc94 |
@@ -1672,7 +1688,10 @@ static void send_qmp_error_event(BlockBackend *blk,
|
|
|
4a2fec |
void blk_error_action(BlockBackend *blk, BlockErrorAction action,
|
|
|
4a2fec |
bool is_read, int error)
|
|
|
4a2fec |
{
|
|
|
4a2fec |
+ RHEL7BlockErrorReason res;
|
|
|
4a2fec |
+
|
|
|
4a2fec |
assert(error >= 0);
|
|
|
4a2fec |
+ res = get_rhel7_error_reason(error);
|
|
|
4a2fec |
|
|
|
4a2fec |
if (action == BLOCK_ERROR_ACTION_STOP) {
|
|
|
4a2fec |
/* First set the iostatus, so that "info block" returns an iostatus
|
|
|
1bdc94 |
@@ -1690,10 +1709,10 @@ void blk_error_action(BlockBackend *blk, BlockErrorAction action,
|
|
|
4a2fec |
* also ensures that the STOP/RESUME pair of events is emitted.
|
|
|
4a2fec |
*/
|
|
|
4a2fec |
qemu_system_vmstop_request_prepare();
|
|
|
4a2fec |
- send_qmp_error_event(blk, action, is_read, error);
|
|
|
4a2fec |
+ send_qmp_error_event(blk, action, is_read, error, res);
|
|
|
4a2fec |
qemu_system_vmstop_request(RUN_STATE_IO_ERROR);
|
|
|
4a2fec |
} else {
|
|
|
4a2fec |
- send_qmp_error_event(blk, action, is_read, error);
|
|
|
4a2fec |
+ send_qmp_error_event(blk, action, is_read, error, res);
|
|
|
4a2fec |
}
|
|
|
4a2fec |
}
|
|
|
4a2fec |
|
|
|
4a2fec |
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
|
|
1bdc94 |
index c50517b..b38d5d6 100644
|
|
|
4a2fec |
--- a/qapi/block-core.json
|
|
|
4a2fec |
+++ b/qapi/block-core.json
|
|
|
1bdc94 |
@@ -4404,6 +4404,19 @@
|
|
|
4a2fec |
'fatal' : 'bool' } }
|
|
|
4a2fec |
|
|
|
4a2fec |
##
|
|
|
4a2fec |
+# @RHEL7BlockErrorReason:
|
|
|
4a2fec |
+#
|
|
|
4a2fec |
+# Block I/O error reason
|
|
|
4a2fec |
+#
|
|
|
4a2fec |
+# @eio: errno EIO
|
|
|
4a2fec |
+# @eperm: errno EPERM
|
|
|
4a2fec |
+# @enospc: errno ENOSPC
|
|
|
4a2fec |
+# @eother: any errno other than EIO, EPERM, ENOSPC
|
|
|
4a2fec |
+##
|
|
|
4a2fec |
+{ 'enum': 'RHEL7BlockErrorReason',
|
|
|
4a2fec |
+ 'data': [ 'enospc', 'eperm', 'eio', 'eother' ] }
|
|
|
4a2fec |
+
|
|
|
4a2fec |
+##
|
|
|
4a2fec |
# @BLOCK_IO_ERROR:
|
|
|
4a2fec |
#
|
|
|
4a2fec |
# Emitted when a disk I/O error occurs
|
|
|
1bdc94 |
@@ -4430,6 +4443,8 @@
|
|
|
4a2fec |
# (This field is a debugging aid for humans, it should not
|
|
|
4a2fec |
# be parsed by applications) (since: 2.2)
|
|
|
4a2fec |
#
|
|
|
4a2fec |
+# @__com.redhat_reason: error reason
|
|
|
4a2fec |
+#
|
|
|
4a2fec |
# Note: If action is "stop", a STOP event will eventually follow the
|
|
|
4a2fec |
# BLOCK_IO_ERROR event
|
|
|
4a2fec |
#
|
|
|
1bdc94 |
@@ -4441,7 +4456,8 @@
|
|
|
4a2fec |
# "data": { "device": "ide0-hd1",
|
|
|
4a2fec |
# "node-name": "#block212",
|
|
|
4a2fec |
# "operation": "write",
|
|
|
4a2fec |
-# "action": "stop" },
|
|
|
4a2fec |
+# "action": "stop",
|
|
|
4a2fec |
+# "__com.redhat_reason": "enospc" },
|
|
|
4a2fec |
# "timestamp": { "seconds": 1265044230, "microseconds": 450486 } }
|
|
|
4a2fec |
#
|
|
|
4a2fec |
##
|
|
|
1bdc94 |
@@ -4449,7 +4465,7 @@
|
|
|
1bdc94 |
'data': { 'device': 'str', '*node-name': 'str',
|
|
|
1bdc94 |
'operation': 'IoOperationType',
|
|
|
4a2fec |
'action': 'BlockErrorAction', '*nospace': 'bool',
|
|
|
4a2fec |
- 'reason': 'str' } }
|
|
|
4a2fec |
+ 'reason': 'str', '__com.redhat_reason': 'RHEL7BlockErrorReason' } }
|
|
|
4a2fec |
|
|
|
4a2fec |
##
|
|
|
4a2fec |
# @BLOCK_JOB_COMPLETED:
|
|
|
4a2fec |
--
|
|
|
4a2fec |
1.8.3.1
|
|
|
4a2fec |
|