]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
iohelper: simplify last direct write alignment
authorNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Thu, 7 Sep 2017 07:44:14 +0000 (10:44 +0300)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 19 Sep 2017 09:37:20 +0000 (11:37 +0200)
Make alignment of last direct write more straightforward. Using
additionally two flags 'end' and 'shortRead' looks complicated.

src/util/iohelper.c

index 5fc311be62d91c3e3f552d747c3d4cbc23142378..1896fd362a17d8b54383867b8c1e9248613a400b 100644 (file)
@@ -55,7 +55,6 @@ runIO(const char *path, int fd, int oflags)
     const char *fdinname, *fdoutname;
     unsigned long long total = 0;
     bool direct = O_DIRECT && ((oflags & O_DIRECT) != 0);
-    bool shortRead = false; /* true if we hit a short read */
     off_t end = 0;
 
 #if HAVE_POSIX_MEMALIGN
@@ -115,30 +114,32 @@ runIO(const char *path, int fd, int oflags)
             goto cleanup;
         }
         if (got == 0)
-            break; /* End of file before end of requested data */
-        if (got < buflen) {
-            /* O_DIRECT can handle at most one short read, at end of file */
-            if (direct && shortRead) {
-                virReportSystemError(EINVAL, "%s",
-                                     _("Too many short reads for O_DIRECT"));
-            }
-            shortRead = true;
-        }
+            break;
 
         total += got;
-        if (fdout == fd && direct && shortRead) {
-            end = total;
+
+        /* handle last write size align in direct case */
+        if (got < buflen && direct && fdout == fd) {
             memset(buf + got, 0, buflen - got);
             got = (got + alignMask) & ~alignMask;
+
+            if (safewrite(fdout, buf, got) < 0) {
+                virReportSystemError(errno, _("Unable to write %s"), fdoutname);
+                goto cleanup;
+            }
+
+            if (ftruncate(fd, total) < 0) {
+                virReportSystemError(errno, _("Unable to truncate %s"), fdoutname);
+                goto cleanup;
+            }
+
+            break;
         }
+
         if (safewrite(fdout, buf, got) < 0) {
             virReportSystemError(errno, _("Unable to write %s"), fdoutname);
             goto cleanup;
         }
-        if (end && ftruncate(fd, end) < 0) {
-            virReportSystemError(errno, _("Unable to truncate %s"), fdoutname);
-            goto cleanup;
-        }
     }
 
     /* Ensure all data is written */