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

Re: [libvirt] [PATCH] iohelper: fsync() at the end



On Thu, Nov 01, 2012 at 11:26:18AM +0100, Michal Privoznik wrote:
> Currently, when we are doing (managed) save, we insert the
> iohelper between the qemu and OS. The pipe is created, the
> writing end is passed to qemu and the reading end to the
> iohelper. It reads data and write them into given file. However,
> with write() being asynchronous data may still be in OS
> caches and hence in some (corner) cases, all migration data
> may have been read and written (not physically though). So
> qemu will report success, as well as iohelper. However, with
> some non local filesystems, where ENOSPACE is polled every X
> time units, we may get into situation where all operations
> succeeded but data hasn't reached the disk. And in fact will
> never do. Therefore we ought sync caches to make sure data
> has reached the block device on remote host.
> ---
> 
> For more information follow:
> https://bugzilla.redhat.com/show_bug.cgi?id=866369
> 
>  src/util/iohelper.c |    6 ++++++
>  1 files changed, 6 insertions(+), 0 deletions(-)
> 
> diff --git a/src/util/iohelper.c b/src/util/iohelper.c
> index c6542ed..aad5cb8 100644
> --- a/src/util/iohelper.c
> +++ b/src/util/iohelper.c
> @@ -179,6 +179,12 @@ runIO(const char *path, int fd, int oflags, unsigned long long length)
>          }
>      }
>  
> +    /* Ensure all data is written */
> +    if (fsync(fdout) < 0) {
> +        virReportSystemError(errno, _("unable to fsync %s"), fdoutname);
> +        goto cleanup;
> +    }
> +

I wonder if perhaps we can use fdatasync(), or do we really need the
full fsync() ?


Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|


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