[libvirt] [PATCH 02/13] parallels: handle disk devices in parallelsDomainDefineXML

Dmitry Guryanov dguryanov at parallels.com
Wed Sep 26 12:30:15 UTC 2012


Allow changing some parameters of the hard disks: bus,
image and drive address.

Creating new disk devices and removing existing ones
require changes in the storage driver, so it will be
implemented later.

Signed-off-by: Dmitry Guryanov <dguryanov at parallels.com>
---
 src/parallels/parallels_driver.c |   73 ++++++++++++++++++++++++++++++++++++-
 1 files changed, 71 insertions(+), 2 deletions(-)

diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c
index 1dabe8d..d10d7a2 100644
--- a/src/parallels/parallels_driver.c
+++ b/src/parallels/parallels_driver.c
@@ -1475,6 +1475,72 @@ parallelsApplyVideoParams(parallelsDomObjPtr pdom,
 }
 
 static int
+parallelsApplyDisksParams(parallelsDomObjPtr pdom,
+                          virDomainDiskDefPtr *olddisks, int nold,
+                          virDomainDiskDefPtr *newdisks, int nnew)
+{
+    /* TODO: allow creating and removing disks */
+    if (nold != nnew) {
+        virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
+                       _("Adding and removing disks is not supported"));
+        return -1;
+    }
+
+    for (int i = 0; i < nold; i++) {
+        virDomainDiskDefPtr newdisk = NULL;
+        virDomainDiskDefPtr olddisk = olddisks[i];
+        for (int j = 0; j < nnew; j++) {
+            if (STREQ_NULLABLE(newdisks[j]->dst, olddisk->dst)) {
+                newdisk = newdisks[j];
+                break;
+            }
+        }
+
+        if (!newdisk) {
+            virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
+                           _("There is no disk with source '%s' "
+                             "in the specified config"), olddisks[i]->serial);
+            return -1;
+        }
+
+        if (olddisk->bus != newdisk->bus ||
+            olddisk->info.addr.drive.target != newdisk->info.addr.drive.target ||
+            !STREQ_NULLABLE(olddisk->src, newdisk->src)) {
+
+            char prlname[16];
+            char strpos[16];
+            const char *strbus;
+
+            prlname[15] = '\0';
+            snprintf(prlname, 15, "hdd%d", virDiskNameToIndex(newdisk->dst));
+
+            strpos[15] = '\0';
+            snprintf(strpos, 15, "%d", newdisk->info.addr.drive.target);
+
+            switch(newdisk->bus) {
+            case VIR_DOMAIN_DISK_BUS_IDE:
+                strbus = "ide";
+                break;
+            case VIR_DOMAIN_DISK_BUS_SATA:
+                strbus = "sata";
+                break;
+            case VIR_DOMAIN_DISK_BUS_SCSI:
+                strbus = "scsi";
+                break;
+            }
+            if (parallelsCmdRun(PRLCTL, "set", pdom->uuid,
+                                "--device-set", prlname,
+                                "--iface", strbus,
+                                "--position", strpos,
+                                "--image", newdisk->src, NULL))
+                return -1;
+        }
+    }
+
+    return 0;
+}
+
+static int
 parallelsApplyChanges(virDomainObjPtr dom, virDomainDefPtr new)
 {
     char buf[32];
@@ -1673,8 +1739,7 @@ parallelsApplyChanges(virDomainObjPtr dom, virDomainDefPtr new)
                                    new->graphics, new->ngraphics) < 0)
         return -1;
 
-    if (new->ndisks != 0 || new->ncontrollers != 0 ||
-        new->nfss != 0 || new->nnets != 0 ||
+    if (new->nfss != 0 || new->nnets != 0 ||
         new->nsounds != 0 || new->nhostdevs != 0 ||
         new->nredirdevs != 0 || new->nsmartcards != 0 ||
         new->nparallels || new->nchannels != 0 ||
@@ -1709,6 +1774,10 @@ parallelsApplyChanges(virDomainObjPtr dom, virDomainDefPtr new)
     if (parallelsApplyVideoParams(pdom, old->videos, old->nvideos,
                                    new->videos, new->nvideos) < 0)
         return -1;
+    if (parallelsApplyDisksParams(pdom, old->disks, old->ndisks,
+                                  new->disks, new->ndisks) < 0)
+        return -1;
+
     return 0;
 }
 
-- 
1.7.1




More information about the libvir-list mailing list