From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40771) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VsUWf-0006FQ-Ax for qemu-devel@nongnu.org; Mon, 16 Dec 2013 04:31:51 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VsUWV-0002Bo-Lf for qemu-devel@nongnu.org; Mon, 16 Dec 2013 04:31:45 -0500 Received: from mx1.redhat.com ([209.132.183.28]:9777) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VsUWV-0002BB-CR for qemu-devel@nongnu.org; Mon, 16 Dec 2013 04:31:35 -0500 From: Gerd Hoffmann Date: Mon, 16 Dec 2013 10:31:13 +0100 Message-Id: <1387186277-9573-13-git-send-email-kraxel@redhat.com> In-Reply-To: <1387186277-9573-1-git-send-email-kraxel@redhat.com> References: <1387186277-9573-1-git-send-email-kraxel@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH 12/16] nbd: finish any pending coroutine List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Gerd Hoffmann , Stefan Hajnoczi From: Marc-Andr=C3=A9 Lureau Make sure all pending coroutines are finished when closing the session. Signed-off-by: Marc-Andr=C3=A9 Lureau Acked-by: Paolo Bonzini Signed-off-by: Gerd Hoffmann --- block/nbd-client.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/block/nbd-client.c b/block/nbd-client.c index 9156093..1973cf0 100644 --- a/block/nbd-client.c +++ b/block/nbd-client.c @@ -32,6 +32,17 @@ #define HANDLE_TO_INDEX(bs, handle) ((handle) ^ ((uint64_t)(intptr_t)bs)= ) #define INDEX_TO_HANDLE(bs, index) ((index) ^ ((uint64_t)(intptr_t)bs)= ) =20 +static void nbd_recv_coroutines_enter_all(NbdClientSession *s) +{ + int i; + + for (i =3D 0; i < MAX_NBD_REQUESTS; i++) { + if (s->recv_coroutine[i]) { + qemu_coroutine_enter(s->recv_coroutine[i], NULL); + } + } +} + static void nbd_reply_ready(void *opaque) { NbdClientSession *s =3D opaque; @@ -67,11 +78,7 @@ static void nbd_reply_ready(void *opaque) } =20 fail: - for (i =3D 0; i < MAX_NBD_REQUESTS; i++) { - if (s->recv_coroutine[i]) { - qemu_coroutine_enter(s->recv_coroutine[i], NULL); - } - } + nbd_recv_coroutines_enter_all(s); } =20 static void nbd_restart_write(void *opaque) @@ -330,6 +337,10 @@ static void nbd_teardown_connection(NbdClientSession= *client) request.len =3D 0; nbd_send_request(client->sock, &request); =20 + /* finish any pending coroutines */ + shutdown(client->sock, 2); + nbd_recv_coroutines_enter_all(client); + qemu_aio_set_fd_handler(client->sock, NULL, NULL, NULL); closesocket(client->sock); client->sock =3D -1; --=20 1.8.3.1