On 02/23/2016 11:41 AM, Daniel P. Berrange wrote: > If use of virtlogd is enabled, then use it for backing the > character device log files too. > --- > src/logging/log_daemon_dispatch.c | 3 +- > src/logging/log_handler.c | 6 +- > src/logging/log_handler.h | 2 +- > src/logging/log_manager.h | 2 + > src/logging/log_protocol.x | 4 + > src/qemu/qemu_command.c | 234 ++++++++++++++++++++++++-------------- <sigh> One of us will have conflicts depending upon whether my final pile of qemu_command.c cleanup changes gets reviewed... > src/qemu/qemu_command.h | 7 +- > src/qemu/qemu_domain.c | 6 + > src/qemu/qemu_domain.h | 3 + > src/qemu/qemu_driver.c | 2 +- > src/qemu/qemu_process.c | 4 +- > tests/qemuxml2argvtest.c | 2 +- > 12 files changed, 179 insertions(+), 96 deletions(-) > > diff --git a/src/logging/log_daemon_dispatch.c b/src/logging/log_daemon_dispatch.c > index a5fa7f0..b00cee2 100644 > --- a/src/logging/log_daemon_dispatch.c > +++ b/src/logging/log_daemon_dispatch.c > @@ -50,13 +50,14 @@ virLogManagerProtocolDispatchDomainOpenLogFile(virNetServerPtr server ATTRIBUTE_ > int rv = -1; > off_t offset; > ino_t inode; > + bool trunc = args->flags & VIR_LOG_MANAGER_PROTOCOL_DOMAIN_OPEN_LOG_FILE_TRUNCATE; > So by changing this means you don't envision other flags in the future for virLogHandlerDomainOpenLogFile? IOW: Why isn't this done in the next layer down? Seems we'd be changing what we're doing (not that anything else is using this yet). Should perhaps this part be a separate patch? > if ((fd = virLogHandlerDomainOpenLogFile(virLogDaemonGetHandler(logDaemon), > args->driver, > (unsigned char *)args->dom.uuid, > args->dom.name, > args->path, > - args->flags, > + trunc, > &inode, &offset)) < 0) > goto cleanup; > > diff --git a/src/logging/log_handler.c b/src/logging/log_handler.c > index 92cff50..4c08223 100644 > --- a/src/logging/log_handler.c > +++ b/src/logging/log_handler.c > @@ -357,7 +357,7 @@ virLogHandlerDomainOpenLogFile(virLogHandlerPtr handler, > const unsigned char *domuuid, > const char *domname, > const char *path, > - unsigned int flags, > + bool trunc, > ino_t *inode, > off_t *offset) > { > @@ -365,8 +365,6 @@ virLogHandlerDomainOpenLogFile(virLogHandlerPtr handler, > virLogHandlerLogFilePtr file = NULL; > int pipefd[2] = { -1, -1 }; > > - virCheckFlags(0, -1); > - > virObjectLock(handler); > > handler->inhibitor(true, handler->opaque); > @@ -400,7 +398,7 @@ virLogHandlerDomainOpenLogFile(virLogHandlerPtr handler, > if ((file->file = virRotatingFileWriterNew(path, > DEFAULT_FILE_SIZE, > DEFAULT_MAX_BACKUP, > - false, > + trunc, > DEFAULT_MODE)) == NULL) > goto error; > > diff --git a/src/logging/log_handler.h b/src/logging/log_handler.h > index e61f32d..54a9cd9 100644 > --- a/src/logging/log_handler.h > +++ b/src/logging/log_handler.h > @@ -48,7 +48,7 @@ int virLogHandlerDomainOpenLogFile(virLogHandlerPtr handler, > const unsigned char *domuuid, > const char *domname, > const char *path, > - unsigned int flags, > + bool trunc, > ino_t *inode, > off_t *offset); > > diff --git a/src/logging/log_manager.h b/src/logging/log_manager.h > index d3b9d29..7deaba7 100644 > --- a/src/logging/log_manager.h > +++ b/src/logging/log_manager.h > @@ -26,6 +26,8 @@ > > # include "internal.h" > > +# include "logging/log_protocol.h" > + > typedef struct _virLogManager virLogManager; > typedef virLogManager *virLogManagerPtr; > > diff --git a/src/logging/log_protocol.x b/src/logging/log_protocol.x > index b0ac31b..0363c75 100644 > --- a/src/logging/log_protocol.x > +++ b/src/logging/log_protocol.x > @@ -30,6 +30,10 @@ struct virLogManagerProtocolLogFilePosition { > }; > typedef struct virLogManagerProtocolLogFilePosition virLogManagerProtocolLogFilePosition; > > +enum virLogManagerProtocolDomainOpenLogFileFlags { > + VIR_LOG_MANAGER_PROTOCOL_DOMAIN_OPEN_LOG_FILE_TRUNCATE = 1 > +}; > + DomainOpenLogFile doesn't have flags now - it just has trunc - so nothing could be added here (at least w/r/t how I understand it). > /* Obtain a file handle suitable for writing to a > * log file for a domain > */ > diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c > index dee7208..8378470 100644 > --- a/src/qemu/qemu_command.c > +++ b/src/qemu/qemu_command.c > @@ -60,6 +60,7 @@ > #if defined(__linux__) > # include <linux/capability.h> > #endif > +#include "logging/log_manager.h" > > #include <sys/stat.h> > #include <fcntl.h> > @@ -149,6 +150,59 @@ VIR_ENUM_IMPL(qemuNumaPolicy, VIR_DOMAIN_NUMATUNE_MEM_LAST, > "preferred", > "interleave"); > > +/** > + * qemuVirCommandGetFDSet: > + * @cmd: the command to modify > + * @fd: fd to reassign to the child > + * > + * Get the parameters for the QEMU -add-fd command line option > + * for the given file descriptor. The file descriptor must previously > + * have been 'transferred' in a virCommandPassFD() call. > + * This function for example returns "set=10,fd=20". > + */ > +static char * > +qemuVirCommandGetFDSet(virCommandPtr cmd, int fd) > +{ > + char *result = NULL; > + int idx = virCommandPassFDGetFDIndex(cmd, fd); > + > + if (idx >= 0) { > + ignore_value(virAsprintf(&result, "set=%d,fd=%d", idx, fd)); > + } else { > + virReportError(VIR_ERR_INTERNAL_ERROR, > + _("file descriptor %d has not been transferred"), fd); > + } > + > + return result; > +} > + > + > +/** > + * qemuVirCommandGetDevSet: > + * @cmd: the command to modify > + * @fd: fd to reassign to the child > + * > + * Get the parameters for the QEMU path= parameter where a file > + * descriptor is accessed via a file descriptor set, for example > + * /dev/fdset/10. The file descriptor must previously have been > + * 'transferred' in a virCommandPassFD() call. > + */ > +static char * > +qemuVirCommandGetDevSet(virCommandPtr cmd, int fd) > +{ > + char *result = NULL; > + int idx = virCommandPassFDGetFDIndex(cmd, fd); > + > + if (idx >= 0) { > + ignore_value(virAsprintf(&result, "/dev/fdset/%d", idx)); > + } else { > + virReportError(VIR_ERR_INTERNAL_ERROR, > + _("file descriptor %d has not been transferred"), fd); > + } > + return result; > +} > + > + [1] Code motion... Should it be separate? > static int > qemuBuildObjectCommandLinePropsInternal(const char *key, > const virJSONValue *value, > @@ -3850,7 +3904,10 @@ qemuBuildSCSIHostdevDevStr(virDomainDefPtr def, > /* This function outputs a -chardev command line option which describes only the > * host side of the character device */ > static char * > -qemuBuildChrChardevStr(const virDomainChrSourceDef *dev, > +qemuBuildChrChardevStr(virLogManagerPtr logManager, > + virCommandPtr cmd, > + virDomainDefPtr def, > + const virDomainChrSourceDef *dev, > const char *alias, > virQEMUCapsPtr qemuCaps) > { > @@ -3973,10 +4030,42 @@ qemuBuildChrChardevStr(const virDomainChrSourceDef *dev, > _("logfile not supported in this QEMU binary")); > goto error; > } > - virBufferAsprintf(&buf, ",logfile=%s", dev->logfile); > - if (dev->logappend != VIR_TRISTATE_SWITCH_ABSENT) { > - virBufferAsprintf(&buf, ",logappend=%s", > - virTristateSwitchTypeToString(dev->logappend)); > + if (logManager) { > + char *fdset, *fdpath; > + int flags = 0; > + int logfd; > + > + if (dev->logappend == VIR_TRISTATE_SWITCH_OFF) > + flags |= VIR_LOG_MANAGER_PROTOCOL_DOMAIN_OPEN_LOG_FILE_TRUNCATE; > + > + if ((logfd = virLogManagerDomainOpenLogFile(logManager, > + "qemu", > + def->uuid, > + def->name, > + dev->logfile, > + flags, > + NULL, NULL)) < 0) > + goto error; > + > + virCommandPassFD(cmd, logfd, VIR_COMMAND_PASS_FD_CLOSE_PARENT); > + if (!(fdset = qemuVirCommandGetFDSet(cmd, logfd))) Would this error path need to close logfd or is that done because of the above PassFD path? > + goto error; > + > + virCommandAddArg(cmd, "-add-fd"); > + virCommandAddArg(cmd, fdset); > + VIR_FREE(fdset); > + > + if (!(fdpath = qemuVirCommandGetDevSet(cmd, logfd))) Similar question about logfd... > + goto error; > + > + virBufferAsprintf(&buf, ",logfile=%s,logappend=on", fdpath); Always on? Doesn't matter what's been provided in logappend in the XML? > + VIR_FREE(fdpath); > + } else { > + virBufferAsprintf(&buf, ",logfile=%s", dev->logfile); > + if (dev->logappend != VIR_TRISTATE_SWITCH_ABSENT) { > + virBufferAsprintf(&buf, ",logappend=%s", > + virTristateSwitchTypeToString(dev->logappend)); > + } Could be a separate call rather than inlining... > } > } > > @@ -4093,7 +4182,9 @@ qemuBuildChrArgStr(const virDomainChrSourceDef *dev, > > > static int > -qemuBuildMonitorCommandLine(virCommandPtr cmd, > +qemuBuildMonitorCommandLine(virLogManagerPtr logManager, > + virCommandPtr cmd, > + virDomainDefPtr def, > virQEMUCapsPtr qemuCaps, > const virDomainChrSourceDef *monitor_chr, > bool monitor_json) > @@ -4106,10 +4197,11 @@ qemuBuildMonitorCommandLine(virCommandPtr cmd, > /* Use -chardev if it's available */ > if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV)) { > > - virCommandAddArg(cmd, "-chardev"); > - if (!(chrdev = qemuBuildChrChardevStr(monitor_chr, "monitor", > + if (!(chrdev = qemuBuildChrChardevStr(logManager, cmd, def, > + monitor_chr, "monitor", > qemuCaps))) > return -1; > + virCommandAddArg(cmd, "-chardev"); doh! Although I suppose one could make the argument that all the additions of "-chardev" could be their own patch... > virCommandAddArg(cmd, chrdev); > VIR_FREE(chrdev); > > @@ -4248,7 +4340,10 @@ qemuBuildSclpDevStr(virDomainChrDefPtr dev) > > > static int > -qemuBuildRNGBackendChrdevStr(virDomainRNGDefPtr rng, > +qemuBuildRNGBackendChrdevStr(virLogManagerPtr logManager, > + virCommandPtr cmd, > + virDomainDefPtr def, > + virDomainRNGDefPtr rng, > virQEMUCapsPtr qemuCaps, > char **chr) > { > @@ -4261,7 +4356,8 @@ qemuBuildRNGBackendChrdevStr(virDomainRNGDefPtr rng, > return 0; > > case VIR_DOMAIN_RNG_BACKEND_EGD: > - if (!(*chr = qemuBuildChrChardevStr(rng->source.chardev, > + if (!(*chr = qemuBuildChrChardevStr(logManager, cmd, def, > + rng->source.chardev, > rng->info.alias, qemuCaps))) > return -1; > } > @@ -6567,7 +6663,10 @@ qemuBuildShmemDevStr(virDomainDefPtr def, > } > > char * > -qemuBuildShmemBackendStr(virDomainShmemDefPtr shmem, > +qemuBuildShmemBackendStr(virLogManagerPtr logManager, > + virCommandPtr cmd, > + virDomainDefPtr def, > + virDomainShmemDefPtr shmem, > virQEMUCapsPtr qemuCaps) > { > char *devstr = NULL; > @@ -6578,13 +6677,16 @@ qemuBuildShmemBackendStr(virDomainShmemDefPtr shmem, > shmem->name) < 0) > return NULL; > > - devstr = qemuBuildChrChardevStr(&shmem->server.chr, shmem->info.alias, qemuCaps); > + devstr = qemuBuildChrChardevStr(logManager, cmd, def, > + &shmem->server.chr, > + shmem->info.alias, qemuCaps); > > return devstr; > } > > static int > -qemuBuildShmemCommandLine(virCommandPtr cmd, > +qemuBuildShmemCommandLine(virLogManagerPtr logManager, > + virCommandPtr cmd, > virDomainDefPtr def, > virDomainShmemDefPtr shmem, > virQEMUCapsPtr qemuCaps) > @@ -6597,7 +6699,8 @@ qemuBuildShmemCommandLine(virCommandPtr cmd, > VIR_FREE(devstr); > > if (shmem->server.enabled) { > - if (!(devstr = qemuBuildShmemBackendStr(shmem, qemuCaps))) > + if (!(devstr = qemuBuildShmemBackendStr(logManager, cmd, def, > + shmem, qemuCaps))) > return -1; > > virCommandAddArgList(cmd, "-chardev", devstr, NULL); > @@ -6724,59 +6827,6 @@ qemuBuildTPMDevStr(const virDomainDef *def, > } > > > -/** > - * qemuVirCommandGetFDSet: > - * @cmd: the command to modify > - * @fd: fd to reassign to the child > - * > - * Get the parameters for the QEMU -add-fd command line option > - * for the given file descriptor. The file descriptor must previously > - * have been 'transferred' in a virCommandPassFD() call. > - * This function for example returns "set=10,fd=20". > - */ > -static char * > -qemuVirCommandGetFDSet(virCommandPtr cmd, int fd) > -{ > - char *result = NULL; > - int idx = virCommandPassFDGetFDIndex(cmd, fd); > - > - if (idx >= 0) { > - ignore_value(virAsprintf(&result, "set=%d,fd=%d", idx, fd)); > - } else { > - virReportError(VIR_ERR_INTERNAL_ERROR, > - _("file descriptor %d has not been transferred"), fd); > - } > - > - return result; > -} > - > - > -/** > - * qemuVirCommandGetDevSet: > - * @cmd: the command to modify > - * @fd: fd to reassign to the child > - * > - * Get the parameters for the QEMU path= parameter where a file > - * descriptor is accessed via a file descriptor set, for example > - * /dev/fdset/10. The file descriptor must previously have been > - * 'transferred' in a virCommandPassFD() call. > - */ > -static char * > -qemuVirCommandGetDevSet(virCommandPtr cmd, int fd) > -{ > - char *result = NULL; > - int idx = virCommandPassFDGetFDIndex(cmd, fd); > - > - if (idx >= 0) { > - ignore_value(virAsprintf(&result, "/dev/fdset/%d", idx)); > - } else { > - virReportError(VIR_ERR_INTERNAL_ERROR, > - _("file descriptor %d has not been transferred"), fd); > - } > - return result; > -} > - > - [1] Code motion... > static char * > qemuBuildTPMBackendStr(const virDomainDef *def, > virCommandPtr cmd, > @@ -7020,6 +7070,7 @@ qemuBuildCommandLineCallbacks buildCommandLineCallbacks = { > virCommandPtr > qemuBuildCommandLine(virConnectPtr conn, > virQEMUDriverPtr driver, > + virLogManagerPtr logManager, > virDomainDefPtr def, > virDomainChrSourceDefPtr monitor_chr, > bool monitor_json, > @@ -7170,7 +7221,8 @@ qemuBuildCommandLine(virConnectPtr conn, > if (qemuBuildSgaCommandLine(cmd, def, qemuCaps) < 0) > goto error; > > - if (qemuBuildMonitorCommandLine(cmd, qemuCaps, monitor_chr, > + if (qemuBuildMonitorCommandLine(logManager, cmd, def, > + qemuCaps, monitor_chr, > monitor_json) < 0) > goto error; > > @@ -7932,13 +7984,14 @@ qemuBuildCommandLine(virConnectPtr conn, > goto error; > } > > - virCommandAddArg(cmd, "-chardev"); > - if (!(devstr = qemuBuildChrChardevStr(&smartcard->data.passthru, > + if (!(devstr = qemuBuildChrChardevStr(logManager, cmd, def, > + &smartcard->data.passthru, > smartcard->info.alias, > qemuCaps))) { > virBufferFreeAndReset(&opt); > goto error; > } > + virCommandAddArg(cmd, "-chardev"); > virCommandAddArg(cmd, devstr); > VIR_FREE(devstr); > > @@ -7976,11 +8029,12 @@ qemuBuildCommandLine(virConnectPtr conn, > > /* Use -chardev with -device if they are available */ > if (virQEMUCapsSupportsChardev(def, qemuCaps, serial)) { > - virCommandAddArg(cmd, "-chardev"); > - if (!(devstr = qemuBuildChrChardevStr(&serial->source, > + if (!(devstr = qemuBuildChrChardevStr(logManager, cmd, def, > + &serial->source, > serial->info.alias, > qemuCaps))) > goto error; > + virCommandAddArg(cmd, "-chardev"); > virCommandAddArg(cmd, devstr); > VIR_FREE(devstr); > > @@ -8012,11 +8066,12 @@ qemuBuildCommandLine(virConnectPtr conn, > /* Use -chardev with -device if they are available */ > if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_CHARDEV) && > virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE)) { > - virCommandAddArg(cmd, "-chardev"); > - if (!(devstr = qemuBuildChrChardevStr(¶llel->source, > + if (!(devstr = qemuBuildChrChardevStr(logManager, cmd, def, > + ¶llel->source, > parallel->info.alias, > qemuCaps))) > goto error; > + virCommandAddArg(cmd, "-chardev"); > virCommandAddArg(cmd, devstr); > VIR_FREE(devstr); > > @@ -8045,11 +8100,12 @@ qemuBuildCommandLine(virConnectPtr conn, > goto error; > } > > - virCommandAddArg(cmd, "-chardev"); > - if (!(devstr = qemuBuildChrChardevStr(&channel->source, > + if (!(devstr = qemuBuildChrChardevStr(logManager, cmd, def, > + &channel->source, > channel->info.alias, > qemuCaps))) > goto error; > + virCommandAddArg(cmd, "-chardev"); > virCommandAddArg(cmd, devstr); > VIR_FREE(devstr); > > @@ -8090,11 +8146,12 @@ qemuBuildCommandLine(virConnectPtr conn, > * the newer -chardev interface. */ > ; > } else { > - virCommandAddArg(cmd, "-chardev"); > - if (!(devstr = qemuBuildChrChardevStr(&channel->source, > + if (!(devstr = qemuBuildChrChardevStr(logManager, cmd, def, > + &channel->source, > channel->info.alias, > qemuCaps))) > goto error; > + virCommandAddArg(cmd, "-chardev"); > virCommandAddArg(cmd, devstr); > VIR_FREE(devstr); > } > @@ -8124,11 +8181,12 @@ qemuBuildCommandLine(virConnectPtr conn, > goto error; > } > > - virCommandAddArg(cmd, "-chardev"); > - if (!(devstr = qemuBuildChrChardevStr(&console->source, > + if (!(devstr = qemuBuildChrChardevStr(logManager, cmd, def, > + &console->source, > console->info.alias, > qemuCaps))) > goto error; > + virCommandAddArg(cmd, "-chardev"); > virCommandAddArg(cmd, devstr); > VIR_FREE(devstr); > > @@ -8143,11 +8201,12 @@ qemuBuildCommandLine(virConnectPtr conn, > goto error; > } > > - virCommandAddArg(cmd, "-chardev"); > - if (!(devstr = qemuBuildChrChardevStr(&console->source, > + if (!(devstr = qemuBuildChrChardevStr(logManager, cmd, def, > + &console->source, > console->info.alias, > qemuCaps))) > goto error; > + virCommandAddArg(cmd, "-chardev"); > virCommandAddArg(cmd, devstr); > VIR_FREE(devstr); > > @@ -8487,13 +8546,14 @@ qemuBuildCommandLine(virConnectPtr conn, > virDomainRedirdevDefPtr redirdev = def->redirdevs[i]; > char *devstr; > > - virCommandAddArg(cmd, "-chardev"); > - if (!(devstr = qemuBuildChrChardevStr(&redirdev->source.chr, > + if (!(devstr = qemuBuildChrChardevStr(logManager, cmd, def, > + &redirdev->source.chr, > redirdev->info.alias, > qemuCaps))) { > goto error; > } > > + virCommandAddArg(cmd, "-chardev"); > virCommandAddArg(cmd, devstr); > VIR_FREE(devstr); > > @@ -8713,7 +8773,8 @@ qemuBuildCommandLine(virConnectPtr conn, > } > > /* possibly add character device for backend */ > - if (qemuBuildRNGBackendChrdevStr(rng, qemuCaps, &tmp) < 0) > + if (qemuBuildRNGBackendChrdevStr(logManager, cmd, def, > + rng, qemuCaps, &tmp) < 0) > goto error; > > if (tmp) { > @@ -8858,7 +8919,8 @@ qemuBuildCommandLine(virConnectPtr conn, > } > > for (i = 0; i < def->nshmems; i++) { > - if (qemuBuildShmemCommandLine(cmd, def, def->shmems[i], qemuCaps)) > + if (qemuBuildShmemCommandLine(logManager, cmd, > + def, def->shmems[i], qemuCaps)) > goto error; > } > > diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h > index fb684d0..decf463 100644 > --- a/src/qemu/qemu_command.h > +++ b/src/qemu/qemu_command.h > @@ -32,6 +32,7 @@ > # include "qemu_domain.h" > # include "qemu_domain_address.h" > # include "qemu_capabilities.h" > +# include "logging/log_manager.h" > > /* Config type for XML import/export conversions */ > # define QEMU_CONFIG_FORMAT_ARGV "qemu-argv" > @@ -59,6 +60,7 @@ char *qemuBuildObjectCommandlineFromJSON(const char *type, > > virCommandPtr qemuBuildCommandLine(virConnectPtr conn, > virQEMUDriverPtr driver, > + virLogManagerPtr logManager, > virDomainDefPtr def, > virDomainChrSourceDefPtr monitor_chr, > bool monitor_json, There's a "ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(10);" on this API, that 10 needs to change to 11. Also with Martin's "qemu: Shorten per-domain directory names" you could have to modify 16 & 17 too John > @@ -180,7 +182,10 @@ int qemuBuildRNGBackendProps(virDomainRNGDefPtr rng, > char *qemuBuildShmemDevStr(virDomainDefPtr def, > virDomainShmemDefPtr shmem, > virQEMUCapsPtr qemuCaps); > -char *qemuBuildShmemBackendStr(virDomainShmemDefPtr shmem, > +char *qemuBuildShmemBackendStr(virLogManagerPtr logManager, > + virCommandPtr cmd, > + virDomainDefPtr def, > + virDomainShmemDefPtr shmem, > virQEMUCapsPtr qemuCaps); > > > diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c > index c56f9f1..df422e2 100644 > --- a/src/qemu/qemu_domain.c > +++ b/src/qemu/qemu_domain.c > @@ -2603,6 +2603,12 @@ void qemuDomainLogContextRef(qemuDomainLogContextPtr ctxt) > } > > > +virLogManagerPtr qemuDomainLogContextGetManager(qemuDomainLogContextPtr ctxt) > +{ > + return ctxt->manager; > +} > + > + > void qemuDomainLogContextFree(qemuDomainLogContextPtr ctxt) > { > bool lastRef; > diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h > index 8359b1a..f6ce19c 100644 > --- a/src/qemu/qemu_domain.h > +++ b/src/qemu/qemu_domain.h > @@ -35,6 +35,7 @@ > # include "qemu_capabilities.h" > # include "virchrdev.h" > # include "virobject.h" > +# include "logging/log_manager.h" > > # define QEMU_DOMAIN_FORMAT_LIVE_FLAGS \ > (VIR_DOMAIN_XML_SECURE | \ > @@ -377,6 +378,8 @@ void qemuDomainLogContextMarkPosition(qemuDomainLogContextPtr ctxt); > void qemuDomainLogContextRef(qemuDomainLogContextPtr ctxt); > void qemuDomainLogContextFree(qemuDomainLogContextPtr ctxt); > > +virLogManagerPtr qemuDomainLogContextGetManager(qemuDomainLogContextPtr ctxt); > + > const char *qemuFindQemuImgBinary(virQEMUDriverPtr driver); > > int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm, > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c > index 45ff3c0..1afafd6 100644 > --- a/src/qemu/qemu_driver.c > +++ b/src/qemu/qemu_driver.c > @@ -7159,7 +7159,7 @@ static char *qemuConnectDomainXMLToNative(virConnectPtr conn, > } > } > > - if (!(cmd = qemuBuildCommandLine(conn, driver, def, > + if (!(cmd = qemuBuildCommandLine(conn, driver, NULL, def, > &monConfig, monitor_json, qemuCaps, > NULL, NULL, > VIR_NETDEV_VPORT_PROFILE_OP_NO_OP, > diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c > index c5b9f4e..3780d0c 100644 > --- a/src/qemu/qemu_process.c > +++ b/src/qemu/qemu_process.c > @@ -4987,7 +4987,9 @@ qemuProcessLaunch(virConnectPtr conn, > } > > VIR_DEBUG("Building emulator command line"); > - if (!(cmd = qemuBuildCommandLine(conn, driver, vm->def, priv->monConfig, > + if (!(cmd = qemuBuildCommandLine(conn, driver, > + qemuDomainLogContextGetManager(logCtxt), > + vm->def, priv->monConfig, > priv->monJSON, priv->qemuCaps, > incoming ? incoming->launchURI : NULL, > snapshot, vmop, > diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c > index 624639e..b5323b4 100644 > --- a/tests/qemuxml2argvtest.c > +++ b/tests/qemuxml2argvtest.c > @@ -345,7 +345,7 @@ static int testCompareXMLToArgvFiles(const char *xml, > testFailed = true; > > if (!testFailed && > - !(cmd = qemuBuildCommandLine(conn, &driver, vmdef, &monitor_chr, > + !(cmd = qemuBuildCommandLine(conn, &driver, NULL, vmdef, &monitor_chr, > (flags & FLAG_JSON), extraFlags, > migrateURI, NULL, > VIR_NETDEV_VPORT_PROFILE_OP_NO_OP, > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list