[PATCH 0/4] qemu: Add support for mtp filesystem driver

This patch series adds support for the mtp backed filesystem device exposed through a virtual USB MTP device. Usage: <filesystem type='mount'> <driver type='mtp'/> <source dir='/export/to/guest'/> <target dir='mtptag'/> </filesystem> Rayhan Faizel (4): qemu_capabilities: Add QEMU_CAPS_DEVICE_MTP capability qemu: Support for parsing usb-mtp devices tests: Add testcases for mtp filesystem driver docs: Add documentation for mtp filesystem driver docs/formatdomain.rst | 7 ++++ src/bhyve/bhyve_command.c | 1 + src/conf/domain_conf.c | 10 +++++ src/conf/domain_conf.h | 1 + src/conf/schemas/domaincommon.rng | 5 +++ src/qemu/qemu_capabilities.c | 2 + src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 34 +++++++++++++++ src/qemu/qemu_domain_address.c | 7 +++- src/qemu/qemu_validate.c | 13 ++++++ .../caps_4.2.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_4.2.0_ppc64.xml | 1 + .../caps_4.2.0_x86_64.xml | 1 + .../caps_5.0.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_5.0.0_ppc64.xml | 1 + .../caps_5.0.0_riscv64.xml | 1 + .../caps_5.0.0_x86_64.xml | 1 + .../caps_5.1.0_x86_64.xml | 1 + .../caps_5.2.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_5.2.0_ppc64.xml | 1 + .../caps_5.2.0_riscv64.xml | 1 + .../caps_5.2.0_x86_64.xml | 1 + .../caps_6.0.0_aarch64.xml | 1 + .../caps_6.0.0_x86_64.xml | 1 + .../caps_6.1.0_x86_64.xml | 1 + .../caps_6.2.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_6.2.0_ppc64.xml | 1 + .../caps_6.2.0_x86_64.xml | 1 + .../caps_7.0.0_aarch64+hvf.xml | 1 + .../caps_7.0.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_7.0.0_ppc64.xml | 1 + .../caps_7.0.0_x86_64.xml | 1 + .../qemucapabilitiesdata/caps_7.1.0_ppc64.xml | 1 + .../caps_7.1.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml | 1 + .../caps_7.2.0_x86_64+hvf.xml | 1 + .../caps_7.2.0_x86_64.xml | 1 + .../caps_8.0.0_riscv64.xml | 1 + .../caps_8.0.0_x86_64.xml | 1 + .../qemucapabilitiesdata/caps_8.1.0_s390x.xml | 1 + .../caps_8.1.0_x86_64.xml | 1 + .../caps_8.2.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_8.2.0_s390x.xml | 1 + .../caps_8.2.0_x86_64.xml | 1 + .../caps_9.0.0_x86_64.xml | 1 + .../mtp-usb-device.x86_64-latest.args | 35 ++++++++++++++++ .../mtp-usb-device.x86_64-latest.xml | 42 +++++++++++++++++++ tests/qemuxmlconfdata/mtp-usb-device.xml | 27 ++++++++++++ tests/qemuxmlconftest.c | 2 + 49 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 tests/qemuxmlconfdata/mtp-usb-device.x86_64-latest.args create mode 100644 tests/qemuxmlconfdata/mtp-usb-device.x86_64-latest.xml create mode 100644 tests/qemuxmlconfdata/mtp-usb-device.xml -- 2.34.1

