static void nbd_co_receive_reply(NbdClientSession *s, struct nbd_request *request, struct nbd_reply *reply, QEMUIOVector *qiov, int offset) { int ret; /* Wait until we're woken up by the read handler. TODO: perhaps * peek at the next reply and avoid yielding if it's ours? */ qemu_coroutine_yield(); *reply = s->reply; if (reply->handle != request->handle) { reply->error = EIO; } else { if (qiov && reply->error == 0) { ret = qemu_co_recvv(s->sock, qiov->iov, qiov->niov, offset, request->len); if (ret != request->len) { reply->error = EIO; } } /* Tell the read handler to read another header. */ s->reply.handle = 0; } }
static void nbd_co_receive_reply(BDRVNBDState *s, struct nbd_request *request, struct nbd_reply *reply, struct iovec *iov, int offset) { int ret; /* Wait until we're woken up by the read handler. TODO: perhaps * peek at the next reply and avoid yielding if it's ours? */ qemu_coroutine_yield(); *reply = s->reply; if (reply->handle != request->handle) { reply->error = EIO; } else { if (iov && reply->error == 0) { ret = qemu_co_recvv(s->sock, iov, request->len, offset); if (ret != request->len) { reply->error = EIO; } } /* Tell the read handler to read another header. */ s->reply.handle = 0; } }