|
From: | Vladimir Sementsov-Ogievskiy |
Subject: | Re: [Qemu-block] [PATCH 6/9] nbd: BLOCK_STATUS for standard get_block_status function: client part |
Date: | Mon, 12 Mar 2018 12:23:25 +0300 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 |
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 <address@hidden> ---
[...]
+++ 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
[Prev in Thread] | Current Thread | [Next in Thread] |