Alon Levy 408bdb5
From 1b98be7980ca1ac4a5ea1b140e09594c74824204 Mon Sep 17 00:00:00 2001
Alon Levy 408bdb5
From: Paolo Bonzini <pbonzini@redhat.com>
Alon Levy 408bdb5
Date: Fri, 22 Feb 2013 17:36:37 +0100
Alon Levy 408bdb5
Subject: [PATCH 235/246] qemu-file: fsync a writable stdio QEMUFile
Alon Levy 408bdb5
Alon Levy 408bdb5
This is what fd_close does.  Prepare for switching to a QEMUFile.
Alon Levy 408bdb5
Alon Levy 408bdb5
Reviewed-by: Orit Wasserman <owasserm@redhat.com>
Alon Levy 408bdb5
Reviewed-by: Juan Quintela <quintela@redhat.com>
Alon Levy 408bdb5
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Alon Levy 408bdb5
Signed-off-by: Juan Quintela <quintela@redhat.com>
Alon Levy 408bdb5
---
Alon Levy 408bdb5
 savevm.c | 18 ++++++++++++++++++
Alon Levy 408bdb5
 1 file changed, 18 insertions(+)
Alon Levy 408bdb5
Alon Levy 408bdb5
diff --git a/savevm.c b/savevm.c
Alon Levy 408bdb5
index 38699de..1d49fde 100644
Alon Levy 408bdb5
--- a/savevm.c
Alon Levy 408bdb5
+++ b/savevm.c
Alon Levy 408bdb5
@@ -256,6 +256,24 @@ static int stdio_fclose(void *opaque)
Alon Levy 408bdb5
 {
Alon Levy 408bdb5
     QEMUFileStdio *s = opaque;
Alon Levy 408bdb5
     int ret = 0;
Alon Levy 408bdb5
+
Alon Levy 408bdb5
+    if (s->file->ops->put_buffer) {
Alon Levy 408bdb5
+        int fd = fileno(s->stdio_file);
Alon Levy 408bdb5
+        struct stat st;
Alon Levy 408bdb5
+
Alon Levy 408bdb5
+        ret = fstat(fd, &st);
Alon Levy 408bdb5
+        if (ret == 0 && S_ISREG(st.st_mode)) {
Alon Levy 408bdb5
+            /*
Alon Levy 408bdb5
+             * If the file handle is a regular file make sure the
Alon Levy 408bdb5
+             * data is flushed to disk before signaling success.
Alon Levy 408bdb5
+             */
Alon Levy 408bdb5
+            ret = fsync(fd);
Alon Levy 408bdb5
+            if (ret != 0) {
Alon Levy 408bdb5
+                ret = -errno;
Alon Levy 408bdb5
+                return ret;
Alon Levy 408bdb5
+            }
Alon Levy 408bdb5
+        }
Alon Levy 408bdb5
+    }
Alon Levy 408bdb5
     if (fclose(s->stdio_file) == EOF) {
Alon Levy 408bdb5
         ret = -errno;
Alon Levy 408bdb5
     }
Alon Levy 408bdb5
-- 
Alon Levy 408bdb5
1.8.2.1
Alon Levy 408bdb5