aboutsummaryrefslogtreecommitdiff
path: root/block/nbd.c
diff options
context:
space:
mode:
authorAnthony Liguori <aliguori@us.ibm.com>2013-04-22 08:05:14 -0500
committerAnthony Liguori <aliguori@us.ibm.com>2013-04-22 08:05:14 -0500
commit25690739f1f067b6d8b2e616d87b1d976db0db92 (patch)
tree85bc19d331715699e4adda08c88370a4952b73be /block/nbd.c
parent6165daa4c8431d9d60382352864b46f34dd61ab4 (diff)
parent97ebbab0e324831dff47dbfa4bed55808cb3ec74 (diff)
Merge remote-tracking branch 'bonzini/nbd-next' into staging
# By Stefan Hajnoczi # Via Paolo Bonzini * bonzini/nbd-next: nbd: set TCP_NODELAY nbd: use TCP_CORK in nbd_co_send_request() nbd: unlock mutex in nbd_co_send_request() error path Message-id: 1366381830-11267-1-git-send-email-pbonzini@redhat.com Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'block/nbd.c')
-rw-r--r--block/nbd.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/block/nbd.c b/block/nbd.c
index eff683c8df..d9dc454498 100644
--- a/block/nbd.c
+++ b/block/nbd.c
@@ -334,13 +334,23 @@ static int nbd_co_send_request(BDRVNBDState *s, struct nbd_request *request,
s->send_coroutine = qemu_coroutine_self();
qemu_aio_set_fd_handler(s->sock, nbd_reply_ready, nbd_restart_write,
nbd_have_request, s);
- rc = nbd_send_request(s->sock, request);
- if (rc >= 0 && qiov) {
- ret = qemu_co_sendv(s->sock, qiov->iov, qiov->niov,
- offset, request->len);
- if (ret != request->len) {
- return -EIO;
+ if (qiov) {
+ if (!s->is_unix) {
+ socket_set_cork(s->sock, 1);
}
+ rc = nbd_send_request(s->sock, request);
+ if (rc >= 0) {
+ ret = qemu_co_sendv(s->sock, qiov->iov, qiov->niov,
+ offset, request->len);
+ if (ret != request->len) {
+ rc = -EIO;
+ }
+ }
+ if (!s->is_unix) {
+ socket_set_cork(s->sock, 0);
+ }
+ } else {
+ rc = nbd_send_request(s->sock, request);
}
qemu_aio_set_fd_handler(s->sock, nbd_reply_ready, NULL,
nbd_have_request, s);
@@ -396,6 +406,9 @@ static int nbd_establish_connection(BlockDriverState *bs)
sock = unix_socket_outgoing(qemu_opt_get(s->socket_opts, "path"));
} else {
sock = tcp_socket_outgoing_opts(s->socket_opts);
+ if (sock >= 0) {
+ socket_set_nodelay(sock);
+ }
}
/* Failed to establish connection */