By switching block jobs to use domain conditions, we can drop some
pretty complicated code in NBD storage migration.
Signed-off-by: Jiri Denemark jdene...@redhat.com
---
Notes:
Version 3:
- split into 3 patches
Version 2:
- slightly modified to use domain conditions
po/POTFILES.in| 1 -
src/qemu/qemu_blockjob.c | 137 +++---
src/qemu/qemu_blockjob.h | 12 +---
src/qemu/qemu_domain.c| 17 +-
src/qemu/qemu_domain.h| 1 -
src/qemu/qemu_driver.c| 24
src/qemu/qemu_migration.c | 112 +
src/qemu/qemu_process.c | 13 ++---
8 files changed, 76 insertions(+), 241 deletions(-)
diff --git a/po/POTFILES.in b/po/POTFILES.in
index bb0f6e1..dd06ab3 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -112,7 +112,6 @@ src/parallels/parallels_utils.h
src/parallels/parallels_storage.c
src/phyp/phyp_driver.c
src/qemu/qemu_agent.c
-src/qemu/qemu_blockjob.c
src/qemu/qemu_capabilities.c
src/qemu/qemu_cgroup.c
src/qemu/qemu_command.c
diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c
index eb05cef..3aa6118 100644
--- a/src/qemu/qemu_blockjob.c
+++ b/src/qemu/qemu_blockjob.c
@@ -214,19 +214,17 @@ qemuBlockJobEventProcess(virQEMUDriverPtr driver,
*
* During a synchronous block job, a block job event for @disk
* will not be processed asynchronously. Instead, it will be
- * processed only when qemuBlockJobSyncWait* or
- * qemuBlockJobSyncEnd is called.
+ * processed only when qemuBlockJobUpdate or qemuBlockJobSyncEnd
+ * is called.
*/
void
qemuBlockJobSyncBegin(virDomainDiskDefPtr disk)
{
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
-if (diskPriv-blockJobSync)
-VIR_WARN(Disk %s already has synchronous block job,
- disk-dst);
-
+VIR_DEBUG(disk=%s, disk-dst);
diskPriv-blockJobSync = true;
+diskPriv-blockJobStatus = -1;
}
@@ -235,135 +233,16 @@ qemuBlockJobSyncBegin(virDomainDiskDefPtr disk)
* @driver: qemu driver
* @vm: domain
* @disk: domain disk
- * @ret_status: pointer to virConnectDomainEventBlockJobStatus
*
* End a synchronous block job for @disk. Any pending block job event
- * for the disk is processed, and its status is recorded in the
- * virConnectDomainEventBlockJobStatus field pointed to by
- * @ret_status.
+ * for the disk is processed.
*/
void
qemuBlockJobSyncEnd(virQEMUDriverPtr driver,
virDomainObjPtr vm,
-virDomainDiskDefPtr disk,
-virConnectDomainEventBlockJobStatus *ret_status)
+virDomainDiskDefPtr disk)
{
-qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
-
-if (diskPriv-blockJobSync diskPriv-blockJobStatus != -1) {
-if (ret_status)
-*ret_status = diskPriv-blockJobStatus;
-qemuBlockJobUpdate(driver, vm, disk);
-diskPriv-blockJobStatus = -1;
-}
-diskPriv-blockJobSync = false;
-}
-
-
-/**
- * qemuBlockJobSyncWaitWithTimeout:
- * @driver: qemu driver
- * @vm: domain
- * @disk: domain disk
- * @timeout: timeout in milliseconds
- * @ret_status: pointer to virConnectDomainEventBlockJobStatus
- *
- * Wait up to @timeout milliseconds for a block job event for @disk.
- * If an event is received it is processed, and its status is recorded
- * in the virConnectDomainEventBlockJobStatus field pointed to by
- * @ret_status.
- *
- * If @timeout is not 0, @vm will be unlocked while waiting for the event.
- *
- * Returns 0 if an event was received or the timeout expired,
- *-1 otherwise.
- */
-int
-qemuBlockJobSyncWaitWithTimeout(virQEMUDriverPtr driver,
-virDomainObjPtr vm,
-virDomainDiskDefPtr disk,
-unsigned long long timeout,
-virConnectDomainEventBlockJobStatus
*ret_status)
-{
-qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
-
-if (!diskPriv-blockJobSync) {
-virReportError(VIR_ERR_INTERNAL_ERROR, %s,
- _(No current synchronous block job));
-return -1;
-}
-
-while (diskPriv-blockJobSync diskPriv-blockJobStatus == -1) {
-int r;
-
-if (!virDomainObjIsActive(vm)) {
-virReportError(VIR_ERR_INTERNAL_ERROR, %s,
- _(guest unexpectedly quit));
-diskPriv-blockJobSync = false;
-return -1;
-}
-
-if (timeout == (unsigned long long)-1) {
-r = virCondWait(diskPriv-blockJobSyncCond, vm-parent.lock);
-} else if (timeout) {
-unsigned long long now;
-if (virTimeMillisNow(now) 0) {
-virReportSystemError(errno, %s,
- _(Unable to get current time));
-return -1;
-}
-r =