break;
case VIR_DOMAIN_DEVICE_CHR:
- ret = qemuDomainAttachChrDevice(driver, vm,
- dev->data.chr);
+ ret = qemuDomainAttachChrDevice(driver, vm, dev);
if (!ret) {
alias = dev->data.chr->info.alias;
dev->data.chr = NULL;
return 0;
}
-int qemuDomainAttachChrDevice(virQEMUDriver *driver,
- virDomainObj *vm,
- virDomainChrDef *chr)
+
+int
+qemuDomainAttachChrDevice(virQEMUDriver *driver,
+ virDomainObj *vm,
+ virDomainDeviceDef *dev)
{
+ virDomainChrDef *chr = dev->data.chr;
+ qemuDomainChrSourcePrivate *charpriv = QEMU_DOMAIN_CHR_SOURCE_PRIVATE(chr->source);
int ret = -1;
qemuDomainObjPrivate *priv = vm->privateData;
virErrorPtr orig_err;
goto cleanup;
teardowncgroup = true;
+ if (qemuProcessPrepareHostBackendChardevHotplug(vm, dev) < 0)
+ goto cleanup;
+
+ if (charpriv->sourcefd || charpriv->logfd) {
+ qemuDomainObjEnterMonitor(driver, vm);
+
+ if (qemuFDPassTransferMonitor(charpriv->sourcefd, priv->mon) < 0 ||
+ qemuFDPassTransferMonitor(charpriv->logfd, priv->mon) < 0)
+ goto exit_monitor;
+
+ qemuDomainObjExitMonitor(driver, vm);
+ }
+
if (guestfwd) {
if (!(netdevprops = qemuBuildChannelGuestfwdNetdevProps(chr)))
goto cleanup;
/* detach associated chardev on error */
if (chardevAttached)
qemuMonitorDetachCharDev(priv->mon, charAlias);
+ qemuFDPassTransferMonitorRollback(charpriv->sourcefd, priv->mon);
+ qemuFDPassTransferMonitorRollback(charpriv->logfd, priv->mon);
qemuDomainObjExitMonitor(driver, vm);
virErrorRestore(&orig_err);
virDomainLeaseDef *lease);
int qemuDomainAttachChrDevice(virQEMUDriver *driver,
virDomainObj *vm,
- virDomainChrDef *chr);
+ virDomainDeviceDef *dev);
int qemuDomainAttachRNGDevice(virQEMUDriver *driver,
virDomainObj *vm,
virDomainRNGDef *rng);
#include "qemu/qemu_hotplug.h"
#include "qemu/qemu_interface.h"
#include "qemu/qemu_process.h"
+#include "testutilsqemu.h"
#include "conf/domain_conf.h"
#include "virdevmapper.h"
#include "virutil.h"
/* need a valid fd or sendmsg won't work. Just open /dev/null */
return open("/dev/null", O_RDONLY);
}
+
+
+int
+qemuProcessPrepareHostBackendChardevHotplug(virDomainObj *vm,
+ virDomainDeviceDef *dev)
+{
+ return qemuDomainDeviceBackendChardevForeachOne(dev,
+ testQemuPrepareHostBackendChardevOne,
+ vm);
+}
ret = qemuDomainAttachDeviceDiskLive(&driver, vm, dev);
break;
case VIR_DOMAIN_DEVICE_CHR:
- ret = qemuDomainAttachChrDevice(&driver, vm, dev->data.chr);
+ ret = qemuDomainAttachChrDevice(&driver, vm, dev);
break;
case VIR_DOMAIN_DEVICE_SHMEM:
ret = qemuDomainAttachShmemDevice(&driver, vm, dev->data.shmem);