diff options
author | Daniel P. Berrange <berrange@redhat.com> | 2016-02-10 18:41:01 +0000 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2016-02-16 17:13:22 +0100 |
commit | 064097d919508e8636b220baedb52b382b9b07c6 (patch) | |
tree | 0af56e405e3316ed219c4c874a9101d305c81327 /block/nbd.c | |
parent | 0ab3b3375b362e4ea53714e8448eaf60d311daac (diff) |
nbd: convert block client to use I/O channels for connection setup
This converts the NBD block driver client to use the QIOChannelSocket
class for initial connection setup. The NbdClientSession struct has
two pointers, one to the master QIOChannelSocket providing the raw
data channel, and one to a QIOChannel which is the current channel
used for I/O. Initially the two point to the same object, but when
TLS support is added, they will point to different objects.
The qemu-img & qemu-io tools now need to use MODULE_INIT_QOM to
ensure the QIOChannel object classes are registered. The qemu-nbd
tool already did this.
In this initial conversion though, all I/O is still actually done
using the raw POSIX sockets APIs.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Message-Id: <1455129674-17255-4-git-send-email-berrange@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'block/nbd.c')
-rw-r--r-- | block/nbd.c | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/block/nbd.c b/block/nbd.c index 1a90bc7855..d7116e2f6b 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -31,7 +31,6 @@ #include "qemu/uri.h" #include "block/block_int.h" #include "qemu/module.h" -#include "qemu/sockets.h" #include "qapi/qmp/qdict.h" #include "qapi/qmp/qjson.h" #include "qapi/qmp/qint.h" @@ -238,25 +237,25 @@ NbdClientSession *nbd_get_client_session(BlockDriverState *bs) return &s->client; } -static int nbd_establish_connection(BlockDriverState *bs, - SocketAddress *saddr, - Error **errp) +static QIOChannelSocket *nbd_establish_connection(SocketAddress *saddr, + Error **errp) { - BDRVNBDState *s = bs->opaque; - int sock; + QIOChannelSocket *sioc; + Error *local_err = NULL; - sock = socket_connect(saddr, errp, NULL, NULL); + sioc = qio_channel_socket_new(); - if (sock < 0) { - logout("Failed to establish connection to NBD server\n"); - return -EIO; + qio_channel_socket_connect_sync(sioc, + saddr, + &local_err); + if (local_err) { + error_propagate(errp, local_err); + return NULL; } - if (!s->client.is_unix) { - socket_set_nodelay(sock); - } + qio_channel_set_delay(QIO_CHANNEL(sioc), false); - return sock; + return sioc; } static int nbd_open(BlockDriverState *bs, QDict *options, int flags, @@ -264,7 +263,8 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags, { BDRVNBDState *s = bs->opaque; char *export = NULL; - int result, sock; + int result; + QIOChannelSocket *sioc; SocketAddress *saddr; /* Pop the config into our state object. Exit if invalid. */ @@ -276,15 +276,16 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags, /* establish TCP connection, return error if it fails * TODO: Configurable retry-until-timeout behaviour. */ - sock = nbd_establish_connection(bs, saddr, errp); + sioc = nbd_establish_connection(saddr, errp); qapi_free_SocketAddress(saddr); - if (sock < 0) { + if (!sioc) { g_free(export); - return sock; + return -ECONNREFUSED; } /* NBD handshake */ - result = nbd_client_init(bs, sock, export, errp); + result = nbd_client_init(bs, sioc, export, errp); + object_unref(OBJECT(sioc)); g_free(export); return result; } |