mirror of https://gitee.com/openkylin/qemu.git
nbd: strict nbd_wr_syncv
nbd_wr_syncv is called either from coroutine or from client negotiation code, when socket is in blocking mode. So, -EAGAIN is impossible. Furthermore, EAGAIN is confusing, as, what to read/write again? With EAGAIN as a return code we don't know how much data is already read or written by the function, so in case of EAGAIN the whole communication is broken. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Message-Id: <20170516094533.6160-2-vsementsov@virtuozzo.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
7e6478e7d4
commit
f250a42dda
11
nbd/common.c
11
nbd/common.c
|
@ -20,6 +20,10 @@
|
|||
#include "qapi/error.h"
|
||||
#include "nbd-internal.h"
|
||||
|
||||
/* nbd_wr_syncv
|
||||
* The function may be called from coroutine or from non-coroutine context.
|
||||
* When called from non-coroutine context @ioc must be in blocking mode.
|
||||
*/
|
||||
ssize_t nbd_wr_syncv(QIOChannel *ioc,
|
||||
struct iovec *iov,
|
||||
size_t niov,
|
||||
|
@ -42,11 +46,8 @@ ssize_t nbd_wr_syncv(QIOChannel *ioc,
|
|||
len = qio_channel_writev(ioc, local_iov, nlocal_iov, &local_err);
|
||||
}
|
||||
if (len == QIO_CHANNEL_ERR_BLOCK) {
|
||||
if (qemu_in_coroutine()) {
|
||||
qio_channel_yield(ioc, do_read ? G_IO_IN : G_IO_OUT);
|
||||
} else {
|
||||
return -EAGAIN;
|
||||
}
|
||||
assert(qemu_in_coroutine());
|
||||
qio_channel_yield(ioc, do_read ? G_IO_IN : G_IO_OUT);
|
||||
continue;
|
||||
}
|
||||
if (len < 0) {
|
||||
|
|
Loading…
Reference in New Issue