]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Start nested job in qemuDomainCheckEjectableMedia
authorJiri Denemark <jdenemar@redhat.com>
Mon, 2 Apr 2012 13:55:08 +0000 (15:55 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Mon, 2 Apr 2012 19:44:27 +0000 (21:44 +0200)
Originally, qemuDomainCheckEjectableMedia was entering monitor with qemu
driver lock. Commit 2067e31bf97667eab9f111b496f5e9a44e827c5b, which I
made to fix that, revealed another issue we had (but didn't notice it
since the driver was locked): we didn't set nested job when
qemuDomainCheckEjectableMedia is called during migration. Thus the
original fix I made was wrong.

src/qemu/qemu_driver.c
src/qemu/qemu_hotplug.c
src/qemu/qemu_hotplug.h
src/qemu/qemu_process.c

index 7e6d59c6e3234ca72bd7e1a205fcbcc7262913da..dd79973d5f00791f4567de9458ffff3d62dd5a65 100644 (file)
@@ -8816,6 +8816,7 @@ qemuDomainMigrateBegin3(virDomainPtr domain,
     struct qemud_driver *driver = domain->conn->privateData;
     virDomainObjPtr vm;
     char *xml = NULL;
+    enum qemuDomainAsyncJob asyncJob;
 
     virCheckFlags(QEMU_MIGRATION_FLAGS, NULL);
 
@@ -8832,9 +8833,11 @@ qemuDomainMigrateBegin3(virDomainPtr domain,
     if ((flags & VIR_MIGRATE_CHANGE_PROTECTION)) {
         if (qemuMigrationJobStart(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
             goto cleanup;
+        asyncJob = QEMU_ASYNC_JOB_MIGRATION_OUT;
     } else {
         if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
             goto cleanup;
+        asyncJob = QEMU_ASYNC_JOB_NONE;
     }
 
     if (!virDomainObjIsActive(vm)) {
@@ -8847,7 +8850,7 @@ qemuDomainMigrateBegin3(virDomainPtr domain,
      * We don't want to require them on the destination.
      */
 
-    if (qemuDomainCheckEjectableMedia(driver, vm) < 0)
+    if (qemuDomainCheckEjectableMedia(driver, vm, asyncJob) < 0)
         goto endjob;
 
     if (!(xml = qemuMigrationBegin(driver, vm, xmlin, dname,
index 3b6eb9d6fa7e469eab9193b07852b6c37045c4eb..857b98089b6ba0844478e0ca77bed5271322646b 100644 (file)
@@ -155,16 +155,18 @@ error:
 
 int
 qemuDomainCheckEjectableMedia(struct qemud_driver *driver,
-                             virDomainObjPtr vm)
+                             virDomainObjPtr vm,
+                             enum qemuDomainAsyncJob asyncJob)
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
-    virHashTablePtr table;
+    virHashTablePtr table = NULL;
     int ret = -1;
     int i;
 
-    qemuDomainObjEnterMonitorWithDriver(driver, vm);
-    table = qemuMonitorGetBlockInfo(priv->mon);
-    qemuDomainObjExitMonitorWithDriver(driver, vm);
+    if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) == 0) {
+        table = qemuMonitorGetBlockInfo(priv->mon);
+        qemuDomainObjExitMonitorWithDriver(driver, vm);
+    }
 
     if (!table)
         goto cleanup;
index 03103611dc24bf8d2e49e340ada3b7e4bbaec792..e6d7843084c02a0b5867e45e202923935e05e55d 100644 (file)
@@ -25,6 +25,7 @@
 # define __QEMU_HOTPLUG_H__
 
 # include "qemu_conf.h"
+# include "qemu_domain.h"
 # include "domain_conf.h"
 
 int qemuDomainChangeEjectableMedia(struct qemud_driver *driver,
@@ -32,7 +33,8 @@ int qemuDomainChangeEjectableMedia(struct qemud_driver *driver,
                                    virDomainDiskDefPtr disk,
                                    bool force);
 int qemuDomainCheckEjectableMedia(struct qemud_driver *driver,
-                                  virDomainObjPtr vm);
+                                  virDomainObjPtr vm,
+                                  enum qemuDomainAsyncJob asyncJob);
 int qemuDomainAttachPciDiskDevice(virConnectPtr conn,
                                   struct qemud_driver *driver,
                                   virDomainObjPtr vm,
index 91f1c5b095db6d06b76cad678d0eb5973d2cb42e..9eed160559fc68ec481a92963f8e14ae4016da46 100644 (file)
@@ -3106,7 +3106,7 @@ qemuProcessReconnect(void *opaque)
     if (qemuProcessFiltersInstantiate(conn, obj->def))
         goto error;
 
-    if (qemuDomainCheckEjectableMedia(driver, obj) < 0)
+    if (qemuDomainCheckEjectableMedia(driver, obj, QEMU_ASYNC_JOB_NONE) < 0)
         goto error;
 
     if (qemuProcessRecoverJob(driver, obj, conn, &oldjob) < 0)