[libvirt] [PATCH 4/5] qemu: use virtlogd for character device log files

John Ferlan jferlan at redhat.com
Fri Feb 26 15:33:30 UTC 2016



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(&parallel->source,
> +                if (!(devstr = qemuBuildChrChardevStr(logManager, cmd, def,
> +                                                      &parallel->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,
> 




More information about the libvir-list mailing list