yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone
76daa3
From 0fc0a6c7d5492e109a852542ec665567eeefbf34 Mon Sep 17 00:00:00 2001
76daa3
From: Eric Blake <eblake@redhat.com>
76daa3
Date: Wed, 19 Jul 2017 18:01:59 +0200
76daa3
Subject: [PATCH 02/17] nbd: strict nbd_wr_syncv
76daa3
76daa3
RH-Author: Eric Blake <eblake@redhat.com>
76daa3
Message-id: <20170719180202.23329-2-eblake@redhat.com>
76daa3
Patchwork-id: 75817
76daa3
O-Subject: [RHEV-7.4.z qemu-kvm-rhev PATCH 1/4] nbd: strict nbd_wr_syncv
76daa3
Bugzilla: 1473638
76daa3
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
76daa3
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
76daa3
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
76daa3
76daa3
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
76daa3
76daa3
nbd_wr_syncv is called either from coroutine or from client negotiation
76daa3
code, when socket is in blocking mode. So, -EAGAIN is impossible.
76daa3
76daa3
Furthermore, EAGAIN is confusing, as, what to read/write again? With
76daa3
EAGAIN as a return code we don't know how much data is already
76daa3
read or written by the function, so in case of EAGAIN the whole
76daa3
communication is broken.
76daa3
76daa3
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
76daa3
Message-Id: <20170516094533.6160-2-vsementsov@virtuozzo.com>
76daa3
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
76daa3
(cherry picked from commit f250a42ddaee042ad2eb02022a3ebd18fcf987de)
76daa3
Signed-off-by: Eric Blake <eblake@redhat.com>
76daa3
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
76daa3
---
76daa3
 nbd/common.c | 11 ++++++-----
76daa3
 1 file changed, 6 insertions(+), 5 deletions(-)
76daa3
76daa3
diff --git a/nbd/common.c b/nbd/common.c
76daa3
index dccbb8e..4db45b3 100644
76daa3
--- a/nbd/common.c
76daa3
+++ b/nbd/common.c
76daa3
@@ -20,6 +20,10 @@
76daa3
 #include "qapi/error.h"
76daa3
 #include "nbd-internal.h"
76daa3
 
76daa3
+/* nbd_wr_syncv
76daa3
+ * The function may be called from coroutine or from non-coroutine context.
76daa3
+ * When called from non-coroutine context @ioc must be in blocking mode.
76daa3
+ */
76daa3
 ssize_t nbd_wr_syncv(QIOChannel *ioc,
76daa3
                      struct iovec *iov,
76daa3
                      size_t niov,
76daa3
@@ -42,11 +46,8 @@ ssize_t nbd_wr_syncv(QIOChannel *ioc,
76daa3
             len = qio_channel_writev(ioc, local_iov, nlocal_iov, &local_err);
76daa3
         }
76daa3
         if (len == QIO_CHANNEL_ERR_BLOCK) {
76daa3
-            if (qemu_in_coroutine()) {
76daa3
-                qio_channel_yield(ioc, do_read ? G_IO_IN : G_IO_OUT);
76daa3
-            } else {
76daa3
-                return -EAGAIN;
76daa3
-            }
76daa3
+            assert(qemu_in_coroutine());
76daa3
+            qio_channel_yield(ioc, do_read ? G_IO_IN : G_IO_OUT);
76daa3
             continue;
76daa3
         }
76daa3
         if (len < 0) {
76daa3
-- 
76daa3
1.8.3.1
76daa3