qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] migration: flush migration data to disk.


From: Juan Quintela
Subject: Re: [Qemu-devel] [PATCH] migration: flush migration data to disk.
Date: Wed, 26 Oct 2011 15:07:06 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux)

Gerd Hoffmann <address@hidden> wrote:
> This patch increases robustness when migrating to a file with
> two little changes:
>
>  (1) Before closing the migration file handle checks if it happens to be
>      a regular file and if so it issues a fsync.  This way the data is
>      flushed to disk before qemu sends the migration completed event.
>  (2) It adds error checking.  In case either fsync or close syscall
>      fails pass up the error (and fail migration).
>
> Cc: Jiri Denemark <address@hidden>
> Signed-off-by: Gerd Hoffmann <address@hidden>
> ---
>  migration-fd.c |   21 ++++++++++++++++++++-
>  1 files changed, 20 insertions(+), 1 deletions(-)
>
> diff --git a/migration-fd.c b/migration-fd.c
> index d0aec89..2206494 100644
> --- a/migration-fd.c
> +++ b/migration-fd.c
> @@ -42,10 +42,29 @@ static int fd_write(MigrationState *s, const void * buf, 
> size_t size)
>  
>  static int fd_close(MigrationState *s)
>  {
> +    struct stat st;
> +    int ret;
> +
>      DPRINTF("fd_close\n");
>      if (s->fd != -1) {
> -        close(s->fd);
> +        ret = fstat(s->fd, &st);
> +        if (ret == 0 && S_ISREG(st.st_mode)) {
> +            /*
> +             * If the file handle is a regular file make sure the
> +             * data is flushed to disk before signaling success.
> +             */
> +            ret = fsync(s->fd);
> +            if (ret != 0) {
> +                perror("migration-fd: fsync");
> +                return -1;

return -error, please.
Trying to get all callers to check the error returns.  (and yes, none of
the close calls check for errors on close)


> +            }
> +        }
> +        ret = close(s->fd);
>          s->fd = -1;
> +        if (ret != 0) {
> +            perror("migration-fd: close");
> +            return -1;
> +        }
>      }
>      return 0;
>  }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]