[libvirt] [PATCH 1/9] eliminate strerror qemu_driver.c: use virReportSystemError instead

Daniel P. Berrange berrange at redhat.com
Tue Feb 3 14:08:34 UTC 2009


On Mon, Feb 02, 2009 at 06:08:14PM +0100, Jim Meyering wrote:
> diff --git a/src/qemu_driver.c b/src/qemu_driver.c
> index 09f69bf..596d940 100644
> --- a/src/qemu_driver.c
> +++ b/src/qemu_driver.c
> @@ -93,31 +93,19 @@ static void qemuDriverUnlock(struct qemud_driver *driver)
> 
>  static int qemudSetCloseExec(int fd) {
>      int flags;
> -    if ((flags = fcntl(fd, F_GETFD)) < 0)
> -        goto error;
> -    flags |= FD_CLOEXEC;
> -    if ((fcntl(fd, F_SETFD, flags)) < 0)
> -        goto error;
> -    return 0;
> - error:
> -    qemudLog(QEMUD_ERR,
> -             "%s", _("Failed to set close-on-exec file descriptor flag\n"));
> -    return -1;
> +    return ((flags = fcntl(fd, F_GETFD)) < 0
> +             || fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0
> +            ? -1
> +            : 0);
>  }
> 
> 
>  static int qemudSetNonBlock(int fd) {
>      int flags;
> -    if ((flags = fcntl(fd, F_GETFL)) < 0)
> -        goto error;
> -    flags |= O_NONBLOCK;
> -    if ((fcntl(fd, F_SETFL, flags)) < 0)
> -        goto error;
> -    return 0;
> - error:
> -    qemudLog(QEMUD_ERR,
> -             "%s", _("Failed to set non-blocking file descriptor flag\n"));
> -    return -1;
> +    return ((flags = fcntl(fd, F_GETFL)) < 0
> +             || fcntl(fd, F_SETFL, flags | O_NONBLOCK) < 0
> +            ? -1
> +            : 0);
>  }

These two chunks can be left out, since those functions are completely
removed by the next patch.


> @@ -877,8 +865,7 @@ static int qemudWaitForMonitor(virConnectPtr conn,
>                                   qemudFindCharDevicePTYs,
>                                   "console", 3000);
>      if (close(logfd) < 0)
> -        qemudLog(QEMUD_WARN, _("Unable to close logfile: %s\n"),
> -                 strerror(errno));
> +        virReportSystemError(NULL, errno, "%s", _("Unable to close logfile"));

This is not fatal to starting the VM, so should raise an
error here. Could argue we shoud raise the log level to
QEMUD_ERROR though.

