On Fri, Mar 19, 2010 at 03:39:00PM +0000, Daniel P. Berrange wrote:
This introduces a new event type
VIR_DOMAIN_EVENT_ID_IO_ERROR
This event includes the action that is about to be taken
as a result of the watchdog triggering
typedef enum {
VIR_DOMAIN_EVENT_IO_ERROR_NONE = 0,
VIR_DOMAIN_EVENT_IO_ERROR_PAUSE,
VIR_DOMAIN_EVENT_IO_ERROR_REPORT,
} virDomainEventIOErrorAction;
okay
In addition is has the source path of the disk that had the
error and its unique device alias. It does not include the
target device name (/dev/sda), since this would preclude
triggering IO errors from other file backed devices (eg
serial ports connected to a file)
Thus there is a new callback definition for this event type
typedef void (*virConnectDomainEventIOErrorCallback)(virConnectPtr conn,
virDomainPtr dom,
const char *srcPath,
const char *devAlias,
int action,
void *opaque);
okay
[...]
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
@@ -1858,6 +1858,17 @@ typedef void
(*virConnectDomainEventWatchdogCallback)(virConnectPtr conn,
virDomainPtr dom,
int action,
void *opaque);
+typedef enum {
+ VIR_DOMAIN_EVENT_IO_ERROR_NONE = 0,
+ VIR_DOMAIN_EVENT_IO_ERROR_PAUSE,
+ VIR_DOMAIN_EVENT_IO_ERROR_REPORT,
+} virDomainEventIOErrorAction;
again let's describe the parameters in the header as this is the only
place (beside those list archives) where the semantic is described
+typedef void (*virConnectDomainEventIOErrorCallback)(virConnectPtr
conn,
+ virDomainPtr dom,
+ const char *srcPath,
+ const char *devAlias,
+ int action,
+ void *opaque);
/* Use this to cast the event specific callback into the generic one
* for use for virDomainEventRegister */
@@ -1869,6 +1880,7 @@ typedef enum {
VIR_DOMAIN_EVENT_ID_REBOOT = 1, /* virConnectDomainEventGenericCallback */
VIR_DOMAIN_EVENT_ID_RTC_CHANGE = 2, /* virConnectDomainEventRTCChangeCallback
*/
VIR_DOMAIN_EVENT_ID_WATCHDOG = 3, /* virConnectDomainEventWatchdogCallback
*/
+ VIR_DOMAIN_EVENT_ID_IO_ERROR = 4, /* virConnectDomainEventIOErrorCallback */
/*
* NB: this enum value will increase over time as new events are
[...]
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index ceba5db..71cca5c 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -747,6 +747,26 @@ findDomainDiskByPath(virDomainObjPtr vm,
return NULL;
}
+static virDomainDiskDefPtr
+findDomainDiskByAlias(virDomainObjPtr vm,
+ const char *alias)
+{
+ int i;
+
+ for (i = 0; i < vm->def->ndisks; i++) {
+ virDomainDiskDefPtr disk;
+
+ disk = vm->def->disks[i];
+ if (disk->info.alias != NULL && STREQ(disk->info.alias, alias))
+ return disk;
+ }
+
+ qemuReportError(VIR_ERR_INTERNAL_ERROR,
+ _("no disk found with alias %s"),
+ alias);
+ return NULL;
+}
+
static int
getVolumeQcowPassphrase(virConnectPtr conn,
virDomainDiskDefPtr disk,
@@ -928,12 +948,49 @@ qemuHandleDomainWatchdog(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
}
+static int
+qemuHandleDomainIOError(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
+ virDomainObjPtr vm,
+ const char *diskAlias,
+ int action)
+{
+ struct qemud_driver *driver = qemu_driver;
+ virDomainEventPtr event;
+ const char *srcPath;
+ const char *devAlias;
+ virDomainDiskDefPtr disk;
+
+ virDomainObjLock(vm);
+ disk = findDomainDiskByAlias(vm, diskAlias);
+
+ if (disk) {
+ srcPath = disk->src;
+ devAlias = disk->info.alias;
+ } else {
+ srcPath = "";
+ devAlias = "";
+ }
+
+ event = virDomainEventIOErrorNewFromObj(vm, srcPath, devAlias, action);
+ virDomainObjUnlock(vm);
+
+ if (event) {
+ qemuDriverLock(driver);
+ qemuDomainEventQueue(driver, event);
+ qemuDriverUnlock(driver);
+ }
+
+ return 0;
+}
+
+
static qemuMonitorCallbacks monitorCallbacks = {
.eofNotify = qemuHandleMonitorEOF,
.diskSecretLookup = findVolumeQcowPassphrase,
.domainReset = qemuHandleDomainReset,
.domainRTCChange = qemuHandleDomainRTCChange,
.domainWatchdog = qemuHandleDomainWatchdog,
+ .domainIOError = qemuHandleDomainIOError,
};
okay,
ACK,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/