From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
To: qemu-devel@nongnu.org, qemu-block@nongnu.org
Cc: armbru@redhat.com, famz@redhat.com, pbonzini@redhat.com,
eblake@redhat.com, mreitz@redhat.com, kwolf@redhat.com,
den@openvz.org, vsementsov@virtuozzo.com
Subject: [Qemu-devel] [RFC 2/3] nbd: add .bdrv_reconnect handler
Date: Tue, 24 Apr 2018 16:08:20 +0300 [thread overview]
Message-ID: <20180424130821.50987-3-vsementsov@virtuozzo.com> (raw)
In-Reply-To: <20180424130821.50987-1-vsementsov@virtuozzo.com>
Add handler, which reconnects to NBD server. For it:
- separate connection code to nbd_reconnect()
- store tlscreds and hostname in BDRVNBDState
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
block/nbd.c | 60 ++++++++++++++++++++++++++++++++++++++++++++----------------
1 file changed, 44 insertions(+), 16 deletions(-)
diff --git a/block/nbd.c b/block/nbd.c
index 1e2b3ba2d3..371341dbcf 100644
--- a/block/nbd.c
+++ b/block/nbd.c
@@ -48,6 +48,10 @@ typedef struct BDRVNBDState {
/* For nbd_refresh_filename() */
SocketAddress *saddr;
char *export, *tlscredsid;
+
+ /* For nbd_reconnect() */
+ QCryptoTLSCreds *tlscreds;
+ const char *hostname;
} BDRVNBDState;
static int nbd_parse_uri(const char *filename, QDict *options)
@@ -392,6 +396,33 @@ static QemuOptsList nbd_runtime_opts = {
},
};
+static int nbd_reconnect(BlockDriverState *bs, Error **errp)
+{
+ int ret;
+ BDRVNBDState *s = bs->opaque;
+ QIOChannelSocket *sioc;
+
+ /* close current connection if any */
+ nbd_client_close(bs);
+
+ memset(&s->client, 0, sizeof(s->client));
+ s->client.quit = true;
+
+ sioc = nbd_establish_connection(s->saddr, errp);
+ if (!sioc) {
+ return -ECONNREFUSED;
+ }
+
+ ret = nbd_client_init(bs, sioc, s->export, s->tlscreds, s->hostname, errp);
+ object_unref(OBJECT(sioc));
+ if (ret < 0) {
+ return ret;
+ }
+
+ s->client.quit = false;
+ return ret;
+}
+
static int nbd_open(BlockDriverState *bs, QDict *options, int flags,
Error **errp)
{
@@ -399,8 +430,6 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags,
QemuOpts *opts = NULL;
Error *local_err = NULL;
QIOChannelSocket *sioc = NULL;
- QCryptoTLSCreds *tlscreds = NULL;
- const char *hostname = NULL;
int ret = -EINVAL;
opts = qemu_opts_create(&nbd_runtime_opts, NULL, 0, &error_abort);
@@ -425,8 +454,8 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags,
s->tlscredsid = g_strdup(qemu_opt_get(opts, "tls-creds"));
if (s->tlscredsid) {
- tlscreds = nbd_get_tls_creds(s->tlscredsid, errp);
- if (!tlscreds) {
+ s->tlscreds = nbd_get_tls_creds(s->tlscredsid, errp);
+ if (!s->tlscreds) {
goto error;
}
@@ -435,29 +464,22 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags,
error_setg(errp, "TLS only supported over IP sockets");
goto error;
}
- hostname = s->saddr->u.inet.host;
+ s->hostname = s->saddr->u.inet.host;
}
/* establish TCP connection, return error if it fails
* TODO: Configurable retry-until-timeout behaviour.
*/
- sioc = nbd_establish_connection(s->saddr, errp);
- if (!sioc) {
- ret = -ECONNREFUSED;
- goto error;
- }
+ ret = nbd_reconnect(bs, errp);
- /* NBD handshake */
- ret = nbd_client_init(bs, sioc, s->export,
- tlscreds, hostname, errp);
error:
if (sioc) {
object_unref(OBJECT(sioc));
}
- if (tlscreds) {
- object_unref(OBJECT(tlscreds));
- }
if (ret < 0) {
+ if (s->tlscreds) {
+ object_unref(OBJECT(s->tlscreds));
+ }
qapi_free_SocketAddress(s->saddr);
g_free(s->export);
g_free(s->tlscredsid);
@@ -494,6 +516,9 @@ static void nbd_close(BlockDriverState *bs)
nbd_client_close(bs);
+ if (s->tlscreds) {
+ object_unref(OBJECT(s->tlscreds));
+ }
qapi_free_SocketAddress(s->saddr);
g_free(s->export);
g_free(s->tlscredsid);
@@ -574,6 +599,7 @@ static BlockDriver bdrv_nbd = {
.instance_size = sizeof(BDRVNBDState),
.bdrv_parse_filename = nbd_parse_filename,
.bdrv_file_open = nbd_open,
+ .bdrv_reconnect = nbd_reconnect,
.bdrv_co_preadv = nbd_client_co_preadv,
.bdrv_co_pwritev = nbd_client_co_pwritev,
.bdrv_co_pwrite_zeroes = nbd_client_co_pwrite_zeroes,
@@ -594,6 +620,7 @@ static BlockDriver bdrv_nbd_tcp = {
.instance_size = sizeof(BDRVNBDState),
.bdrv_parse_filename = nbd_parse_filename,
.bdrv_file_open = nbd_open,
+ .bdrv_reconnect = nbd_reconnect,
.bdrv_co_preadv = nbd_client_co_preadv,
.bdrv_co_pwritev = nbd_client_co_pwritev,
.bdrv_co_pwrite_zeroes = nbd_client_co_pwrite_zeroes,
@@ -614,6 +641,7 @@ static BlockDriver bdrv_nbd_unix = {
.instance_size = sizeof(BDRVNBDState),
.bdrv_parse_filename = nbd_parse_filename,
.bdrv_file_open = nbd_open,
+ .bdrv_reconnect = nbd_reconnect,
.bdrv_co_preadv = nbd_client_co_preadv,
.bdrv_co_pwritev = nbd_client_co_pwritev,
.bdrv_co_pwrite_zeroes = nbd_client_co_pwrite_zeroes,
--
2.11.1
next prev parent reply other threads:[~2018-04-24 13:08 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-24 13:08 [Qemu-devel] [RFC 0/3] NBD reconnect Vladimir Sementsov-Ogievskiy
2018-04-24 13:08 ` [Qemu-devel] [RFC 1/3] block: add bdrv_reconnect Vladimir Sementsov-Ogievskiy
2018-04-24 13:08 ` Vladimir Sementsov-Ogievskiy [this message]
2018-04-24 13:08 ` [Qemu-devel] [RFC 3/3] blk: add 'reconnect' error action Vladimir Sementsov-Ogievskiy
2018-04-26 16:19 ` [Qemu-devel] [RFC 0/3] NBD reconnect Vladimir Sementsov-Ogievskiy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180424130821.50987-3-vsementsov@virtuozzo.com \
--to=vsementsov@virtuozzo.com \
--cc=armbru@redhat.com \
--cc=den@openvz.org \
--cc=eblake@redhat.com \
--cc=famz@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).