Signed-off-by: Rayhan Faizel <rayhan.faizel@gmail.com> --- src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_capabilities.h | 1 + tests/qemucapabilitiesdata/caps_4.2.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_4.2.0_ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_4.2.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_5.0.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_5.0.0_ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_5.0.0_riscv64.xml | 1 + tests/qemucapabilitiesdata/caps_5.0.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_5.1.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_5.2.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_5.2.0_ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_5.2.0_riscv64.xml | 1 + tests/qemucapabilitiesdata/caps_5.2.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_6.0.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_6.0.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_6.1.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_6.2.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_7.0.0_aarch64+hvf.xml | 1 + tests/qemucapabilitiesdata/caps_7.0.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml | 1 + tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml | 1 + tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml | 1 + tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml | 1 + tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml | 1 + tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml | 1 + 37 files changed, 38 insertions(+) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index ab11a929a3..7696756c3e 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -704,6 +704,7 @@ VIR_ENUM_IMPL(virQEMUCaps, /* 455 */ "blockjob.backing-mask-protocol", /* QEMU_CAPS_BLOCKJOB_BACKING_MASK_PROTOCOL */ + "mtp", /* QEMU_CAPS_DEVICE_MTP */ ); @@ -1390,6 +1391,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = { { "virtio-crypto-device", QEMU_CAPS_DEVICE_VIRTIO_CRYPTO }, { "cryptodev-backend-lkcf", QEMU_CAPS_OBJECT_CRYPTO_LKCF }, { "pvpanic-pci", QEMU_CAPS_DEVICE_PANIC_PCI }, + { "usb-mtp", QEMU_CAPS_DEVICE_MTP }, }; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index ef1ad2c01c..6a98bfd3cc 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -683,6 +683,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ /* 455 */ QEMU_CAPS_BLOCKJOB_BACKING_MASK_PROTOCOL, /* backing-mask-protocol of block-commit/block-stream */ + QEMU_CAPS_DEVICE_MTP, /* USB device accessed through Media Transfer Protocol (MTP) */ QEMU_CAPS_LAST /* this must always be the last item */ } virQEMUCapsFlags; diff --git a/tests/qemucapabilitiesdata/caps_4.2.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_4.2.0_aarch64.xml index 2e6ea51d02..2d8ebf5e4a 100644 --- a/tests/qemucapabilitiesdata/caps_4.2.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_4.2.0_aarch64.xml @@ -105,6 +105,7 @@ <flag name='virtio-blk.queue-size'/> <flag name='usb-host.guest-resets-all'/> <flag name='virtio-crypto'/> + <flag name='mtp'/> <version>4002000</version> <microcodeVersion>61700242</microcodeVersion> <package>v4.1.0-2221-g36609b4fa3</package> diff --git a/tests/qemucapabilitiesdata/caps_4.2.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_4.2.0_ppc64.xml index 9eff51672f..d638e618ed 100644 --- a/tests/qemucapabilitiesdata/caps_4.2.0_ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_4.2.0_ppc64.xml @@ -105,6 +105,7 @@ <flag name='virtio-blk.queue-size'/> <flag name='usb-host.guest-resets-all'/> <flag name='virtio-crypto'/> + <flag name='mtp'/> <version>4002000</version> <microcodeVersion>42900242</microcodeVersion> <package>v4.1.0-2198-g9e583f2</package> diff --git a/tests/qemucapabilitiesdata/caps_4.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_4.2.0_x86_64.xml index 28ccaa1271..d7607dfe6a 100644 --- a/tests/qemucapabilitiesdata/caps_4.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_4.2.0_x86_64.xml @@ -143,6 +143,7 @@ <flag name='virtio-blk.queue-size'/> <flag name='usb-host.guest-resets-all'/> <flag name='virtio-crypto'/> + <flag name='mtp'/> <version>4002000</version> <microcodeVersion>43100242</microcodeVersion> <package>v4.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_5.0.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_5.0.0_aarch64.xml index 9d3b538119..04bcbe1f65 100644 --- a/tests/qemucapabilitiesdata/caps_5.0.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_5.0.0_aarch64.xml @@ -117,6 +117,7 @@ <flag name='virtio-iommu-pci'/> <flag name='usb-host.guest-resets-all'/> <flag name='virtio-crypto'/> + <flag name='mtp'/> <version>5000000</version> <microcodeVersion>61700241</microcodeVersion> <package>v5.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_5.0.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_5.0.0_ppc64.xml index 3e244da67e..df1ae30670 100644 --- a/tests/qemucapabilitiesdata/caps_5.0.0_ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_5.0.0_ppc64.xml @@ -120,6 +120,7 @@ <flag name='virtio-iommu-pci'/> <flag name='usb-host.guest-resets-all'/> <flag name='virtio-crypto'/> + <flag name='mtp'/> <version>5000000</version> <microcodeVersion>42900241</microcodeVersion> <package>v5.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_5.0.0_riscv64.xml b/tests/qemucapabilitiesdata/caps_5.0.0_riscv64.xml index 502a9cecac..ea44beb348 100644 --- a/tests/qemucapabilitiesdata/caps_5.0.0_riscv64.xml +++ b/tests/qemucapabilitiesdata/caps_5.0.0_riscv64.xml @@ -112,6 +112,7 @@ <flag name='virtio-iommu-pci'/> <flag name='usb-host.guest-resets-all'/> <flag name='virtio-crypto'/> + <flag name='mtp'/> <version>5000000</version> <microcodeVersion>0</microcodeVersion> <package>v5.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_5.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_5.0.0_x86_64.xml index d40f771e77..3c4728777c 100644 --- a/tests/qemucapabilitiesdata/caps_5.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_5.0.0_x86_64.xml @@ -152,6 +152,7 @@ <flag name='virtio-iommu-pci'/> <flag name='usb-host.guest-resets-all'/> <flag name='virtio-crypto'/> + <flag name='mtp'/> <version>5000000</version> <microcodeVersion>43100241</microcodeVersion> <package>v5.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_5.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_5.1.0_x86_64.xml index e26f946a63..8077becdd9 100644 --- a/tests/qemucapabilitiesdata/caps_5.1.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_5.1.0_x86_64.xml @@ -156,6 +156,7 @@ <flag name='virtio-net.rss'/> <flag name='usb-host.guest-resets-all'/> <flag name='virtio-crypto'/> + <flag name='mtp'/> <version>5001000</version> <microcodeVersion>43100242</microcodeVersion> <package>v5.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_5.2.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_5.2.0_aarch64.xml index 5d3f58e887..7c61b08c7b 100644 --- a/tests/qemucapabilitiesdata/caps_5.2.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_5.2.0_aarch64.xml @@ -124,6 +124,7 @@ <flag name='virtio-net.rss'/> <flag name='usb-host.guest-resets-all'/> <flag name='virtio-crypto'/> + <flag name='mtp'/> <version>5002000</version> <microcodeVersion>61700243</microcodeVersion> <package>v5.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_5.2.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_5.2.0_ppc64.xml index 0496d3f0d6..040ec00623 100644 --- a/tests/qemucapabilitiesdata/caps_5.2.0_ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_5.2.0_ppc64.xml @@ -125,6 +125,7 @@ <flag name='virtio-net.rss'/> <flag name='usb-host.guest-resets-all'/> <flag name='virtio-crypto'/> + <flag name='mtp'/> <version>5002000</version> <microcodeVersion>42900243</microcodeVersion> <package>v5.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_5.2.0_riscv64.xml b/tests/qemucapabilitiesdata/caps_5.2.0_riscv64.xml index 5ac98d8386..dcc3b2fe78 100644 --- a/tests/qemucapabilitiesdata/caps_5.2.0_riscv64.xml +++ b/tests/qemucapabilitiesdata/caps_5.2.0_riscv64.xml @@ -117,6 +117,7 @@ <flag name='virtio-net.rss'/> <flag name='usb-host.guest-resets-all'/> <flag name='virtio-crypto'/> + <flag name='mtp'/> <version>5002000</version> <microcodeVersion>0</microcodeVersion> <package>v5.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_5.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_5.2.0_x86_64.xml index 99c0c2e06c..402f609213 100644 --- a/tests/qemucapabilitiesdata/caps_5.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_5.2.0_x86_64.xml @@ -159,6 +159,7 @@ <flag name='virtio-net.rss'/> <flag name='usb-host.guest-resets-all'/> <flag name='virtio-crypto'/> + <flag name='mtp'/> <version>5002000</version> <microcodeVersion>43100243</microcodeVersion> <package>v5.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_6.0.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_6.0.0_aarch64.xml index a1712233c5..c4ef0f1e8b 100644 --- a/tests/qemucapabilitiesdata/caps_6.0.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_6.0.0_aarch64.xml @@ -134,6 +134,7 @@ <flag name='migration.blocked-reasons'/> <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> + <flag name='mtp'/> <version>6000000</version> <microcodeVersion>61700242</microcodeVersion> <package>v6.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_6.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_6.0.0_x86_64.xml index 294d6f3124..91e7330489 100644 --- a/tests/qemucapabilitiesdata/caps_6.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_6.0.0_x86_64.xml @@ -170,6 +170,7 @@ <flag name='migration.blocked-reasons'/> <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> + <flag name='mtp'/> <version>6000000</version> <microcodeVersion>43100242</microcodeVersion> <package>v6.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_6.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_6.1.0_x86_64.xml index d32ebf0c3b..238fc860e4 100644 --- a/tests/qemucapabilitiesdata/caps_6.1.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_6.1.0_x86_64.xml @@ -176,6 +176,7 @@ <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> + <flag name='mtp'/> <version>6001000</version> <microcodeVersion>43100243</microcodeVersion> <package>v6.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_6.2.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_6.2.0_aarch64.xml index 7a12ed41c4..89893ed067 100644 --- a/tests/qemucapabilitiesdata/caps_6.2.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_6.2.0_aarch64.xml @@ -147,6 +147,7 @@ <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> + <flag name='mtp'/> <version>6001050</version> <microcodeVersion>61700244</microcodeVersion> <package></package> diff --git a/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml index fe1bffd491..85c4225244 100644 --- a/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml @@ -136,6 +136,7 @@ <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> + <flag name='mtp'/> <version>6002000</version> <microcodeVersion>42900244</microcodeVersion> <package>v6.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml index ca9a784c72..4f9050d469 100644 --- a/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml @@ -178,6 +178,7 @@ <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> + <flag name='mtp'/> <version>6002000</version> <microcodeVersion>43100244</microcodeVersion> <package>v6.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.0.0_aarch64+hvf.xml b/tests/qemucapabilitiesdata/caps_7.0.0_aarch64+hvf.xml index bca905987a..19132cad52 100644 --- a/tests/qemucapabilitiesdata/caps_7.0.0_aarch64+hvf.xml +++ b/tests/qemucapabilitiesdata/caps_7.0.0_aarch64+hvf.xml @@ -155,6 +155,7 @@ <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> + <flag name='mtp'/> <version>6002092</version> <microcodeVersion>61700243</microcodeVersion> <package>v7.0.0-rc2</package> diff --git a/tests/qemucapabilitiesdata/caps_7.0.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_7.0.0_aarch64.xml index 9c61b92c1e..c12d43bd22 100644 --- a/tests/qemucapabilitiesdata/caps_7.0.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_7.0.0_aarch64.xml @@ -155,6 +155,7 @@ <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> + <flag name='mtp'/> <version>6002092</version> <microcodeVersion>61700243</microcodeVersion> <package>v7.0.0-rc2</package> diff --git a/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml index 047a867766..84c63bf8c1 100644 --- a/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml @@ -154,6 +154,7 @@ <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> + <flag name='mtp'/> <version>7000000</version> <microcodeVersion>42900243</microcodeVersion> <package>v7.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml index 8caeba3773..b55fb8eb15 100644 --- a/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml @@ -184,6 +184,7 @@ <flag name='virtio-crypto'/> <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> + <flag name='mtp'/> <version>7000000</version> <microcodeVersion>43100243</microcodeVersion> <package>v7.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml index 536524cf18..ecaa34dbf3 100644 --- a/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml @@ -155,6 +155,7 @@ <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> <flag name='smp-clusters'/> + <flag name='mtp'/> <version>7001000</version> <microcodeVersion>42900244</microcodeVersion> <package>v7.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml index 745776b14b..1f2eced660 100644 --- a/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml @@ -188,6 +188,7 @@ <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> <flag name='smp-clusters'/> + <flag name='mtp'/> <version>7001000</version> <microcodeVersion>43100244</microcodeVersion> <package>v7.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml b/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml index 127b8ee4c2..a67c6c090c 100644 --- a/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml +++ b/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml @@ -150,6 +150,7 @@ <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> <flag name='smp-clusters'/> + <flag name='mtp'/> <version>7002000</version> <microcodeVersion>0</microcodeVersion> <package>qemu-7.2.0-6.fc37</package> diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml index 4018213189..fd0f50db6b 100644 --- a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml +++ b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml @@ -192,6 +192,7 @@ <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> <flag name='smp-clusters'/> + <flag name='mtp'/> <version>7002000</version> <microcodeVersion>43100245</microcodeVersion> <package>v7.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml index e43890fb68..cbea67f03d 100644 --- a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml @@ -192,6 +192,7 @@ <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> <flag name='smp-clusters'/> + <flag name='mtp'/> <version>7002000</version> <microcodeVersion>43100245</microcodeVersion> <package>v7.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml b/tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml index 8976045015..d1008bafd9 100644 --- a/tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml +++ b/tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml @@ -138,6 +138,7 @@ <flag name='pvpanic-pci'/> <flag name='virtio-gpu.blob'/> <flag name='smp-clusters'/> + <flag name='mtp'/> <version>7002050</version> <microcodeVersion>0</microcodeVersion> <package>v7.2.0-333-g222059a0fc</package> diff --git a/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml index 3095b2fdab..2493f68110 100644 --- a/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml @@ -196,6 +196,7 @@ <flag name='rbd-encryption-layering'/> <flag name='rbd-encryption-luks-any'/> <flag name='smp-clusters'/> + <flag name='mtp'/> <version>8000000</version> <microcodeVersion>43100244</microcodeVersion> <package>v8.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml b/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml index ea5eec0435..23ecfd1d81 100644 --- a/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml @@ -119,6 +119,7 @@ <flag name='qcow2-discard-no-unref'/> <flag name='run-with.async-teardown'/> <flag name='smp-clusters'/> + <flag name='mtp'/> <version>8001000</version> <microcodeVersion>39100245</microcodeVersion> <package>v8.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml index 6375f428a0..b4f2941dc6 100644 --- a/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml @@ -198,6 +198,7 @@ <flag name='run-with.async-teardown'/> <flag name='virtio-blk-vhost-vdpa'/> <flag name='smp-clusters'/> + <flag name='mtp'/> <version>8001000</version> <microcodeVersion>43100245</microcodeVersion> <package>v8.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml index bf5c80c848..9ee0f481c7 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml @@ -163,6 +163,7 @@ <flag name='run-with.async-teardown'/> <flag name='smp-clusters'/> <flag name='virtio-mem-pci.dynamic-memslots'/> + <flag name='mtp'/> <version>8002000</version> <microcodeVersion>61700246</microcodeVersion> <package>v8.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml b/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml index bd413b61e7..2763061585 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml @@ -119,6 +119,7 @@ <flag name='qcow2-discard-no-unref'/> <flag name='run-with.async-teardown'/> <flag name='smp-clusters'/> + <flag name='mtp'/> <version>8002000</version> <microcodeVersion>39100246</microcodeVersion> <package>v8.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml index c7969d9de5..c38ce1f985 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml @@ -200,6 +200,7 @@ <flag name='virtio-blk-vhost-vdpa'/> <flag name='smp-clusters'/> <flag name='virtio-mem-pci.dynamic-memslots'/> + <flag name='mtp'/> <version>8002000</version> <microcodeVersion>43100246</microcodeVersion> <package>v8.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml index 7bf13da1db..bc90ac633c 100644 --- a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml @@ -202,6 +202,7 @@ <flag name='smp-clusters'/> <flag name='virtio-mem-pci.dynamic-memslots'/> <flag name='blockjob.backing-mask-protocol'/> + <flag name='mtp'/> <version>8002050</version> <microcodeVersion>43100245</microcodeVersion> <package>v8.2.0-952-g14639717bf</package> -- 2.34.1

