On 06/02/2015 08:34 AM, Jiri Denemark wrote:
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(a)redhat.com>
---
Notes:
Already ACKed in version 1.
Version 2:
- no changes
src/libvirt_private.syms | 2 ++
src/qemu/qemu_blockjob.c | 37 +++++++++++++++++++++++++++++--------
src/qemu/qemu_blockjob.h | 3 +++
3 files changed, 34 insertions(+), 8 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 9076135..8846dea 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -265,6 +265,8 @@ virDomainDiskInsert;
virDomainDiskInsertPreAlloced;
virDomainDiskIoTypeFromString;
virDomainDiskIoTypeToString;
+virDomainDiskMirrorStateTypeFromString;
+virDomainDiskMirrorStateTypeToString;
virDomainDiskPathByName;
virDomainDiskRemove;
virDomainDiskRemoveByName;
diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c
index 098a43a..605c2a5 100644
--- a/src/qemu/qemu_blockjob.c
+++ b/src/qemu/qemu_blockjob.c
@@ -38,6 +38,27 @@
VIR_LOG_INIT("qemu.qemu_blockjob");
+
+int
+qemuBlockJobUpdate(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ virDomainDiskDefPtr disk)
+{
+ qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
+ int ret;
+
+ if ((ret = diskPriv->blockJobStatus) == -1)
+ return -1;
+
+ qemuBlockJobEventProcess(driver, vm, disk,
+ diskPriv->blockJobType,
+ diskPriv->blockJobStatus);
+ diskPriv->blockJobStatus = -1;
+
+ return ret;
+}
+
+
/**
* qemuBlockJobEventProcess:
* @driver: qemu driver
@@ -49,8 +70,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 +86,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 +243,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);
^^
This doesn't get the returned status...
John
diskPriv->blockJobStatus = -1;
}
diskPriv->blockJobSync = false;
@@ -300,9 +323,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;
diff --git a/src/qemu/qemu_blockjob.h b/src/qemu/qemu_blockjob.h
index ba372a2..81e893e 100644
--- a/src/qemu/qemu_blockjob.h
+++ b/src/qemu/qemu_blockjob.h
@@ -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,