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);
|
||||
}
|
||||
|
||||
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;
|
||||
|
6
block.h
6
block.h
@ -44,6 +44,12 @@ typedef struct QEMUSnapshotInfo {
|
||||
#define BDRV_SECTOR_SIZE (1 << BDRV_SECTOR_BITS)
|
||||
#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(Monitor *mon, QObject **ret_data);
|
||||
void bdrv_stats_print(Monitor *mon, const QObject *data);
|
||||
|
Loading…
Reference in New Issue
Block a user