On 3/8/24 21:16, Rayhan Faizel wrote:
Signed-off-by: Rayhan Faizel <rayhan.faizel@gmail.com> --- src/qemu/qemu_capabilities.c | 2 ++ src/qemu/qemu_capabilities.h | 1 + tests/qemucapabilitiesdata/caps_4.2.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_4.2.0_ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_4.2.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_5.0.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_5.0.0_ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_5.0.0_riscv64.xml | 1 + tests/qemucapabilitiesdata/caps_5.0.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_5.1.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_5.2.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_5.2.0_ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_5.2.0_riscv64.xml | 1 + tests/qemucapabilitiesdata/caps_5.2.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_6.0.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_6.0.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_6.1.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_6.2.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_7.0.0_aarch64+hvf.xml | 1 + tests/qemucapabilitiesdata/caps_7.0.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml | 1 + tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml | 1 + tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml | 1 + tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_8.0.0_riscv64.xml | 1 + tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml | 1 + tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml | 1 + tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml | 1 + tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml | 1 + 37 files changed, 38 insertions(+)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index ab11a929a3..7696756c3e 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -704,6 +704,7 @@ VIR_ENUM_IMPL(virQEMUCaps,
/* 455 */ "blockjob.backing-mask-protocol", /* QEMU_CAPS_BLOCKJOB_BACKING_MASK_PROTOCOL */ + "mtp", /* QEMU_CAPS_DEVICE_MTP */
Nitpick, I'd name this "usb-mtp" and QEMU_CAPS_DEVICE_USB_MTP so that it's obvious the corresponding device is "-device usb-mtp" and not just "-device mtp". I'll do the necessary changes before pushing. Michal

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> --- src/bhyve/bhyve_command.c | 1 + src/conf/domain_conf.c | 10 +++++++++ src/conf/domain_conf.h | 1 + src/conf/schemas/domaincommon.rng | 5 +++++ src/qemu/qemu_command.c | 34 +++++++++++++++++++++++++++++++ src/qemu/qemu_domain_address.c | 7 +++++-- src/qemu/qemu_validate.c | 13 ++++++++++++ 7 files changed, 69 insertions(+), 2 deletions(-) diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c index d05b01ae5d..bc287307c8 100644 --- a/src/bhyve/bhyve_command.c +++ b/src/bhyve/bhyve_command.c @@ -611,6 +611,7 @@ bhyveBuildFSArgStr(const virDomainDef *def G_GNUC_UNUSED, 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: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("unsupported filesystem driver '%1$s'"), diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 3597959e33..396e388ca8 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -517,6 +517,7 @@ VIR_ENUM_IMPL(virDomainFSDriver, "nbd", "ploop", "virtiofs", + "mtp", ); VIR_ENUM_IMPL(virDomainFSAccessMode, @@ -28721,6 +28722,15 @@ virDomainUSBDeviceDefForeach(virDomainDef *def, } } + /* usb-mtp */ + for (i = 0; i < def->nfss; i++) { + virDomainFSDef *fsdev = def->fss[i]; + if (fsdev->fsdriver == VIR_DOMAIN_FS_DRIVER_TYPE_MTP) { + if (iter(&fsdev->info, opaque) < 0) + return -1; + } + } + return 0; } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index c7e5005b3b..76251938b8 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -804,6 +804,7 @@ typedef enum { VIR_DOMAIN_FS_DRIVER_TYPE_NBD, VIR_DOMAIN_FS_DRIVER_TYPE_PLOOP, VIR_DOMAIN_FS_DRIVER_TYPE_VIRTIOFS, + VIR_DOMAIN_FS_DRIVER_TYPE_MTP, VIR_DOMAIN_FS_DRIVER_TYPE_LAST } virDomainFSDriverType; diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng index df44cd9857..c992956280 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -3253,6 +3253,11 @@ </optional> <ref name="virtioOptions"/> </group> + <group> + <attribute name="type"> + <value>mtp</value> + </attribute> + </group> <empty/> </choice> </element> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 2719574fb5..9c20670843 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -861,6 +861,7 @@ qemuBuildVirtioDevGetConfigDev(const virDomainDeviceDef *device, *baseName = "vhost-user-fs"; break; + case VIR_DOMAIN_FS_DRIVER_TYPE_MTP: case VIR_DOMAIN_FS_DRIVER_TYPE_LOOP: case VIR_DOMAIN_FS_DRIVER_TYPE_NBD: case VIR_DOMAIN_FS_DRIVER_TYPE_PLOOP: @@ -2310,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, @@ -2493,6 +2521,12 @@ 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: diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index af486aea97..cc3bc76971 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -642,6 +642,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDef *dev, /* vhost-user-fs-pci */ return virtioFlags; + case VIR_DOMAIN_FS_DRIVER_TYPE_MTP: case VIR_DOMAIN_FS_DRIVER_TYPE_LOOP: case VIR_DOMAIN_FS_DRIVER_TYPE_NBD: case VIR_DOMAIN_FS_DRIVER_TYPE_PLOOP: @@ -2074,8 +2075,10 @@ qemuDomainAssignDevicePCISlots(virDomainDef *def, if (!virDeviceInfoPCIAddressIsWanted(&def->fss[i]->info)) continue; - /* Only support VirtIO-9p-pci so far. If that changes, - * we might need to skip devices here */ + /* Skip MTP device */ + if (def->fss[i]->fsdriver == VIR_DOMAIN_FS_DRIVER_TYPE_MTP) + continue; + if (qemuDomainPCIAddressReserveNextAddr(addrs, &def->fss[i]->info) < 0) return -1; } diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 73afd094a9..2d391a3916 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -4469,6 +4469,19 @@ qemuValidateDomainDeviceDefFS(virDomainFSDef *fs, } break; + case VIR_DOMAIN_FS_DRIVER_TYPE_MTP: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_MTP)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("mtp is not supported with this QEMU binary")); + return -1; + } + if (fs->accessmode != VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("mtp only supports passthrough accessmode")); + return -1; + } + break; + case VIR_DOMAIN_FS_DRIVER_TYPE_LAST: default: virReportEnumRangeError(virDomainFSDriverType, fs->fsdriver); -- 2.34.1

