]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu_command: Generate command line for MTP filesystem
authorRayhan Faizel <rayhan.faizel@gmail.com>
Tue, 19 Mar 2024 15:16:30 +0000 (16:16 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 19 Mar 2024 16:36:19 +0000 (17:36 +0100)
The source tag sets the rootdir property of the device, which is
the directory exposed to the guest via the MTP device. The target
tag sets the desc property.  This device supports read-only mode
as well. Like virtiofs, it does not support additional access
modes.

Signed-off-by: Rayhan Faizel <rayhan.faizel@gmail.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_command.c
tests/qemuxmlconfdata/mtp-usb-device.x86_64-latest.args [new file with mode: 0644]
tests/qemuxmlconfdata/mtp-usb-device.x86_64-latest.xml [new file with mode: 0644]
tests/qemuxmlconfdata/mtp-usb-device.xml [new file with mode: 0644]
tests/qemuxmlconftest.c

index 7fab86d47fd9aac8d378e091afce2ec20c78eaf7..2bb1b6a0e782758e6d5a5677c6c3a497e1a3adc4 100644 (file)
@@ -2311,6 +2311,33 @@ qemuBuildDisksCommandLine(virCommand *cmd,
 }
 
 
+static int
+qemuBuildMTPCommandLine(virCommand *cmd,
+                          virDomainFSDef *fs,
+                          const virDomainDef *def,
+                          virQEMUCaps *qemuCaps)
+{
+    g_autoptr(virJSONValue) props = NULL;
+
+    if (virJSONValueObjectAdd(&props,
+                              "s:driver", "usb-mtp",
+                              "s:id", fs->info.alias,
+                              "s:rootdir", fs->src->path,
+                              "s:desc", fs->dst,
+                              "b:readonly", fs->readonly,
+                              NULL) < 0)
+        return -1;
+
+    if (qemuBuildDeviceAddressProps(props, def, &fs->info) < 0)
+        return -1;
+
+    if (qemuBuildDeviceCommandlineFromJSON(cmd, props, def, qemuCaps) < 0)
+        return -1;
+
+    return 0;
+}
+
+
 virJSONValue *
 qemuBuildVHostUserFsDevProps(virDomainFSDef *fs,
                              const virDomainDef *def,
@@ -2494,10 +2521,15 @@ qemuBuildFilesystemCommandLine(virCommand *cmd,
                 return -1;
             break;
 
+        case VIR_DOMAIN_FS_DRIVER_TYPE_MTP:
+            /* Media Transfer Protocol over USB */
+            if (qemuBuildMTPCommandLine(cmd, def->fss[i], def, qemuCaps) < 0)
+                return -1;
+            break;
+
         case VIR_DOMAIN_FS_DRIVER_TYPE_LOOP:
         case VIR_DOMAIN_FS_DRIVER_TYPE_NBD:
         case VIR_DOMAIN_FS_DRIVER_TYPE_PLOOP:
-        case VIR_DOMAIN_FS_DRIVER_TYPE_MTP:
         case VIR_DOMAIN_FS_DRIVER_TYPE_LAST:
             break;
         }
diff --git a/tests/qemuxmlconfdata/mtp-usb-device.x86_64-latest.args b/tests/qemuxmlconfdata/mtp-usb-device.x86_64-latest.args
new file mode 100644 (file)
index 0000000..71020e6
--- /dev/null
@@ -0,0 +1,35 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1 \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.local/share \
+XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.cache \
+XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
+/usr/bin/qemu-system-x86_64 \
+-name guest=QEMUGuest1,debug-threads=on \
+-S \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
+-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
+-accel tcg \
+-cpu qemu64 \
+-m size=4194304k \
+-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":4294967296}' \
+-overcommit mem-lock=off \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid 2d4d4b20-b19b-4713-af0a-bf1cab8b455b \
+-display none \
+-no-user-config \
+-nodefaults \
+-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \
+-mon chardev=charmonitor,id=monitor,mode=control \
+-rtc base=utc \
+-no-shutdown \
+-boot strict=on \
+-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
+-device '{"driver":"usb-mtp","id":"fs0","rootdir":"/tmp/testdir1","desc":"readwrite-fs","readonly":false,"bus":"usb.0","port":"1"}' \
+-device '{"driver":"usb-mtp","id":"fs1","rootdir":"/tmp/testdir2","desc":"readonly-fs","readonly":true,"bus":"usb.0","port":"2"}' \
+-audiodev '{"id":"audio1","driver":"none"}' \
+-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \
+-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
+-msg timestamp=on
diff --git a/tests/qemuxmlconfdata/mtp-usb-device.x86_64-latest.xml b/tests/qemuxmlconfdata/mtp-usb-device.x86_64-latest.xml
new file mode 100644 (file)
index 0000000..9b0dd7e
--- /dev/null
@@ -0,0 +1,42 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>2d4d4b20-b19b-4713-af0a-bf1cab8b455b</uuid>
+  <memory unit='KiB'>4194304</memory>
+  <currentMemory unit='KiB'>4194304</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <cpu mode='custom' match='exact' check='none'>
+    <model fallback='forbid'>qemu64</model>
+  </cpu>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu-system-x86_64</emulator>
+    <controller type='usb' index='0' model='piix3-uhci'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+    </controller>
+    <controller type='pci' index='0' model='pci-root'/>
+    <filesystem type='mount' accessmode='passthrough'>
+      <driver type='mtp'/>
+      <source dir='/tmp/testdir1'/>
+      <target dir='readwrite-fs'/>
+    </filesystem>
+    <filesystem type='mount' accessmode='passthrough'>
+      <driver type='mtp'/>
+      <source dir='/tmp/testdir2'/>
+      <target dir='readonly-fs'/>
+      <readonly/>
+    </filesystem>
+    <input type='mouse' bus='ps2'/>
+    <input type='keyboard' bus='ps2'/>
+    <audio id='1' type='none'/>
+    <memballoon model='virtio'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+    </memballoon>
+  </devices>
+</domain>
diff --git a/tests/qemuxmlconfdata/mtp-usb-device.xml b/tests/qemuxmlconfdata/mtp-usb-device.xml
new file mode 100644 (file)
index 0000000..a44ba35
--- /dev/null
@@ -0,0 +1,27 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>2d4d4b20-b19b-4713-af0a-bf1cab8b455b</uuid>
+  <memory unit='KiB'>4194304</memory>
+  <currentMemory unit='KiB'>4194304</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <devices>
+    <emulator>/usr/bin/qemu-system-x86_64</emulator>
+    <controller type='usb' index='0' model='piix3-uhci'/>
+    <filesystem type='mount'>
+      <driver type='mtp'/>
+      <source dir='/tmp/testdir1'/>
+      <target dir='readwrite-fs'/>
+    </filesystem>
+    <filesystem type='mount'>
+      <driver type='mtp'/>
+      <source dir='/tmp/testdir2'/>
+      <target dir='readonly-fs'/>
+      <readonly/>
+    </filesystem>
+    <memballoon model='virtio'/>
+  </devices>
+</domain>
index af77b9abdfcd42827acd80f03112b343fed597da..71b59136da56f8cd9bb561dfdcfb86128a240b9d 100644 (file)
@@ -2966,6 +2966,8 @@ mymain(void)
     DO_TEST_CAPS_LATEST("tap-vhost-incorrect");
     DO_TEST_CAPS_LATEST("tap-vhost");
 
+    DO_TEST_CAPS_LATEST("mtp-usb-device")
+
     /* check that all input files were actually used here */
     if (testConfXMLCheck(existingTestCases) < 0)
         ret = -1;