[Top][All Lists]
[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;
> }