On 3/8/24 21:16, Rayhan Faizel wrote:
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> --- src/bhyve/bhyve_command.c | 1 + src/conf/domain_conf.c | 10 +++++++++ src/conf/domain_conf.h | 1 + src/conf/schemas/domaincommon.rng | 5 +++++ src/qemu/qemu_command.c | 34 +++++++++++++++++++++++++++++++ src/qemu/qemu_domain_address.c | 7 +++++-- src/qemu/qemu_validate.c | 13 ++++++++++++ 7 files changed, 69 insertions(+), 2 deletions(-)
The code is okay, but for future - we tend to split changes a bit differently: in one patch we do necessary XML parsing & formatting work, update RNG and docs. Then, in another patch xml -> qemu cmd line generator is introduced. Reasoning is quite simple - easier backports. And of course, split between front & back ends. Now, in the past we used to update tests too: in the commit that introduces XML parsing & formatting an xml2xml test case was introduced, then in the other patch (xml -> qemu cmd line) an xml2argv test case was introdcued. But this is hard to do after qemuxml2xmltest and qemuxml2argvtest were merged into one. I'm not sure what our recommendation should be here. For now, I'll just merge qemu command line generation code AND test cases (patch 3/4) into one. Let me split changes in patches 2-4 into separate ones. Michal

