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; virDomainDiskInsertPreAlloced;
virDomainDiskIoTypeFromString; virDomainDiskIoTypeFromString;
virDomainDiskIoTypeToString; virDomainDiskIoTypeToString;
virDomainDiskMirrorStateTypeFromString;
virDomainDiskMirrorStateTypeToString;
virDomainDiskPathByName; virDomainDiskPathByName;
virDomainDiskRemove; virDomainDiskRemove;
virDomainDiskRemoveByName; virDomainDiskRemoveByName;

View File

@ -38,6 +38,37 @@
VIR_LOG_INIT("qemu.qemu_blockjob"); 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: * qemuBlockJobEventProcess:
* @driver: qemu driver * @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 * Update disk's mirror state in response to a block job event
* from QEMU. For mirror state's that must survive libvirt * from QEMU. For mirror state's that must survive libvirt
* restart, also update the domain's status XML. * restart, also update the domain's status XML.
*
* Returns 0 on success, -1 otherwise.
*/ */
void void
qemuBlockJobEventProcess(virQEMUDriverPtr driver, qemuBlockJobEventProcess(virQEMUDriverPtr driver,
@ -67,6 +96,12 @@ qemuBlockJobEventProcess(virQEMUDriverPtr driver,
bool save = false; bool save = false;
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk); 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 /* Have to generate two variants of the event for old vs. new
* client callbacks */ * client callbacks */
if (type == VIR_DOMAIN_BLOCK_JOB_TYPE_COMMIT && if (type == VIR_DOMAIN_BLOCK_JOB_TYPE_COMMIT &&
@ -218,9 +253,7 @@ qemuBlockJobSyncEnd(virQEMUDriverPtr driver,
if (diskPriv->blockJobSync && diskPriv->blockJobStatus != -1) { if (diskPriv->blockJobSync && diskPriv->blockJobStatus != -1) {
if (ret_status) if (ret_status)
*ret_status = diskPriv->blockJobStatus; *ret_status = diskPriv->blockJobStatus;
qemuBlockJobEventProcess(driver, vm, disk, qemuBlockJobUpdate(driver, vm, disk);
diskPriv->blockJobType,
diskPriv->blockJobStatus);
diskPriv->blockJobStatus = -1; diskPriv->blockJobStatus = -1;
} }
diskPriv->blockJobSync = false; diskPriv->blockJobSync = false;
@ -300,9 +333,7 @@ qemuBlockJobSyncWaitWithTimeout(virQEMUDriverPtr driver,
if (ret_status) if (ret_status)
*ret_status = diskPriv->blockJobStatus; *ret_status = diskPriv->blockJobStatus;
qemuBlockJobEventProcess(driver, vm, disk, qemuBlockJobUpdate(driver, vm, disk);
diskPriv->blockJobType,
diskPriv->blockJobStatus);
diskPriv->blockJobStatus = -1; diskPriv->blockJobStatus = -1;
return 0; return 0;

View File

@ -25,6 +25,9 @@
# include "internal.h" # include "internal.h"
# include "qemu_conf.h" # include "qemu_conf.h"
int qemuBlockJobUpdate(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virDomainDiskDefPtr disk);
void qemuBlockJobEventProcess(virQEMUDriverPtr driver, void qemuBlockJobEventProcess(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
virDomainDiskDefPtr disk, virDomainDiskDefPtr disk,