summaryrefslogtreecommitdiff
path: root/block/nbd-client.c
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2014-03-14 18:44:22 +0000
committerPeter Maydell <peter.maydell@linaro.org>2014-03-14 18:44:22 +0000
commit4191d0eb414b14bcf3eab803095566aeb9b198f0 (patch)
treeb1f06b29951d355bfd0c1682abb8c1d43f3ec6ea /block/nbd-client.c
parent03d51428e2da0188a0adea00cbd713cc1e967e7a (diff)
parent46dea4160d587add2f3670306c41ad9ad4064af5 (diff)
downloadqemu-4191d0eb414b14bcf3eab803095566aeb9b198f0.tar.gz
Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging
Block pull request # gpg: Signature made Fri 14 Mar 2014 16:12:14 GMT using RSA key ID 81AB73C8 # gpg: Good signature from "Stefan Hajnoczi <stefanha@redhat.com>" # gpg: aka "Stefan Hajnoczi <stefanha@gmail.com>" # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 8695 A8BF D3F9 7CDA AC35 775A 9CA4 ABB3 81AB 73C8 * remotes/stefanha/tags/block-pull-request: qemu-iotests: remove 085 and 087 from 'quick' group qemu-iotests: add 083 NBD client disconnect tests tests: add nbd-fault-injector.py utility nbd: close socket if connection breaks block: Explicitly specify 'unsigned long long' for VHDX 64-bit constants blockdev: Refuse to open encrypted image unless paused Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'block/nbd-client.c')
-rw-r--r--block/nbd-client.c33
1 files changed, 18 insertions, 15 deletions
diff --git a/block/nbd-client.c b/block/nbd-client.c
index 0922b78292..7d698cb619 100644
--- a/block/nbd-client.c
+++ b/block/nbd-client.c
@@ -43,6 +43,17 @@ static void nbd_recv_coroutines_enter_all(NbdClientSession *s)
}
}
+static void nbd_teardown_connection(NbdClientSession *client)
+{
+ /* 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 = -1;
+}
+
static void nbd_reply_ready(void *opaque)
{
NbdClientSession *s = opaque;
@@ -78,7 +89,7 @@ static void nbd_reply_ready(void *opaque)
}
fail:
- nbd_recv_coroutines_enter_all(s);
+ nbd_teardown_connection(s);
}
static void nbd_restart_write(void *opaque)
@@ -324,7 +335,7 @@ int nbd_client_session_co_discard(NbdClientSession *client, int64_t sector_num,
}
-static void nbd_teardown_connection(NbdClientSession *client)
+void nbd_client_session_close(NbdClientSession *client)
{
struct nbd_request request = {
.type = NBD_CMD_DISC,
@@ -332,22 +343,14 @@ static void nbd_teardown_connection(NbdClientSession *client)
.len = 0
};
- nbd_send_request(client->sock, &request);
-
- /* 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 = -1;
-}
-
-void nbd_client_session_close(NbdClientSession *client)
-{
if (!client->bs) {
return;
}
+ if (client->sock == -1) {
+ return;
+ }
+
+ nbd_send_request(client->sock, &request);
nbd_teardown_connection(client);
client->bs = NULL;