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>
This commit is contained in:
parent
aa1db6edaf
commit
2582bfedd2
29
block.c
29
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);
|
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)
|
static void bdrv_print_dict(QObject *obj, void *opaque)
|
||||||
{
|
{
|
||||||
QDict *bs_dict;
|
QDict *bs_dict;
|
||||||
|
|
|
||||||
6
block.h
6
block.h
|
|
@ -44,6 +44,12 @@ typedef struct QEMUSnapshotInfo {
|
||||||
#define BDRV_SECTOR_SIZE (1 << BDRV_SECTOR_BITS)
|
#define BDRV_SECTOR_SIZE (1 << BDRV_SECTOR_BITS)
|
||||||
#define BDRV_SECTOR_MASK ~(BDRV_SECTOR_SIZE - 1);
|
#define BDRV_SECTOR_MASK ~(BDRV_SECTOR_SIZE - 1);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
BDRV_ACTION_REPORT, BDRV_ACTION_IGNORE, BDRV_ACTION_STOP
|
||||||
|
} BlockMonEventAction;
|
||||||
|
|
||||||
|
void bdrv_mon_event(const BlockDriverState *bdrv,
|
||||||
|
BlockMonEventAction action, int is_read);
|
||||||
void bdrv_info_print(Monitor *mon, const QObject *data);
|
void bdrv_info_print(Monitor *mon, const QObject *data);
|
||||||
void bdrv_info(Monitor *mon, QObject **ret_data);
|
void bdrv_info(Monitor *mon, QObject **ret_data);
|
||||||
void bdrv_stats_print(Monitor *mon, const QObject *data);
|
void bdrv_stats_print(Monitor *mon, const QObject *data);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue