]> xenbits.xensource.com Git - libvirt.git/commitdiff
fsync new storage volumes even if new volume was copied.
authorLaine Stump <laine@laine.org>
Mon, 19 Jul 2010 22:59:07 +0000 (18:59 -0400)
committerLaine Stump <laine@laine.org>
Tue, 20 Jul 2010 01:01:28 +0000 (21:01 -0400)
Originally the storage volume files were opened with O_DSYNC to make
sure they were flushed to disk immediately. It turned out that this
was extremely slow in some cases, so the O_DSYNC was removed in favor
of just calling fsync() after all the data had been written. However,
this call to fsync was inside the block that is executed to zero-fill
the end of the volume file. In cases where the new volume is copied
from an old volume, and they are the same length, this fsync would
never take place.

Now the fsync is *always* done, unless there is an error (in which
case it isn't important, and is most likely inappropriate.

src/storage/storage_backend.c

index 1eb8e33a7a1c1976e651ad50fdcc2cad437504ed..730ca7b52fca959b9eead94a4650d41e663b21b4 100644 (file)
@@ -324,12 +324,13 @@ static int createRawFileOpHook(int fd, void *data) {
             }
         }
 
-        if (fsync(fd) < 0) {
-            ret = errno;
-            virReportSystemError(errno, _("cannot sync data to file '%s'"),
-                                 hdata->vol->target.path);
-            goto cleanup;
-        }
+    }
+
+    if (fsync(fd) < 0) {
+        ret = errno;
+        virReportSystemError(errno, _("cannot sync data to file '%s'"),
+                             hdata->vol->target.path);
+        goto cleanup;
     }
 
 cleanup: