[libvirt] [PATCH 5/6] qemu: Use virNetSocket for tunneled migration

Daniel Veillard veillard at redhat.com
Mon Aug 15 09:55:33 UTC 2011


On Mon, Aug 15, 2011 at 09:58:15AM +0200, Jiri Denemark wrote:
> ---
>  src/qemu/qemu_migration.c |   50 +++++++-------------------------------------
>  1 files changed, 8 insertions(+), 42 deletions(-)
> 
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index 1cabbe0..c29ea9e 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -42,6 +42,7 @@
>  #include "fdstream.h"
>  #include "uuid.h"
>  #include "locking/domain_lock.h"
> +#include "rpc/virnetsocket.h"
>  
>  
>  #define VIR_FROM_THIS VIR_FROM_QEMU
> @@ -1618,9 +1619,8 @@ static int doTunnelMigrate(struct qemud_driver *driver,
>                             unsigned long resource)
>  {
>      qemuDomainObjPrivatePtr priv = vm->privateData;
> -    int qemu_sock = -1;
> -    struct sockaddr_un sa_qemu;
>      char *unixfile = NULL;
> +    virNetSocketPtr sock = NULL;
>      int ret = -1;
>      qemuMigrationSpec spec;
>  
> @@ -1642,45 +1642,14 @@ static int doTunnelMigrate(struct qemud_driver *driver,
>          goto cleanup;
>      }
>  
> -    qemu_sock = socket(AF_UNIX, SOCK_STREAM, 0);
> -    if (qemu_sock < 0) {
> -        virReportSystemError(errno, "%s",
> -                             _("cannot open tunnelled migration socket"));
> -        goto cleanup;
> -    }
> -    memset(&sa_qemu, 0, sizeof(sa_qemu));
> -    sa_qemu.sun_family = AF_UNIX;
> -    if (virStrcpy(sa_qemu.sun_path, unixfile,
> -                  sizeof(sa_qemu.sun_path)) == NULL) {
> -        qemuReportError(VIR_ERR_INTERNAL_ERROR,
> -                        _("Unix socket '%s' too big for destination"),
> -                        unixfile);
> +    if (virNetSocketNewListenUNIX(unixfile, 0700,
> +                                  driver->user, driver->group, &sock) < 0 ||
> +        virNetSocketListen(sock, 1) < 0)

  If we are sure the errors will be properly reported back in called
  functions, okay

>          goto cleanup;
> -    }
> -    unlink(unixfile);
> -    if (bind(qemu_sock, (struct sockaddr *)&sa_qemu, sizeof(sa_qemu)) < 0) {
> -        virReportSystemError(errno,
> -                             _("Cannot bind to unix socket '%s' for tunnelled migration"),
> -                             unixfile);
> -        goto cleanup;
> -    }
> -    if (listen(qemu_sock, 1) < 0) {
> -        virReportSystemError(errno,
> -                             _("Cannot listen on unix socket '%s' for tunnelled migration"),
> -                             unixfile);
> -        goto cleanup;
> -    }
> -
> -    if (chown(unixfile, driver->user, driver->group) < 0) {
> -        virReportSystemError(errno,
> -                             _("Cannot change unix socket '%s' owner"),
> -                             unixfile);
> -        goto cleanup;
> -    }
>  
>      spec.destType = MIGRATION_DEST_UNIX;
>      spec.dest.unics.file = unixfile;
> -    spec.dest.unics.sock = qemu_sock;
> +    spec.dest.unics.sock = virNetSocketGetFD(sock);
>      spec.fwdType = MIGRATION_FWD_STREAM;
>      spec.fwd.stream = st;
>  
> @@ -1688,11 +1657,8 @@ static int doTunnelMigrate(struct qemud_driver *driver,
>                             cookieoutlen, flags, resource, &spec);
>  
>  cleanup:
> -    VIR_FORCE_CLOSE(qemu_sock);
> -    if (unixfile) {
> -        unlink(unixfile);
> -        VIR_FREE(unixfile);
> -    }
> +    virNetSocketFree(sock);
> +    VIR_FREE(unixfile);
>  
>      return ret;
>  }

  Looks lovely except that a code removing so many lines on migration
  code souds too good to be true <grin/>

   ACK,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list