mirror of https://gitee.com/openkylin/libvirt.git
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:
parent
e0713c4bed
commit
e2cc0e667e
|
@ -265,6 +265,8 @@ virDomainDiskInsert;
|
||||||
virDomainDiskInsertPreAlloced;
|
virDomainDiskInsertPreAlloced;
|
||||||
virDomainDiskIoTypeFromString;
|
virDomainDiskIoTypeFromString;
|
||||||
virDomainDiskIoTypeToString;
|
virDomainDiskIoTypeToString;
|
||||||
|
virDomainDiskMirrorStateTypeFromString;
|
||||||
|
virDomainDiskMirrorStateTypeToString;
|
||||||
virDomainDiskPathByName;
|
virDomainDiskPathByName;
|
||||||
virDomainDiskRemove;
|
virDomainDiskRemove;
|
||||||
virDomainDiskRemoveByName;
|
virDomainDiskRemoveByName;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue