]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu_driver: Introduce <filesystem/> support in device attach/detach
authorMatthieu Coudron <mattator@gmail.com>
Thu, 6 Feb 2014 14:30:07 +0000 (15:30 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 6 Feb 2014 16:20:03 +0000 (17:20 +0100)
This commit allows to attach/detach a <filesystem> device in qemu. For
this purpose I'm introducing two new functions: virDomainFSInsert() and
virDomainFSRemove() and adding necessary code in the qemu driver.  It
compares filesystems based on their "destination" folder. So if two
filesystems share the same destination, they are considered equal and
the qemu driver would reject the insertion.

Signed-off-by: Matthieu Coudron <mattator@gmail.com>
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms
src/qemu/qemu_driver.c

index 7ad2a904eb64a646baa06272325f174f23488d3b..512fe51520b47cffb1168a403639203e4037f6f8 100644 (file)
@@ -17919,6 +17919,22 @@ virDiskNameToBusDeviceIndex(virDomainDiskDefPtr disk,
     return 0;
 }
 
+int
+virDomainFSInsert(virDomainDefPtr def, virDomainFSDefPtr fs)
+{
+
+    return VIR_APPEND_ELEMENT(def->fss, def->nfss, fs);
+}
+
+virDomainFSDefPtr
+virDomainFSRemove(virDomainDefPtr def, size_t i)
+{
+    virDomainFSDefPtr fs = def->fss[i];
+
+    VIR_DELETE_ELEMENT(def->fss, i, def->nfss);
+    return fs;
+}
+
 virDomainFSDefPtr
 virDomainGetRootFilesystem(virDomainDefPtr def)
 {
index d8f2e49ded8743a57074464c01a2287b2e43233d..9acb10512422f0acda0c55e0131ea19e39e58c5f 100644 (file)
@@ -2555,7 +2555,10 @@ int virDiskNameToBusDeviceIndex(virDomainDiskDefPtr disk,
                                 int *devIdx);
 
 virDomainFSDefPtr virDomainGetRootFilesystem(virDomainDefPtr def);
+int virDomainFSInsert(virDomainDefPtr def, virDomainFSDefPtr fs);
 int virDomainFSIndexByName(virDomainDefPtr def, const char *name);
+virDomainFSDefPtr virDomainFSRemove(virDomainDefPtr def, size_t i);
+
 int virDomainVideoDefaultType(const virDomainDef *def);
 int virDomainVideoDefaultRAM(const virDomainDef *def, int type);
 
index c5a7637cf776fd9ea876c31299fc6473130deb6f..2c9536aa9a041d6bf7b08ab5426016d5cfcb64a7 100644 (file)
@@ -221,6 +221,8 @@ virDomainFeatureStateTypeFromString;
 virDomainFeatureStateTypeToString;
 virDomainFSDefFree;
 virDomainFSIndexByName;
+virDomainFSInsert;
+virDomainFSRemove;
 virDomainFSTypeFromString;
 virDomainFSTypeToString;
 virDomainFSWrpolicyTypeFromString;
index 8998201abb40e92c7477a45e5b490ccf32283166..944facb58d337474ca1b36c5822db662bdb81c46 100644 (file)
@@ -6606,6 +6606,7 @@ qemuDomainAttachDeviceConfig(virQEMUCapsPtr qemuCaps,
     virDomainHostdevDefPtr hostdev;
     virDomainLeaseDefPtr lease;
     virDomainControllerDefPtr controller;
+    virDomainFSDefPtr fs;
 
     switch (dev->type) {
     case VIR_DOMAIN_DEVICE_DISK:
@@ -6687,6 +6688,19 @@ qemuDomainAttachDeviceConfig(virQEMUCapsPtr qemuCaps,
         dev->data.chr = NULL;
         break;
 
+    case VIR_DOMAIN_DEVICE_FS:
+        fs = dev->data.fs;
+        if (virDomainFSIndexByName(vmdef, fs->dst) >= 0) {
+            virReportError(VIR_ERR_OPERATION_INVALID,
+                         "%s", _("Target already exists"));
+            return -1;
+        }
+
+        if (virDomainFSInsert(vmdef, fs) < 0)
+            return -1;
+        dev->data.fs = NULL;
+        break;
+
     default:
          virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
                         _("persistent attach of device '%s' is not supported"),
@@ -6707,6 +6721,7 @@ qemuDomainDetachDeviceConfig(virDomainDefPtr vmdef,
     virDomainLeaseDefPtr lease, det_lease;
     virDomainControllerDefPtr cont, det_cont;
     virDomainChrDefPtr chr;
+    virDomainFSDefPtr fs;
     int idx;
     char mac[VIR_MAC_STRING_BUFLEN];
 
@@ -6783,6 +6798,19 @@ qemuDomainDetachDeviceConfig(virDomainDefPtr vmdef,
         dev->data.chr = NULL;
         break;
 
+    case VIR_DOMAIN_DEVICE_FS:
+        fs = dev->data.fs;
+        idx = virDomainFSIndexByName(vmdef, fs->dst);
+        if (idx < 0) {
+            virReportError(VIR_ERR_OPERATION_FAILED, "%s",
+                           _("no matching filesystem device was found"));
+            return -1;
+        }
+
+        fs = virDomainFSRemove(vmdef, idx);
+        virDomainFSDefFree(fs);
+        break;
+
     default:
         virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
                        _("persistent detach of device '%s' is not supported"),