]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Refactor disk unplugging
authorWolfgang Mauerer <wolfgang.mauerer@siemens.com>
Wed, 5 May 2010 14:52:14 +0000 (16:52 +0200)
committerEric Blake <eblake@redhat.com>
Thu, 6 May 2010 21:19:39 +0000 (15:19 -0600)
We can reuse some of the code for other purposes.

Signed-off-by: Wolfgang Mauerer <wolfgang.mauerer@siemens.com>
src/qemu/qemu_driver.c

index 791d9546d8fb4b6904137b19f87f491f44d4c010..90b9089ecab25a8f9e0afa68d3544b8dd2d11b23 100644 (file)
@@ -7866,6 +7866,36 @@ cleanup:
 }
 
 
+static inline int qemudFindDisk(virDomainDefPtr def, char *dst)
+{
+    int i;
+
+    for (i = 0 ; i < def->ndisks ; i++) {
+        if (STREQ(def->disks[i]->dst, dst)) {
+            return i;
+        }
+    }
+
+    return -1;
+}
+
+static inline void qemudShrinkDisks(virDomainDefPtr def, int i)
+{
+    if (def->ndisks > 1) {
+        memmove(def->disks + i,
+                def->disks + i + 1,
+                sizeof(*def->disks) *
+                (def->ndisks - (i + 1)));
+        def->ndisks--;
+        if (VIR_REALLOC_N(def->disks, def->ndisks) < 0) {
+            /* ignore, harmless */
+        }
+    } else {
+        VIR_FREE(def->disks);
+        def->ndisks = 0;
+    }
+}
+
 static int qemudDomainDetachPciDiskDevice(struct qemud_driver *driver,
                                           virDomainObjPtr vm,
                                           virDomainDeviceDefPtr dev,
@@ -7875,19 +7905,16 @@ static int qemudDomainDetachPciDiskDevice(struct qemud_driver *driver,
     virDomainDiskDefPtr detach = NULL;
     qemuDomainObjPrivatePtr priv = vm->privateData;
 
-    for (i = 0 ; i < vm->def->ndisks ; i++) {
-        if (STREQ(vm->def->disks[i]->dst, dev->data.disk->dst)) {
-            detach = vm->def->disks[i];
-            break;
-        }
-    }
+    i = qemudFindDisk(vm->def, dev->data.disk->dst);
 
-    if (!detach) {
+    if (i < 0) {
         qemuReportError(VIR_ERR_OPERATION_FAILED,
                         _("disk %s not found"), dev->data.disk->dst);
         goto cleanup;
     }
 
+    detach = vm->def->disks[i];
+
     if (!virDomainDeviceAddressIsValid(&detach->info,
                                        VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI)) {
         qemuReportError(VIR_ERR_OPERATION_FAILED, "%s",
@@ -7910,19 +7937,8 @@ static int qemudDomainDetachPciDiskDevice(struct qemud_driver *driver,
     }
     qemuDomainObjExitMonitorWithDriver(driver, vm);
 
-    if (vm->def->ndisks > 1) {
-        memmove(vm->def->disks + i,
-                vm->def->disks + i + 1,
-                sizeof(*vm->def->disks) *
-                (vm->def->ndisks - (i + 1)));
-        vm->def->ndisks--;
-        if (VIR_REALLOC_N(vm->def->disks, vm->def->ndisks) < 0) {
-            /* ignore, harmless */
-        }
-    } else {
-        VIR_FREE(vm->def->disks);
-        vm->def->ndisks = 0;
-    }
+    qemudShrinkDisks(vm->def, i);
+
     virDomainDiskDefFree(detach);
 
     if (driver->securityDriver &&