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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list