qemu: Introduce qemuBlockJobUpdate

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>
This commit is contained in:
Jiri Denemark 2015-05-11 14:50:48 +02:00
parent e0713c4bed
commit e2cc0e667e
3 changed files with 44 additions and 8 deletions

View File

@ -265,6 +265,8 @@ virDomainDiskInsert;
virDomainDiskInsertPreAlloced;
virDomainDiskIoTypeFromString;
virDomainDiskIoTypeToString;
virDomainDiskMirrorStateTypeFromString;
virDomainDiskMirrorStateTypeToString;
virDomainDiskPathByName;
virDomainDiskRemove;
virDomainDiskRemoveByName;

View File

@ -38,6 +38,37 @@
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;

View 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,