]> xenbits.xensource.com Git - libvirt.git/commitdiff
virfile: Report error when changing pipe size fails
authorMichal Privoznik <mprivozn@redhat.com>
Mon, 28 Mar 2022 11:29:19 +0000 (13:29 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 28 Mar 2022 13:04:18 +0000 (15:04 +0200)
When changing the size of pipe that virFileWrapperFdNew() creates
we start at 1MiB and if that fails because it's above the system
wide limit we get EPERM and continue with half of the size.

However, we might get another error in which case we should
report proper system error and return failure from
virFileWrapperFdNew().

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
src/util/virfile.c

index 12b359d55013c41d44888ea528ebe8fa53c6ac79..130b0fbaceb84254a086ddd42334716792c4b6ec 100644 (file)
@@ -217,7 +217,7 @@ struct _virFileWrapperFd {
  *
  * OS note: only for linux, on other OS this is a no-op.
  */
-static void
+static int
 virFileWrapperSetPipeSize(int fd)
 {
     int sz;
@@ -230,21 +230,24 @@ virFileWrapperSetPipeSize(int fd)
             continue; /* retry with half the size */
         }
         if (rv < 0) {
-            break;
+            virReportSystemError(errno, "%s",
+                                 _("unable to set pipe size"));
+            return -1;
         }
         VIR_DEBUG("fd %d pipe size adjusted to %d", fd, sz);
-        return;
+        return 0;
     }
 
     VIR_WARN("unable to set pipe size, data transfer might be slow: %s",
              g_strerror(errno));
+    return 0;
 }
 
 # else /* !__linux__ */
-static void
+static int
 virFileWrapperSetPipeSize(int fd G_GNUC_UNUSED)
 {
-    return;
+    return 0;
 }
 # endif /* !__linux__ */
 
@@ -323,6 +326,9 @@ virFileWrapperFdNew(int *fd, const char *name, unsigned int flags)
     if (virPipe(pipefd) < 0)
         goto error;
 
+    if (virFileWrapperSetPipeSize(pipefd[output]) < 0)
+        goto error;
+
     if (!(iohelper_path = virFileFindResource("libvirt_iohelper",
                                               abs_top_builddir "/src",
                                               LIBEXECDIR)))
@@ -330,8 +336,6 @@ virFileWrapperFdNew(int *fd, const char *name, unsigned int flags)
 
     ret->cmd = virCommandNewArgList(iohelper_path, name, NULL);
 
-    virFileWrapperSetPipeSize(pipefd[output]);
-
     if (output) {
         virCommandSetInputFD(ret->cmd, pipefd[0]);
         virCommandSetOutputFD(ret->cmd, fd);