]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: Introduce support for usb-mtp devices
authorRayhan Faizel <rayhan.faizel@gmail.com>
Tue, 19 Mar 2024 15:15:50 +0000 (16:15 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 19 Mar 2024 16:36:19 +0000 (17:36 +0100)
Expose usb-mtp device as another type of <filesystem/>.

Signed-off-by: Rayhan Faizel <rayhan.faizel@gmail.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
docs/formatdomain.rst
src/bhyve/bhyve_command.c
src/conf/domain_conf.c
src/conf/domain_conf.h
src/conf/schemas/domaincommon.rng
src/qemu/qemu_command.c
src/qemu/qemu_domain_address.c
src/qemu/qemu_validate.c

index 967283aaa98858f654fb6fb65b4874594aa3dbc6..2adc2ff968682cbf11cce1ad7d9bcee1e6c82743 100644 (file)
@@ -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. ( :since:`Since 10.2.0` )
 
 ``binary``
    The optional ``binary`` element can tune the options for virtiofsd. All of
index d05b01ae5d13bd866b9e41334e2fdd483606a0d1..bc287307c89a69f29388cbb93242c80673e173f1 100644 (file)
@@ -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'"),
index 2a64a4a1ade72a5ae77868b8f652b4ded6cbdba4..770b5fbbff4d5cbef3940549c2cd1b9b1528ac67 100644 (file)
@@ -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;
 }
 
index c7e5005b3b17ef971b8194ac3de851ac560737b3..76251938b8caa2d7aa32e9ce41aef63f0a3b0a7a 100644 (file)
@@ -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;
index df44cd9857cd937170b8dc6dae47684a91241074..c9929562808d652687656795da25e3a2522ac709 100644 (file)
           </optional>
           <ref name="virtioOptions"/>
         </group>
+        <group>
+          <attribute name="type">
+            <value>mtp</value>
+          </attribute>
+        </group>
         <empty/>
       </choice>
     </element>
index b1633221912557607ee8ef0a539e02f5504dcc23..7fab86d47fd9aac8d378e091afce2ec20c78eaf7 100644 (file)
@@ -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;
         }
index af486aea972bcf65f481f3ce75b48a37603788cc..cc3bc76971d86ae21a6386507bbc9a3ddb45f9e0 100644 (file)
@@ -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;
     }
index 73afd094a99423512c308986f1916333c948c9c8..6a73d02050781eb51e7dcebcf1e9484c3fe40f10 100644 (file)
@@ -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);