[libvirt PATCH 15/16] qemu: implement virtiofs hotplug

Peter Krempa pkrempa at redhat.com
Wed Oct 6 08:57:25 UTC 2021


On Wed, Oct 06, 2021 at 09:15:21 +0200, Ján Tomko wrote:
> https://bugzilla.redhat.com/show_bug.cgi?id=1897708
> 
> Signed-off-by: Ján Tomko <jtomko at redhat.com>
> ---
>  src/qemu/qemu_driver.c  |  9 +++-
>  src/qemu/qemu_hotplug.c | 96 +++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 104 insertions(+), 1 deletion(-)
> 

[...]

> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 22239b2689..f5dad0b829 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c

[...]

> @@ -3396,6 +3397,101 @@ qemuDomainAttachVsockDevice(virQEMUDriver *driver,
>  }
>  
>  
> +int
> +qemuDomainAttachFSDevice(virQEMUDriver *driver,
> +                         virDomainObj *vm,
> +                         virDomainFSDef *fs)
> +{
> +    qemuDomainObjPrivate *priv = vm->privateData;
> +    virDomainDeviceDef dev = { VIR_DOMAIN_DEVICE_FS,
> +                               { .fs = fs } };
> +    g_autoptr(virDomainChrSourceDef) chardev = NULL;
> +    virErrorPtr origErr = NULL;
> +    bool releaseaddr = false;
> +    bool chardevAdded = false;
> +    bool started = false;
> +    g_autofree char *devstr = NULL;
> +    g_autofree char *charAlias = NULL;
> +    int ret = -1;
> +
> +    if (fs->fsdriver != VIR_DOMAIN_FS_DRIVER_TYPE_VIRTIOFS) {
> +        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
> +                       _("only virtiofs filesystems can be hotplugged"));
> +        return -1;
> +    }
> +
> +    if (qemuDomainEnsureVirtioAddress(&releaseaddr, vm, &dev) < 0)
> +        return -1;
> +
> +    if (qemuAssignDeviceFSAlias(vm->def, fs) < 0)
> +        goto cleanup;
> +
> +    chardev = qemuDomainGetVHostUserChrSourceDef(priv, fs);
> +    charAlias = qemuDomainGetVhostUserChrAlias(fs->info.alias);
> +
> +    if (!(devstr = qemuBuildVHostUserFsDevStr(fs, vm->def, charAlias, priv)))
> +        goto cleanup;
> +
> +    if (!fs->sock) {
> +        if (qemuVirtioFSPrepareDomain(driver, fs) < 0)
> +            goto cleanup;
> +
> +        if (qemuVirtioFSStart(qemuDomainLogContextGetManager(priv->logCtxt), driver, vm, fs) < 0)
> +            goto cleanup;
> +        started = true;

As noted, this won't work after restart of libvirtd.

> +
> +        if (qemuVirtioFSSetupCgroup(vm, fs, priv->cgroup) < 0)
> +            goto cleanup;
> +    }
> +
> +    qemuDomainObjEnterMonitor(driver, vm);
> +
> +    if (qemuMonitorAttachCharDev(priv->mon, charAlias, chardev) < 0)
> +        goto exit_monitor;
> +    chardevAdded = true;
> +
> +    if (qemuDomainAttachExtensionDevice(priv->mon, &fs->info) < 0)
> +        goto exit_monitor;
> +
> +    if (qemuMonitorAddDevice(priv->mon, devstr) < 0) {
> +        ignore_value(qemuDomainDetachExtensionDevice(priv->mon, &fs->info));
> +        goto exit_monitor;
> +    }
> +
> +    if (qemuDomainObjExitMonitor(driver, vm) < 0) {
> +        releaseaddr = false;
> +        goto cleanup;
> +    }
> +
> +    VIR_APPEND_ELEMENT(vm->def->fss, vm->def->nfss, fs);

This clears 'fs' ...

> +
> +    ret = 0;
> +
> + audit:
> +    virDomainAuditFS(vm, NULL, fs, "attach", ret == 0);

... but you reference it here.

> + cleanup:
> +    if (ret < 0) {
> +        virErrorPreserveLast(&origErr);
> +        if (releaseaddr)
> +            qemuDomainReleaseDeviceAddress(vm, &fs->info);
> +        if (started)
> +            qemuVirtioFSStop(driver, vm, fs);
> +        virErrorRestore(&origErr);
> +    }
> +
> +    return ret;
> +
> + exit_monitor:
> +    virErrorPreserveLast(&origErr);
> +    if (chardevAdded)
> +        ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias));
> +    if (qemuDomainObjExitMonitor(driver, vm) < 0)
> +        releaseaddr = false;
> +    virErrorRestore(&origErr);
> +    goto audit;
> +}




More information about the libvir-list mailing list