[libvirt] [PATCH v2 libvirt 4/8] qemu: add support for MTP filesystem

Giuseppe Scrivano gscrivan at redhat.com
Mon Aug 11 14:47:30 UTC 2014


Generate the qemu command line option:

-device 'usb-mtp,root=$SRC,desc=$TARGET'

from the definition XML:

    <filesystem type='mount'>
      <source dir='$SRC'/>
      <target dir='$TARGET'/>
      <model type='mtp'/>
    </filesystem>

Closes: https://bugzilla.redhat.com/show_bug.cgi?id=1121781

Signed-off-by: Giuseppe Scrivano <gscrivan at redhat.com>
---
 src/qemu/qemu_command.c | 60 ++++++++++++++++++++++++++++---------------------
 1 file changed, 35 insertions(+), 25 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 87569b1..07f165e 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -2060,8 +2060,9 @@ qemuAssignDevicePCISlots(virDomainDefPtr def,
         if (def->fss[i]->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
             continue;
 
-        /* Only support VirtIO-9p-pci so far. If that changes,
-         * we might need to skip devices here */
+        if (def->fss[i]->model == VIR_DOMAIN_FS_MODEL_MTP)
+            continue;
+
         if (virDomainPCIAddressReserveNextSlot(addrs, &def->fss[i]->info,
                                                flags) < 0)
             goto error;
@@ -3956,12 +3957,6 @@ char *qemuBuildFSStr(virDomainFSDefPtr fs,
     const char *driver = qemuDomainFSDriverTypeToString(fs->fsdriver);
     const char *wrpolicy = virDomainFSWrpolicyTypeToString(fs->wrpolicy);
 
-    if (fs->type != VIR_DOMAIN_FS_TYPE_MOUNT) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("only supports mount filesystem type"));
-        goto error;
-    }
-
     if (!driver) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                        _("Filesystem driver type not supported"));
@@ -4030,22 +4025,28 @@ qemuBuildFSDevStr(virDomainDefPtr def,
 {
     virBuffer opt = VIR_BUFFER_INITIALIZER;
 
-    if (fs->type != VIR_DOMAIN_FS_TYPE_MOUNT) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                       _("can only passthrough directories"));
-        goto error;
-    }
-
-    virBufferAddLit(&opt, "virtio-9p-pci");
-    virBufferAsprintf(&opt, ",id=%s", fs->info.alias);
-    virBufferAsprintf(&opt, ",fsdev=%s%s", QEMU_FSDEV_HOST_PREFIX, fs->info.alias);
-    virBufferAsprintf(&opt, ",mount_tag=%s", fs->dst);
+    if (fs->type == VIR_DOMAIN_FS_TYPE_MOUNT) {
 
-    if (qemuBuildDeviceAddressStr(&opt, def, &fs->info, qemuCaps) < 0)
-        goto error;
+        if (fs->model == VIR_DOMAIN_FS_MODEL_MTP) {
+            virBufferAddLit(&opt, "usb-mtp");
+            virBufferAsprintf(&opt, ",root=%s,desc=%s", fs->src, fs->dst);
+        } else {
+            virBufferAddLit(&opt, "virtio-9p-pci");
+            virBufferAsprintf(&opt, ",id=%s", fs->info.alias);
+            virBufferAsprintf(&opt, ",fsdev=%s%s", QEMU_FSDEV_HOST_PREFIX,
+                              fs->info.alias);
+            virBufferAsprintf(&opt, ",mount_tag=%s", fs->dst);
+            if (qemuBuildDeviceAddressStr(&opt, def, &fs->info, qemuCaps) < 0)
+                goto error;
+        }
 
-    if (virBufferCheckError(&opt) < 0)
+        if (virBufferCheckError(&opt) < 0)
+            goto error;
+    } else {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("unsupported filesystem type"));
         goto error;
+    }
 
     return virBufferContentAndReset(&opt);
 
@@ -8320,11 +8321,20 @@ qemuBuildCommandLine(virConnectPtr conn,
             char *optstr;
             virDomainFSDefPtr fs = def->fss[i];
 
-            virCommandAddArg(cmd, "-fsdev");
-            if (!(optstr = qemuBuildFSStr(fs, qemuCaps)))
+            if (fs->type != VIR_DOMAIN_FS_TYPE_MOUNT) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                               _("only supports mount filesystem type"));
                 goto error;
-            virCommandAddArg(cmd, optstr);
-            VIR_FREE(optstr);
+            }
+
+            if (fs->type == VIR_DOMAIN_FS_TYPE_MOUNT &&
+                fs->model != VIR_DOMAIN_FS_MODEL_MTP) {
+                virCommandAddArg(cmd, "-fsdev");
+                if (!(optstr = qemuBuildFSStr(fs, qemuCaps)))
+                    goto error;
+                virCommandAddArg(cmd, optstr);
+                VIR_FREE(optstr);
+            }
 
             virCommandAddArg(cmd, "-device");
             if (!(optstr = qemuBuildFSDevStr(def, fs, qemuCaps)))
-- 
1.9.3




More information about the libvir-list mailing list