]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Move the shared disk adding and sgio setting prior to attaching
authorOsier Yang <jyang@redhat.com>
Tue, 19 Feb 2013 12:27:44 +0000 (20:27 +0800)
committerOsier Yang <jyang@redhat.com>
Wed, 20 Feb 2013 16:31:24 +0000 (00:31 +0800)
The disk def could be free'ed by qemuDomainChangeEjectableMedia,
which can thus cause crash if we reference the disk pointer. On
the other hand, we have to remove the added shared disk entry from
the table on error codepath.

src/qemu/qemu_driver.c

index 3025d1d4e00449071380c01e9eefbe26f3602763..297f2657c9b8651c43006b56d1e5b274a4fe43fb 100644 (file)
@@ -5714,6 +5714,12 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
         goto end;
     }
 
+    if (qemuAddSharedDisk(driver, disk, vm->def->name) < 0)
+        goto end;
+
+    if (qemuSetUnprivSGIO(disk) < 0)
+        goto end;
+
     if (qemuDomainDetermineDiskChain(driver, disk, false) < 0)
         goto end;
 
@@ -5727,6 +5733,7 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
         if (qemuSetupDiskCgroup(vm, cgroup, disk) < 0)
             goto end;
     }
+
     switch (disk->device)  {
     case VIR_DOMAIN_DISK_DEVICE_CDROM:
     case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
@@ -5765,16 +5772,9 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
                      NULLSTR(disk->src));
     }
 
-    if (ret == 0) {
-        if (qemuAddSharedDisk(driver, disk, vm->def->name) < 0)
-            VIR_WARN("Failed to add disk '%s' to shared disk table",
-                     disk->src);
-
-        if (qemuSetUnprivSGIO(disk) < 0)
-            VIR_WARN("Failed to set unpriv_sgio of disk '%s'", disk->src);
-    }
-
 end:
+    if (ret != 0)
+        ignore_value(qemuRemoveSharedDisk(driver, disk, vm->def->name));
     if (cgroup)
         virCgroupFree(&cgroup);
     return ret;
@@ -5889,11 +5889,8 @@ qemuDomainDetachDeviceDiskLive(virQEMUDriverPtr driver,
         break;
     }
 
-    if (ret == 0) {
-        if (qemuRemoveSharedDisk(driver, disk, vm->def->name) < 0)
-             VIR_WARN("Failed to remove disk '%s' from shared disk table",
-                      disk->src);
-    }
+    if (ret == 0)
+        ignore_value(qemuRemoveSharedDisk(driver, disk, vm->def->name));
 
     return ret;
 }