Simple test case that adds two filesystem devices, one of which is read only. Signed-off-by: Rayhan Faizel <rayhan.faizel@gmail.com> --- .../mtp-usb-device.x86_64-latest.args | 35 ++++++++++++++++ .../mtp-usb-device.x86_64-latest.xml | 42 +++++++++++++++++++ tests/qemuxmlconfdata/mtp-usb-device.xml | 27 ++++++++++++ tests/qemuxmlconftest.c | 2 + 4 files changed, 106 insertions(+) create mode 100644 tests/qemuxmlconfdata/mtp-usb-device.x86_64-latest.args create mode 100644 tests/qemuxmlconfdata/mtp-usb-device.x86_64-latest.xml create mode 100644 tests/qemuxmlconfdata/mtp-usb-device.xml 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 index 0000000000..71020e6e5e --- /dev/null +++ b/tests/qemuxmlconfdata/mtp-usb-device.x86_64-latest.args @@ -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 index 0000000000..9b0dd7ef86 --- /dev/null +++ b/tests/qemuxmlconfdata/mtp-usb-device.x86_64-latest.xml @@ -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 index 0000000000..a44ba35e8d --- /dev/null +++ b/tests/qemuxmlconfdata/mtp-usb-device.xml @@ -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> diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c index 03453e8ec8..718367c51a 100644 --- a/tests/qemuxmlconftest.c +++ b/tests/qemuxmlconftest.c @@ -2838,6 +2838,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; -- 2.34.1

