From: Rayhan Faizel Date: Tue, 19 Mar 2024 15:15:50 +0000 (+0100) Subject: conf: Introduce support for usb-mtp devices X-Git-Tag: v10.2.0-rc1~33 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5c70a7e32866554b19942fb121f40ed420472f5b;p=thirdparty%2Flibvirt.git conf: Introduce support for usb-mtp devices Expose usb-mtp device as another type of . Signed-off-by: Rayhan Faizel Signed-off-by: Michal Privoznik Reviewed-by: Michal Privoznik --- diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index 967283aaa9..2adc2ff968 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. + + + + + ... ... @@ -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. ( :since:`Since 10.2.0` ) ``binary`` The optional ``binary`` element can tune the options for virtiofsd. All of 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 2a64a4a1ad..770b5fbbff 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, @@ -28724,6 +28725,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 @@ + + + mtp + + diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index b163322191..7fab86d47f 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: @@ -2496,6 +2497,7 @@ qemuBuildFilesystemCommandLine(virCommand *cmd, 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/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..6a73d02050 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_USB_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);