[libvirt RFC 2/5] virfile: use virFileDirect API in runIOCopy

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Signed-off-by: Claudio Fontana <cfontana@xxxxxxx>
---
 src/util/virfile.c | 28 ++++++++--------------------
 1 file changed, 8 insertions(+), 20 deletions(-)

diff --git a/src/util/virfile.c b/src/util/virfile.c
index 03a7cdc9bf..c529598595 100644
--- a/src/util/virfile.c
+++ b/src/util/virfile.c
@@ -4851,20 +4851,14 @@ static off_t
 runIOCopy(const struct runIOParams p)
 {
     g_autofree void *base = NULL; /* Location to be freed */
-    char *buf = NULL; /* Aligned location within base */
-    size_t buflen = 1024*1024;
-    intptr_t alignMask = 64*1024 - 1;
     off_t total = 0;
+    size_t buflen = 1024*1024;
+    char *buf = virFileDirectBufferNew(&base, buflen);
 
-# if WITH_POSIX_MEMALIGN
-    if (posix_memalign(&base, alignMask + 1, buflen))
-        abort();
-    buf = base;
-# else
-    buf = g_new0(char, buflen + alignMask);
-    base = buf;
-    buf = (char *) (((intptr_t) base + alignMask) & ~alignMask);
-# endif
+    if (!buf) {
+        virReportSystemError(errno, _("Failed to allocate aligned memory in function %s"), __FUNCTION__);
+        return -5;
+    }
 
     while (1) {
         ssize_t got;
@@ -4876,9 +4870,7 @@ runIOCopy(const struct runIOParams p)
          * In other cases using saferead reduces number of syscalls.
          */
         if (!p.isWrite && p.isDirect) {
-            if ((got = read(p.fdin, buf, buflen)) < 0 &&
-                errno == EINTR)
-                continue;
+            got = virFileDirectRead(p.fdin, buf, buflen);
         } else {
             got = saferead(p.fdin, buf, buflen);
         }
@@ -4894,11 +4886,7 @@ runIOCopy(const struct runIOParams p)
 
         /* handle last write size align in direct case */
         if (got < buflen && p.isDirect && p.isWrite) {
-            ssize_t aligned_got = (got + alignMask) & ~alignMask;
-
-            memset(buf + got, 0, aligned_got - got);
-
-            if (safewrite(p.fdout, buf, aligned_got) < 0) {
+            if (virFileDirectWriteLim(p.fdout, buf, got) < 0) {
                 virReportSystemError(errno, _("Unable to write %s"), p.fdoutname);
                 return -3;
             }
-- 
2.26.2





[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux