On Wed, Oct 06, 2021 at 09:15:22 +0200, Ján Tomko wrote: > Signed-off-by: Ján Tomko <jtomko@xxxxxxxxxx> > --- > src/conf/domain_conf.c | 24 ++++++++++++ > src/conf/domain_conf.h | 2 + > src/libvirt_private.syms | 1 + > src/qemu/qemu_hotplug.c | 81 +++++++++++++++++++++++++++++++++++++++- > 4 files changed, 106 insertions(+), 2 deletions(-) [...] > diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c > index f5dad0b829..713da5ebfc 100644 > --- a/src/qemu/qemu_hotplug.c > +++ b/src/qemu/qemu_hotplug.c > @@ -5180,6 +5180,45 @@ qemuDomainRemoveRedirdevDevice(virQEMUDriver *driver, > } > > > +static int > +qemuDomainRemoveFSDevice(virQEMUDriver *driver, > + virDomainObj *vm, > + virDomainFSDef *fs) > +{ > + g_autofree char *charAlias = NULL; > + qemuDomainObjPrivate *priv = vm->privateData; > + ssize_t idx; > + int rc = 0; > + > + VIR_DEBUG("Removing FS device %s from domain %p %s", > + fs->info.alias, vm, vm->def->name); > + > + charAlias = qemuDomainGetVhostUserChrAlias(fs->info.alias); > + > + qemuDomainObjEnterMonitor(driver, vm); > + > + if (qemuMonitorDetachCharDev(priv->mon, charAlias) < 0) > + rc = -1; Note that you must not assume here that the check below [1] that allows only virtio-fs device unplug guards this code too. The *Remove* code is executed always when we get a 'DEVICE_DELETED' event from qemu thus also for guest-initiated unplug, which theoretically can happen also for p9fs device. > + > + if (qemuDomainObjExitMonitor(driver, vm) < 0) > + return -1; > + > + virDomainAuditFS(vm, fs, NULL, "detach", rc == 0); > + > + if (rc < 0) > + return -1; > + > + if (!fs->sock) > + qemuVirtioFSStop(driver, vm, fs); > + > + if ((idx = virDomainFSDefFind(vm->def, fs)) >= 0) > + virDomainFSRemove(vm->def, idx); > + qemuDomainReleaseDeviceAddress(vm, &fs->info); > + virDomainFSDefFree(fs); > + return 0; > +} > + > + > static void > qemuDomainRemoveAuditDevice(virDomainObj *vm, > virDomainDeviceDef *detach, [...] > @@ -6020,6 +6066,31 @@ qemuDomainDetachPrepVsock(virDomainObj *vm, > } > > > +static int > +qemuDomainDetachPrepFS(virDomainObj *vm, > + virDomainFSDef *match, > + virDomainFSDef **detach) > +{ > + ssize_t idx; > + > + if ((idx = virDomainFSDefFind(vm->def, match)) < 0) { > + virReportError(VIR_ERR_DEVICE_MISSING, "%s", > + _("matching filesystem not found")); > + return -1; > + } > + > + if (vm->def->fss[idx]->fsdriver != VIR_DOMAIN_FS_DRIVER_TYPE_VIRTIOFS) { > + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", > + _("only virtiofs filesystems can be hotplugged")); > + return -1; > + } [1]. This check only guards host-initiated delete. > + > + *detach = vm->def->fss[idx]; > + > + return 0; > +} > + > + > static int > qemuDomainDetachDeviceLease(virQEMUDriver *driver, > virDomainObj *vm,