From: Eric Blake <eblake@redhat.com>
To: qemu-devel@nongnu.org
Cc: nsoffer@redhat.com, rjones@redhat.com, jsnow@redhat.com,
vsementsov@virtuozzo.com, qemu-block@nongnu.org,
Kevin Wolf <kwolf@redhat.com>, Max Reitz <mreitz@redhat.com>
Subject: [Qemu-devel] [PATCH v4 10/21] nbd/client: Change signature of nbd_negotiate_simple_meta_context()
Date: Thu, 17 Jan 2019 13:36:47 -0600 [thread overview]
Message-ID: <20190117193658.16413-11-eblake@redhat.com> (raw)
In-Reply-To: <20190117193658.16413-1-eblake@redhat.com>
Pass 'info' instead of three separate parameters related to info,
when requesting the server to set the meta context. Update the
NBDExportInfo struct to rename the received id field to match the
fact that we are currently overloading the field to match whatever
context the user supplied through the x-dirty-bitmap hack, as well
as adding a TODO comment to remind future patches about a desire
to request two contexts at once.
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <20181215135324.152629-12-eblake@redhat.com>
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
include/block/nbd.h | 2 +-
block/nbd-client.c | 4 ++--
nbd/client.c | 53 +++++++++++++++++++++------------------------
3 files changed, 28 insertions(+), 31 deletions(-)
diff --git a/include/block/nbd.h b/include/block/nbd.h
index 00d3eb57d9c..be19aac2fc7 100644
--- a/include/block/nbd.h
+++ b/include/block/nbd.h
@@ -276,7 +276,7 @@ struct NBDExportInfo {
uint32_t opt_block;
uint32_t max_block;
- uint32_t meta_base_allocation_id;
+ uint32_t context_id;
};
typedef struct NBDExportInfo NBDExportInfo;
diff --git a/block/nbd-client.c b/block/nbd-client.c
index 3309376bc16..813539676d2 100644
--- a/block/nbd-client.c
+++ b/block/nbd-client.c
@@ -249,11 +249,11 @@ static int nbd_parse_blockstatus_payload(NBDClientSession *client,
}
context_id = payload_advance32(&payload);
- if (client->info.meta_base_allocation_id != context_id) {
+ if (client->info.context_id != context_id) {
error_setg(errp, "Protocol error: unexpected context id %d for "
"NBD_REPLY_TYPE_BLOCK_STATUS, when negotiated context "
"id is %d", context_id,
- client->info.meta_base_allocation_id);
+ client->info.context_id);
return -EINVAL;
}
diff --git a/nbd/client.c b/nbd/client.c
index 8227e69478a..77993890f04 100644
--- a/nbd/client.c
+++ b/nbd/client.c
@@ -630,26 +630,30 @@ static QIOChannel *nbd_receive_starttls(QIOChannel *ioc,
}
/* nbd_negotiate_simple_meta_context:
- * Set one meta context. Simple means that reply must contain zero (not
- * negotiated) or one (negotiated) contexts. More contexts would be considered
- * as a protocol error. It's also implied that meta-data query equals queried
- * context name, so, if server replies with something different than @context,
- * it is considered an error too.
- * return 1 for successful negotiation, context_id is set
+ * Request the server to set the meta context for export @info->name
+ * using @info->x_dirty_bitmap with a fallback to "base:allocation",
+ * setting @info->context_id to the resulting id. Fail if the server
+ * responds with more than one context or with a context different
+ * than the query.
+ * return 1 for successful negotiation,
* 0 if operation is unsupported,
* -1 with errp set for any other error
*/
static int nbd_negotiate_simple_meta_context(QIOChannel *ioc,
- const char *export,
- const char *context,
- uint32_t *context_id,
+ NBDExportInfo *info,
Error **errp)
{
+ /*
+ * TODO: Removing the x_dirty_bitmap hack will mean refactoring
+ * this function to request and store ids for multiple contexts
+ * (both base:allocation and a dirty bitmap), at which point this
+ * function should lose the term _simple.
+ */
int ret;
NBDOptionReply reply;
- uint32_t received_id = 0;
+ const char *context = info->x_dirty_bitmap ?: "base:allocation";
bool received = false;
- uint32_t export_len = strlen(export);
+ uint32_t export_len = strlen(info->name);
uint32_t context_len = strlen(context);
uint32_t data_len = sizeof(export_len) + export_len +
sizeof(uint32_t) + /* number of queries */
@@ -657,9 +661,9 @@ static int nbd_negotiate_simple_meta_context(QIOChannel *ioc,
char *data = g_malloc(data_len);
char *p = data;
- trace_nbd_opt_meta_request(context, export);
+ trace_nbd_opt_meta_request(context, info->name);
stl_be_p(p, export_len);
- memcpy(p += sizeof(export_len), export, export_len);
+ memcpy(p += sizeof(export_len), info->name, export_len);
stl_be_p(p += export_len, 1);
stl_be_p(p += sizeof(uint32_t), context_len);
memcpy(p += sizeof(context_len), context, context_len);
@@ -685,7 +689,7 @@ static int nbd_negotiate_simple_meta_context(QIOChannel *ioc,
if (reply.type == NBD_REP_META_CONTEXT) {
char *name;
- if (reply.length != sizeof(received_id) + context_len) {
+ if (reply.length != sizeof(info->context_id) + context_len) {
error_setg(errp, "Failed to negotiate meta context '%s', server "
"answered with unexpected length %" PRIu32, context,
reply.length);
@@ -693,12 +697,13 @@ static int nbd_negotiate_simple_meta_context(QIOChannel *ioc,
return -1;
}
- if (nbd_read(ioc, &received_id, sizeof(received_id), errp) < 0) {
+ if (nbd_read(ioc, &info->context_id, sizeof(info->context_id),
+ errp) < 0) {
return -1;
}
- received_id = be32_to_cpu(received_id);
+ info->context_id = be32_to_cpu(info->context_id);
- reply.length -= sizeof(received_id);
+ reply.length -= sizeof(info->context_id);
name = g_malloc(reply.length + 1);
if (nbd_read(ioc, name, reply.length, errp) < 0) {
g_free(name);
@@ -715,7 +720,7 @@ static int nbd_negotiate_simple_meta_context(QIOChannel *ioc,
}
g_free(name);
- trace_nbd_opt_meta_reply(context, received_id);
+ trace_nbd_opt_meta_reply(context, info->context_id);
received = true;
/* receive NBD_REP_ACK */
@@ -744,12 +749,7 @@ static int nbd_negotiate_simple_meta_context(QIOChannel *ioc,
return -1;
}
- if (received) {
- *context_id = received_id;
- return 1;
- }
-
- return 0;
+ return received;
}
int nbd_receive_negotiate(QIOChannel *ioc, QCryptoTLSCreds *tlscreds,
@@ -848,10 +848,7 @@ int nbd_receive_negotiate(QIOChannel *ioc, QCryptoTLSCreds *tlscreds,
}
if (info->structured_reply && base_allocation) {
- result = nbd_negotiate_simple_meta_context(
- ioc, info->name,
- info->x_dirty_bitmap ?: "base:allocation",
- &info->meta_base_allocation_id, errp);
+ result = nbd_negotiate_simple_meta_context(ioc, info, errp);
if (result < 0) {
goto fail;
}
--
2.20.1
next prev parent reply other threads:[~2019-01-17 19:38 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-17 19:36 [Qemu-devel] [PATCH v4 00/21] nbd: add qemu-nbd --list Eric Blake
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 01/21] iotests: Make 233 output more reliable Eric Blake
2019-01-18 8:28 ` Vladimir Sementsov-Ogievskiy
2019-01-18 10:04 ` Daniel P. Berrangé
2019-01-18 10:02 ` Daniel P. Berrangé
2019-01-18 15:56 ` Eric Blake
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 02/21] maint: Allow for EXAMPLES in texi2pod Eric Blake
2019-01-18 12:41 ` Vladimir Sementsov-Ogievskiy
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 03/21] qemu-nbd: Enhance man page Eric Blake
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 04/21] qemu-nbd: Sanity check partition bounds Eric Blake
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 05/21] nbd/server: Hoist length check to qmp_nbd_server_add Eric Blake
2019-01-18 9:48 ` Vladimir Sementsov-Ogievskiy
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 06/21] nbd/server: Favor [u]int64_t over off_t Eric Blake
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 07/21] qemu-nbd: Avoid strtol open-coding Eric Blake
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 08/21] nbd/client: Refactor nbd_receive_list() Eric Blake
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 09/21] nbd/client: Move export name into NBDExportInfo Eric Blake
2019-01-17 19:36 ` Eric Blake [this message]
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 11/21] nbd/client: Split out nbd_send_meta_query() Eric Blake
2019-01-18 9:59 ` Vladimir Sementsov-Ogievskiy
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 12/21] nbd/client: Split out nbd_receive_one_meta_context() Eric Blake
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 13/21] nbd/client: Refactor return of nbd_receive_negotiate() Eric Blake
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 14/21] nbd/client: Split handshake into two functions Eric Blake
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 15/21] nbd/client: Pull out oldstyle size determination Eric Blake
2019-01-18 10:04 ` Vladimir Sementsov-Ogievskiy
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 16/21] nbd/client: Refactor nbd_opt_go() to support NBD_OPT_INFO Eric Blake
2019-01-18 11:54 ` Vladimir Sementsov-Ogievskiy
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 17/21] nbd/client: Add nbd_receive_export_list() Eric Blake
2019-01-18 12:07 ` Vladimir Sementsov-Ogievskiy
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 18/21] nbd/client: Add meta contexts to nbd_receive_export_list() Eric Blake
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 19/21] qemu-nbd: Add --list option Eric Blake
2019-01-18 12:28 ` Vladimir Sementsov-Ogievskiy
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 20/21] nbd/client: Work around 3.0 bug for listing meta contexts Eric Blake
2019-01-17 19:36 ` [Qemu-devel] [PATCH v4 21/21] iotests: Enhance 223, 233 to cover 'qemu-nbd --list' Eric Blake
2019-01-18 8:15 ` [Qemu-devel] [PATCH v4 00/21] nbd: add qemu-nbd --list Vladimir Sementsov-Ogievskiy
2019-01-18 13:47 ` Vladimir Sementsov-Ogievskiy
2019-01-18 16:06 ` Eric Blake
2019-01-18 22:47 ` Eric Blake
2019-01-19 8:07 ` Richard W.M. Jones
2019-01-19 11:39 ` Richard W.M. Jones
2019-01-20 17:42 ` Richard W.M. Jones
2019-01-18 16:08 ` Eric Blake
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=20190117193658.16413-11-eblake@redhat.com \
--to=eblake@redhat.com \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=nsoffer@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=rjones@redhat.com \
--cc=vsementsov@virtuozzo.com \
/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).