16.02.2018 23:40, Eric Blake wrote:
On 02/15/2018 07:51 AM, Vladimir Sementsov-Ogievskiy wrote:
Minimal realization: only one extent in server answer is supported.
Flag NBD_CMD_FLAG_REQ_ONE is used to force this behavior.
Tests 140, 147 and 205 are fixed due to now server failed on searching
export in context of NBD_OPT_SET_META_CONTEXT option negotiation.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com>
---
[...]
+++ b/nbd/client.c
@@ -594,6 +594,108 @@ static QIOChannel
*nbd_receive_starttls(QIOChannel *ioc,
return QIO_CHANNEL(tioc);
}
+/* 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.
+ * return 1 for successful negotiation, context_id is set
+ * 0 if operation is unsupported,
+ * -errno with errp set for any other error
+ */
Good enough for our first use. Will obviously need improvements if we
support base:allocation AND dirty bitmap exposure at the same time, in
future patches ;)
+static int nbd_negotiate_simple_meta_context(QIOChannel *ioc,
+ const char *export,
+ const char *context,
+ uint32_t *context_id,
+ Error **errp)
+{
+ int ret;
+ NBDOptionReply reply;
+ uint32_t received_id;
+ bool received;
+ size_t export_len = strlen(export);
+ size_t context_len = strlen(context);
+ size_t data_len = 4 + export_len + 4 + 4 + context_len;
[...]
+
+ if (nbd_read(ioc, &received_id, sizeof(received_id), errp) <
0) {
+ return -EIO;
+ }
+ be32_to_cpus(&received_id);
+
+ len = reply.length - sizeof(received_id);
+ name = g_malloc(len + 1);
+ if (nbd_read(ioc, name, len, errp) < 0) {
+ g_free(name);
+ return -EIO;
+ }
+ name[len] = '\0';
+ if (strcmp(context, name)) {
+ error_setg(errp, "Failed to negotiate meta context '%s',
server "
+ "answered with different context '%s'", context,
+ name);
This check may not be valid for other context namespaces, but is
correct for "base:allocation".
so, it is negotiation of "simple meta context". I'll improve somehow
comment about the functions...
--
Best regards,
Vladimir