]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Add support for attach/detach/update disk devices in config for LXC
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 22 Nov 2012 15:41:41 +0000 (15:41 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Mon, 17 Dec 2012 17:50:51 +0000 (17:50 +0000)
Wire up the attach/detach/update device APIs to support changing
of disks in the persistent config file

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
src/lxc/lxc_driver.c

index 19d897966d8049b9ca1e9e88d86c8173b061d929..017d9870792faa5ce16ff6426f093e3df82e80f6 100644 (file)
@@ -2926,9 +2926,26 @@ lxcDomainAttachDeviceConfig(virDomainDefPtr vmdef,
                             virDomainDeviceDefPtr dev)
 {
     int ret = -1;
+    virDomainDiskDefPtr disk;
     virDomainNetDefPtr net;
 
     switch (dev->type) {
+    case VIR_DOMAIN_DEVICE_DISK:
+        disk = dev->data.disk;
+        if (virDomainDiskIndexByName(vmdef, disk->dst, true) >= 0) {
+            virReportError(VIR_ERR_INVALID_ARG,
+                           _("target %s already exists."), disk->dst);
+            return -1;
+        }
+        if (virDomainDiskInsert(vmdef, disk)) {
+            virReportOOMError();
+            return -1;
+        }
+        /* vmdef has the pointer. Generic codes for vmdef will do all jobs */
+        dev->data.disk = NULL;
+        ret = 0;
+        break;
+
     case VIR_DOMAIN_DEVICE_NET:
         net = dev->data.net;
         if (virDomainNetInsert(vmdef, net) < 0) {
@@ -2998,11 +3015,23 @@ lxcDomainDetachDeviceConfig(virDomainDefPtr vmdef,
                             virDomainDeviceDefPtr dev)
 {
     int ret = -1;
+    virDomainDiskDefPtr disk, det_disk;
     virDomainNetDefPtr net;
     int idx;
     char mac[VIR_MAC_STRING_BUFLEN];
 
     switch (dev->type) {
+    case VIR_DOMAIN_DEVICE_DISK:
+        disk = dev->data.disk;
+        if (!(det_disk = virDomainDiskRemoveByName(vmdef, disk->dst))) {
+            virReportError(VIR_ERR_INVALID_ARG,
+                           _("no target device %s"), disk->dst);
+            return -1;
+        }
+        virDomainDiskDefFree(det_disk);
+        ret = 0;
+        break;
+
     case VIR_DOMAIN_DEVICE_NET:
         net = dev->data.net;
         idx = virDomainNetFindIdx(vmdef, net);