[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] Re: [PATCH 2/2] QMP: Introduce DISK_ERROR event
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] Re: [PATCH 2/2] QMP: Introduce DISK_ERROR event |
Date: |
Tue, 02 Feb 2010 10:30:27 +0100 |
User-agent: |
Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.5) Gecko/20091209 Fedora/3.0-4.fc12 Thunderbird/3.0 |
Am 01.02.2010 19:07, schrieb Luiz Capitulino:
> It's emitted when a disk write or read fails, some device information
> is provided. We can also provide error details in the future.
>
> Example:
>
> { "event": "DISK_ERROR",
> "data": { "device": "ide0-hd1",
> "operation": "write",
> "action": "stop" }
> "timestamp": { "seconds": 1265044230, "microseconds": 450486 } }
>
> NOTE: Adding a small reference in QMP/qmp-events.txt, but this file is
> wrong and will be replaced by proper documentation shortly.
>
> Signed-off-by: Luiz Capitulino <address@hidden>
> ---
> QMP/qmp-events.txt | 7 +++++++
> monitor.c | 3 +++
> monitor.h | 1 +
> vl.c | 34 +++++++++++++++++++++++++++++++++-
> 4 files changed, 44 insertions(+), 1 deletions(-)
>
> diff --git a/QMP/qmp-events.txt b/QMP/qmp-events.txt
> index dc48ccc..e968ef5 100644
> --- a/QMP/qmp-events.txt
> +++ b/QMP/qmp-events.txt
> @@ -43,3 +43,10 @@ Data: 'server' and 'client' keys with the same keys as
> 'query-vnc'.
>
> Description: Issued when the VNC session is made active.
> Data: 'server' and 'client' keys with the same keys as 'query-vnc'.
> +
> +7 DISK_ERROR
> +------------
> +
> +Description: Issued when a disk I/O error occurs
> +Data: 'device' (device name), 'action' (action to be taken),
> + 'operation' ("read" or "write")
> diff --git a/monitor.c b/monitor.c
> index fb7c572..82edd79 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -378,6 +378,9 @@ void monitor_protocol_event(MonitorEvent event, QObject
> *data)
> case QEVENT_VNC_DISCONNECTED:
> event_name = "VNC_DISCONNECTED";
> break;
> + case QEVENT_DISK_ERROR:
> + event_name = "DISK_ERROR";
> + break;
> default:
> abort();
> break;
> diff --git a/monitor.h b/monitor.h
> index b0f9270..beaddaf 100644
> --- a/monitor.h
> +++ b/monitor.h
> @@ -23,6 +23,7 @@ typedef enum MonitorEvent {
> QEVENT_VNC_CONNECTED,
> QEVENT_VNC_INITIALIZED,
> QEVENT_VNC_DISCONNECTED,
> + QEVENT_DISK_ERROR,
> QEVENT_MAX,
> } MonitorEvent;
>
> diff --git a/vl.c b/vl.c
> index 57c439d..1f69f56 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -1856,10 +1856,42 @@ static BlockInterfaceErrorAction drive_get_err_action(
> return is_read ? BLOCK_ERR_REPORT : BLOCK_ERR_STOP_ENOSPC;
> }
>
> +static void driver_err_event(
> + BlockInterfaceErrorAction action, int is_read, const char *device)
> +{
> + QObject *data;
> + const char *action_str;
> +
> + switch (action) {
> + case BLOCK_ERR_REPORT:
> + action_str = "report";
> + break;
> + case BLOCK_ERR_IGNORE:
> + action_str = "ignore";
> + break;
> + case BLOCK_ERR_STOP_ANY:
> + case BLOCK_ERR_STOP_ENOSPC:
> + action_str = "stop";
This is wrong. If it's BLOCK_ERR_STOP_ENOSPC, the action taken depends
on the error code. It might as well be a "report" instead of "stop" if
it was an EIO, for example.
But the problem is probably going to go away when you stop abusing a
getter function and add some calls that are explicitly made for your
requirements.
Kevin