[libvirt] [PATCH v2 libvirt 4/8] qemu: add support for MTP filesystem
Giuseppe Scrivano
gscrivan at redhat.com
Tue Aug 19 19:49:12 UTC 2014
Michal Privoznik <mprivozn at redhat.com> writes:
> On 11.08.2014 16:47, Giuseppe Scrivano wrote:
>> 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) {
>
> I'd feel safer with:
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index ac8803a..ec269d6 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -4027,10 +4027,13 @@ qemuBuildFSDevStr(virDomainDefPtr def,
>
> if (fs->type == VIR_DOMAIN_FS_TYPE_MOUNT) {
>
> - if (fs->model == VIR_DOMAIN_FS_MODEL_MTP) {
> + switch ((virDomainFSModel) fs->model) {
> + case VIR_DOMAIN_FS_MODEL_MTP:
> virBufferAddLit(&opt, "usb-mtp");
> virBufferAsprintf(&opt, ",root=%s,desc=%s", fs->src, fs->dst);
> - } else {
> + break;
> + case VIR_DOMAIN_FS_MODEL_DEFAULT:
> + case VIR_DOMAIN_FS_MODEL_9P:
> virBufferAddLit(&opt, "virtio-9p-pci");
> virBufferAsprintf(&opt, ",id=%s", fs->info.alias);
> virBufferAsprintf(&opt, ",fsdev=%s%s", QEMU_FSDEV_HOST_PREFIX,
> @@ -4038,6 +4041,11 @@ qemuBuildFSDevStr(virDomainDefPtr def,
> virBufferAsprintf(&opt, ",mount_tag=%s", fs->dst);
> if (qemuBuildDeviceAddressStr(&opt, def, &fs->info, qemuCaps) < 0)
> goto error;
> + break;
> +
> + case VIR_DOMAIN_FS_MODEL_LAST:
> + /* nada */
> + break;
> }
>
> if (virBufferCheckError(&opt) < 0)
>
>> + 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"));
>
> After this check, fs->type can only be TYPE_MOUNT
>
>> goto error;
>> - virCommandAddArg(cmd, optstr);
>> - VIR_FREE(optstr);
>> + }
>> +
>> + if (fs->type == VIR_DOMAIN_FS_TYPE_MOUNT &&
>
> So this part of the condition is always true.
>
>> + 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)))
>>
>
> Moreover, lets test this code. I'd feel more comfortable with a qemuxml2argv test case for this.
I have amended your changes and added a new test. Going to send a v3
soon.
Thanks,
Giuseppe
More information about the libvir-list
mailing list