Gerd Hoffmann <kra...@redhat.com> 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 <jdene...@redhat.com> > Signed-off-by: Gerd Hoffmann <kra...@redhat.com> > --- > 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; > }