]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
qemu: Introduce qemuBlockJobUpdate
authorJiri Denemark <jdenemar@redhat.com>
Mon, 11 May 2015 12:50:48 +0000 (14:50 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Fri, 19 Jun 2015 13:13:16 +0000 (15:13 +0200)
The wrapper is useful for calling qemuBlockJobEventProcess with the
event details stored in disk's privateData, which is the most likely
usage of qemuBlockJobEventProcess.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
src/libvirt_private.syms
src/qemu/qemu_blockjob.c
src/qemu/qemu_blockjob.h

index fa0b317175f6211be2682abaa57ff87fbda50b76..51044b0af827c746d0728ec95f7c14a3e20dd7b1 100644 (file)
@@ -265,6 +265,8 @@ virDomainDiskInsert;
 virDomainDiskInsertPreAlloced;
 virDomainDiskIoTypeFromString;
 virDomainDiskIoTypeToString;
+virDomainDiskMirrorStateTypeFromString;
+virDomainDiskMirrorStateTypeToString;
 virDomainDiskPathByName;
 virDomainDiskRemove;
 virDomainDiskRemoveByName;
index 098a43aac3282f1210774b3ab4ffe86182e69235..eb05cefc7c643ad1dfb85f933aa37b33c8053e37 100644 (file)
 
 VIR_LOG_INIT("qemu.qemu_blockjob");
 
+
+/**
+ * qemuBlockJobUpdate:
+ * @driver: qemu driver
+ * @vm: domain
+ * @disk: domain disk
+ *
+ * Update disk's mirror state in response to a block job event stored in
+ * blockJobStatus by qemuProcessHandleBlockJob event handler.
+ *
+ * Returns the block job event processed or -1 if there was no pending event.
+ */
+int
+qemuBlockJobUpdate(virQEMUDriverPtr driver,
+                   virDomainObjPtr vm,
+                   virDomainDiskDefPtr disk)
+{
+    qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
+    int status = diskPriv->blockJobStatus;
+
+    if (status != -1) {
+        qemuBlockJobEventProcess(driver, vm, disk,
+                                 diskPriv->blockJobType,
+                                 diskPriv->blockJobStatus);
+        diskPriv->blockJobStatus = -1;
+    }
+
+    return status;
+}
+
+
 /**
  * qemuBlockJobEventProcess:
  * @driver: qemu driver
@@ -49,8 +80,6 @@ VIR_LOG_INIT("qemu.qemu_blockjob");
  * Update disk's mirror state in response to a block job event
  * from QEMU. For mirror state's that must survive libvirt
  * restart, also update the domain's status XML.
- *
- * Returns 0 on success, -1 otherwise.
  */
 void
 qemuBlockJobEventProcess(virQEMUDriverPtr driver,
@@ -67,6 +96,12 @@ qemuBlockJobEventProcess(virQEMUDriverPtr driver,
     bool save = false;
     qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
 
+    VIR_DEBUG("disk=%s, mirrorState=%s, type=%d, status=%d",
+              disk->dst,
+              NULLSTR(virDomainDiskMirrorStateTypeToString(disk->mirrorState)),
+              type,
+              status);
+
     /* Have to generate two variants of the event for old vs. new
      * client callbacks */
     if (type == VIR_DOMAIN_BLOCK_JOB_TYPE_COMMIT &&
@@ -218,9 +253,7 @@ qemuBlockJobSyncEnd(virQEMUDriverPtr driver,
     if (diskPriv->blockJobSync && diskPriv->blockJobStatus != -1) {
         if (ret_status)
             *ret_status = diskPriv->blockJobStatus;
-        qemuBlockJobEventProcess(driver, vm, disk,
-                                 diskPriv->blockJobType,
-                                 diskPriv->blockJobStatus);
+        qemuBlockJobUpdate(driver, vm, disk);
         diskPriv->blockJobStatus = -1;
     }
     diskPriv->blockJobSync = false;
@@ -300,9 +333,7 @@ qemuBlockJobSyncWaitWithTimeout(virQEMUDriverPtr driver,
 
     if (ret_status)
         *ret_status = diskPriv->blockJobStatus;
-    qemuBlockJobEventProcess(driver, vm, disk,
-                             diskPriv->blockJobType,
-                             diskPriv->blockJobStatus);
+    qemuBlockJobUpdate(driver, vm, disk);
     diskPriv->blockJobStatus = -1;
 
     return 0;
index ba372a20bf0d30f2e721b00c33f49f1696ab834f..81e893e37980cf8967d429a647fc859c5a46d8d5 100644 (file)
@@ -25,6 +25,9 @@
 # include "internal.h"
 # include "qemu_conf.h"
 
+int qemuBlockJobUpdate(virQEMUDriverPtr driver,
+                       virDomainObjPtr vm,
+                       virDomainDiskDefPtr disk);
 void qemuBlockJobEventProcess(virQEMUDriverPtr driver,
                               virDomainObjPtr vm,
                               virDomainDiskDefPtr disk,