> @@ -1200,30 +1187,30 @@ static int qemudStartVMDaemon(virConnectPtr conn,
>      tmp = progenv;
>      while (*tmp) {
>          if (safewrite(vm->logfile, *tmp, strlen(*tmp)) < 0)
> -            qemudLog(QEMUD_WARN, _("Unable to write envv to logfile %d: %s\n"),
> -                     errno, strerror(errno));
> +            virReportSystemError(NULL, errno,
> +                                 "%s", _("Unable to write envv to logfile"));
>          if (safewrite(vm->logfile, " ", 1) < 0)
> -            qemudLog(QEMUD_WARN, _("Unable to write envv to logfile %d: %s\n"),
> -                     errno, strerror(errno));
> +            virReportSystemError(NULL, errno,
> +                                 "%s", _("Unable to write envv to logfile"));
>          tmp++;
>      }
>      tmp = argv;
>      while (*tmp) {
>          if (safewrite(vm->logfile, *tmp, strlen(*tmp)) < 0)
> -            qemudLog(QEMUD_WARN, _("Unable to write argv to logfile %d: %s\n"),
> -                     errno, strerror(errno));
> +            virReportSystemError(NULL, errno,
> +                                 "%s", _("Unable to write argv to logfile"));
>          if (safewrite(vm->logfile, " ", 1) < 0)
> -            qemudLog(QEMUD_WARN, _("Unable to write argv to logfile %d: %s\n"),
> -                     errno, strerror(errno));
> +            virReportSystemError(NULL, errno,
> +                                 "%s", _("Unable to write argv to logfile"));
>          tmp++;
>      }
>      if (safewrite(vm->logfile, "\n", 1) < 0)
> -        qemudLog(QEMUD_WARN, _("Unable to write argv to logfile %d: %s\n"),
> -                 errno, strerror(errno));
> +        virReportSystemError(NULL, errno,
> +                             "%s", _("Unable to write argv to logfile"));
> 
>      if ((pos = lseek(vm->logfile, 0, SEEK_END)) < 0)
> -        qemudLog(QEMUD_WARN, _("Unable to seek to end of logfile %d: %s\n"),
> -                 errno, strerror(errno));
> +        virReportSystemError(NULL, errno,
> +                             "%s", _("Unable to seek to end of logfile"));
> 
>      for (i = 0 ; i < ntapfds ; i++)
>          FD_SET(tapfds[i], &keepfd);


Likewise all of those are non-fatal, so shouldn't be raising an
error back to the caller, since the overall operation is still
reporting success code.

> @@ -1300,8 +1288,9 @@ static void qemudShutdownVMDaemon(virConnectPtr conn ATTRIBUTE_UNUSED,
> 
>      if (virKillProcess(vm->pid, 0) == 0 &&
>          virKillProcess(vm->pid, SIGTERM) < 0)
> -        qemudLog(QEMUD_ERROR, _("Failed to send SIGTERM to %s (%d): %s\n"),
> -                 vm->def->name, vm->pid, strerror(errno));
> +        virReportSystemError(conn, errno,
> +                             _("Failed to send SIGTERM to %s (%d)"),
> +                             vm->def->name, vm->pid);
> 
>      if (vm->monitor_watch != -1) {
>          virEventRemoveHandle(vm->monitor_watch);
> @@ -1309,8 +1298,7 @@ static void qemudShutdownVMDaemon(virConnectPtr conn ATTRIBUTE_UNUSED,
>      }
> 
>      if (close(vm->logfile) < 0)
> -        qemudLog(QEMUD_WARN, _("Unable to close logfile %d: %s\n"),
> -                 errno, strerror(errno));
> +        virReportSystemError(conn, errno, "%s", _("Unable to close logfile"));
>      if (vm->monitor != -1)
>          close(vm->monitor);
>      vm->logfile = -1;

These two are both non-fatal to the proces of shutting down
the VM daemon. In facton the 2nd case, I'm wondering why we 
still have the vm->logfile handle open at all. We are no longer
responsible for logging stdout/err from the QEMU proess into
the logfile, since we dup'd its stdout/err directly onto the
logfile FD. So we shouldnt' have any reason to keep this open.


> @@ -1477,8 +1465,8 @@ qemudMonitorCommandExtra(const virDomainObjPtr vm,
> 
>      /* Log, but ignore failures to write logfile for VM */
>      if (safewrite(vm->logfile, buf, strlen(buf)) < 0)
> -        qemudLog(QEMUD_WARN, _("Unable to log VM console data: %s\n"),
> -                 strerror(errno));
> +        virReportSystemError(NULL, errno,
> +                             "%s", _("Unable to log VM console data"));
> 
>      *reply = buf;
>      return 0;
> @@ -1487,8 +1475,8 @@ qemudMonitorCommandExtra(const virDomainObjPtr vm,
>      if (buf) {
>          /* Log, but ignore failures to write logfile for VM */
>          if (safewrite(vm->logfile, buf, strlen(buf)) < 0)
> -            qemudLog(QEMUD_WARN, _("Unable to log VM console data: %s\n"),
> -                     strerror(errno));
> +            virReportSystemError(NULL, errno,
> +                                 "%s", _("Unable to log VM console data"));
>          VIR_FREE(buf);
>      }
>      return -1;

These two should stay as logging calls too, since they're not
fatal.

> @@ -1593,7 +1581,7 @@ static int kvmGetMaxVCPUs(void) {
> 
>      fd = open(KVM_DEVICE, O_RDONLY);
>      if (fd < 0) {
> -        qemudLog(QEMUD_WARN, _("Unable to open %s: %s\n"), KVM_DEVICE, strerror(errno));
> +        virReportSystemError(NULL, errno, _("Unable to open %s"), KVM_DEVICE);
>          return maxvcpus;
>      }
> 

This needs to report a real error code back to the user, since if
we are using KVM vms, then /dev/kvm should  always exist.


Regards,
Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list