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
* 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,
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 &&
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;
if (ret_status)
*ret_status = diskPriv->blockJobStatus;
- qemuBlockJobEventProcess(driver, vm, disk,
- diskPriv->blockJobType,
- diskPriv->blockJobStatus);
+ qemuBlockJobUpdate(driver, vm, disk);
diskPriv->blockJobStatus = -1;
return 0;