|
|
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 |
|