Signed-off-by: Rayhan Faizel <rayhan.faizel@gmail.com> --- docs/formatdomain.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 967283aaa9..f829f08bde 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -3590,6 +3590,11 @@ A directory on the host that can be accessed directly from the guest. <source socket='/tmp/sock'/> <target dir='tag'/> </filesystem> + <filesystem type='mount'> + <driver type='mtp'/> + <source dir='/export/to/guest'/> + <target dir='mtptag'/> + </filesystem> ... </devices> ... @@ -3702,6 +3707,8 @@ A directory on the host that can be accessed directly from the guest. can also be set. ( :since:`Since 3.5.0` ) - For ``virtiofs``, the ``queue`` attribute can be used to specify the queue size (i.e. how many requests can the queue fit). ( :since:`Since 6.2.0` ) + - QEMU supports ``mtp`` which exposes a virtual USB MTP device to the + guest. ``binary`` The optional ``binary`` element can tune the options for virtiofsd. All of -- 2.34.1

Hi, A week has passed so I am bumping this thread. On Fri, Mar 8, 2024 at 11:20 PM Rayhan Faizel <rayhan.faizel@gmail.com> wrote:
This patch series adds support for the mtp backed filesystem device exposed through a virtual USB MTP device.
Usage:
<filesystem type='mount'> <driver type='mtp'/> <source dir='/export/to/guest'/> <target dir='mtptag'/> </filesystem>
Rayhan Faizel (4): qemu_capabilities: Add QEMU_CAPS_DEVICE_MTP capability qemu: Support for parsing usb-mtp devices tests: Add testcases for mtp filesystem driver docs: Add documentation for mtp filesystem driver
docs/formatdomain.rst | 7 ++++ src/bhyve/bhyve_command.c | 1 + src/conf/domain_conf.c | 10 +++++ src/conf/domain_conf.h | 1 + src/conf/schemas/domaincommon.rng | 5 +++ src/qemu/qemu_capabilities.c | 2 + src/qemu/qemu_capabilities.h | 1 + src/qemu/qemu_command.c | 34 +++++++++++++++ src/qemu/qemu_domain_address.c | 7 +++- src/qemu/qemu_validate.c | 13 ++++++ .../caps_4.2.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_4.2.0_ppc64.xml | 1 + .../caps_4.2.0_x86_64.xml | 1 + .../caps_5.0.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_5.0.0_ppc64.xml | 1 + .../caps_5.0.0_riscv64.xml | 1 + .../caps_5.0.0_x86_64.xml | 1 + .../caps_5.1.0_x86_64.xml | 1 + .../caps_5.2.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_5.2.0_ppc64.xml | 1 + .../caps_5.2.0_riscv64.xml | 1 + .../caps_5.2.0_x86_64.xml | 1 + .../caps_6.0.0_aarch64.xml | 1 + .../caps_6.0.0_x86_64.xml | 1 + .../caps_6.1.0_x86_64.xml | 1 + .../caps_6.2.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_6.2.0_ppc64.xml | 1 + .../caps_6.2.0_x86_64.xml | 1 + .../caps_7.0.0_aarch64+hvf.xml | 1 + .../caps_7.0.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_7.0.0_ppc64.xml | 1 + .../caps_7.0.0_x86_64.xml | 1 + .../qemucapabilitiesdata/caps_7.1.0_ppc64.xml | 1 + .../caps_7.1.0_x86_64.xml | 1 + tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml | 1 + .../caps_7.2.0_x86_64+hvf.xml | 1 + .../caps_7.2.0_x86_64.xml | 1 + .../caps_8.0.0_riscv64.xml | 1 + .../caps_8.0.0_x86_64.xml | 1 + .../qemucapabilitiesdata/caps_8.1.0_s390x.xml | 1 + .../caps_8.1.0_x86_64.xml | 1 + .../caps_8.2.0_aarch64.xml | 1 + .../qemucapabilitiesdata/caps_8.2.0_s390x.xml | 1 + .../caps_8.2.0_x86_64.xml | 1 + .../caps_9.0.0_x86_64.xml | 1 + .../mtp-usb-device.x86_64-latest.args | 35 ++++++++++++++++ .../mtp-usb-device.x86_64-latest.xml | 42 +++++++++++++++++++ tests/qemuxmlconfdata/mtp-usb-device.xml | 27 ++++++++++++ tests/qemuxmlconftest.c | 2 + 49 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 tests/qemuxmlconfdata/mtp-usb-device.x86_64-latest.args create mode 100644 tests/qemuxmlconfdata/mtp-usb-device.x86_64-latest.xml create mode 100644 tests/qemuxmlconfdata/mtp-usb-device.xml
-- 2.34.1
-- Rayhan Faizel

On 3/8/24 21:16, Rayhan Faizel wrote:
This patch series adds support for the mtp backed filesystem device exposed through a virtual USB MTP device.
Usage:
<filesystem type='mount'> <driver type='mtp'/> <source dir='/export/to/guest'/> <target dir='mtptag'/> </filesystem>
Rayhan Faizel (4): qemu_capabilities: Add QEMU_CAPS_DEVICE_MTP capability qemu: Support for parsing usb-mtp devices tests: Add testcases for mtp filesystem driver docs: Add documentation for mtp filesystem driver
49 files changed, 220 insertions(+), 2 deletions(-)
Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Do you mind posting a patch that mentions this new feature in NEWS.rst? It's something users might be interested in. Michal
participants (2)
-
Michal Prívozník
-
Rayhan Faizel