On 01.11.2012 11:58, Daniel P. Berrange wrote: > 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 > Yeah, I'll respin v2 since we need to do this only on network filesystems. Okay, not all of them, but especially NFS and probably iSCSI don't pre-allocate blocks on write(). Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list