File:  [Qemu by Fabrice Bellard] / qemu / migration-fd.c
Revision 1.1.1.5 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 19:33:35 2018 UTC (3 years, 5 months ago) by root
Branches: qemu, MAIN
CVS tags: qemu1101, HEAD
qemu 1.1.1

    1: /*
    2:  * QEMU live migration via generic fd
    3:  *
    4:  * Copyright Red Hat, Inc. 2009
    5:  *
    6:  * Authors:
    7:  *  Chris Lalancette <clalance@redhat.com>
    8:  *
    9:  * This work is licensed under the terms of the GNU GPL, version 2.  See
   10:  * the COPYING file in the top-level directory.
   11:  *
   12:  * Contributions after 2012-01-13 are licensed under the terms of the
   13:  * GNU GPL, version 2 or (at your option) any later version.
   14:  */
   15: 
   16: #include "qemu-common.h"
   17: #include "qemu_socket.h"
   18: #include "migration.h"
   19: #include "monitor.h"
   20: #include "qemu-char.h"
   21: #include "buffered_file.h"
   22: #include "block.h"
   23: #include "qemu_socket.h"
   24: 
   25: //#define DEBUG_MIGRATION_FD
   26: 
   27: #ifdef DEBUG_MIGRATION_FD
   28: #define DPRINTF(fmt, ...) \
   29:     do { printf("migration-fd: " fmt, ## __VA_ARGS__); } while (0)
   30: #else
   31: #define DPRINTF(fmt, ...) \
   32:     do { } while (0)
   33: #endif
   34: 
   35: static int fd_errno(MigrationState *s)
   36: {
   37:     return errno;
   38: }
   39: 
   40: static int fd_write(MigrationState *s, const void * buf, size_t size)
   41: {
   42:     return write(s->fd, buf, size);
   43: }
   44: 
   45: static int fd_close(MigrationState *s)
   46: {
   47:     struct stat st;
   48:     int ret;
   49: 
   50:     DPRINTF("fd_close\n");
   51:     if (s->fd != -1) {
   52:         ret = fstat(s->fd, &st);
   53:         if (ret == 0 && S_ISREG(st.st_mode)) {
   54:             /*
   55:              * If the file handle is a regular file make sure the
   56:              * data is flushed to disk before signaling success.
   57:              */
   58:             ret = fsync(s->fd);
   59:             if (ret != 0) {
   60:                 ret = -errno;
   61:                 perror("migration-fd: fsync");
   62:                 return ret;
   63:             }
   64:         }
   65:         ret = close(s->fd);
   66:         s->fd = -1;
   67:         if (ret != 0) {
   68:             ret = -errno;
   69:             perror("migration-fd: close");
   70:             return ret;
   71:         }
   72:     }
   73:     return 0;
   74: }
   75: 
   76: int fd_start_outgoing_migration(MigrationState *s, const char *fdname)
   77: {
   78:     s->fd = monitor_get_fd(cur_mon, fdname);
   79:     if (s->fd == -1) {
   80:         DPRINTF("fd_migration: invalid file descriptor identifier\n");
   81:         goto err_after_get_fd;
   82:     }
   83: 
   84:     if (fcntl(s->fd, F_SETFL, O_NONBLOCK) == -1) {
   85:         DPRINTF("Unable to set nonblocking mode on file descriptor\n");
   86:         goto err_after_open;
   87:     }
   88: 
   89:     s->get_error = fd_errno;
   90:     s->write = fd_write;
   91:     s->close = fd_close;
   92: 
   93:     migrate_fd_connect(s);
   94:     return 0;
   95: 
   96: err_after_open:
   97:     close(s->fd);
   98: err_after_get_fd:
   99:     return -1;
  100: }
  101: 
  102: static void fd_accept_incoming_migration(void *opaque)
  103: {
  104:     QEMUFile *f = opaque;
  105: 
  106:     process_incoming_migration(f);
  107:     qemu_set_fd_handler2(qemu_stdio_fd(f), NULL, NULL, NULL, NULL);
  108:     qemu_fclose(f);
  109: }
  110: 
  111: int fd_start_incoming_migration(const char *infd)
  112: {
  113:     int fd;
  114:     QEMUFile *f;
  115: 
  116:     DPRINTF("Attempting to start an incoming migration via fd\n");
  117: 
  118:     fd = strtol(infd, NULL, 0);
  119:     f = qemu_fdopen(fd, "rb");
  120:     if(f == NULL) {
  121:         DPRINTF("Unable to apply qemu wrapper to file descriptor\n");
  122:         return -errno;
  123:     }
  124: 
  125:     qemu_set_fd_handler2(fd, NULL, fd_accept_incoming_migration, NULL, f);
  126: 
  127:     return 0;
  128: }

unix.superglobalmegacorp.com