From: Eric Blake <eblake@redhat.com>
To: qemu-devel@nongnu.org
Cc: qemu-block@nongnu.org, pbonzini@redhat.com, mreitz@redhat.com
Subject: [Qemu-devel] [PATCH v6 10/15] nbd: Let client skip portions of server reply
Date: Thu, 13 Oct 2016 15:58:50 -0500 [thread overview]
Message-ID: <1476392335-9256-11-git-send-email-eblake@redhat.com> (raw)
In-Reply-To: <1476392335-9256-1-git-send-email-eblake@redhat.com>
The server has a nice helper function nbd_negotiate_drop_sync()
which lets it easily ignore fluff from the client (such as the
payload to an unknown option request). We can't quite make it
common, since it depends on nbd_negotiate_read() which handles
coroutine magic, but we can copy the idea into the client where
we have places where we want to ignore data (such as the
description tacked on the end of NBD_REP_SERVER).
Signed-off-by: Eric Blake <eblake@redhat.com>
---
v6: rebase
v5: no change
v4: rebase
v3: rebase
---
nbd/client.c | 47 +++++++++++++++++++++++++++++++++--------------
1 file changed, 33 insertions(+), 14 deletions(-)
diff --git a/nbd/client.c b/nbd/client.c
index a3e1e7a..df7eb9c 100644
--- a/nbd/client.c
+++ b/nbd/client.c
@@ -75,6 +75,32 @@ static QTAILQ_HEAD(, NBDExport) exports = QTAILQ_HEAD_INITIALIZER(exports);
*/
+/* Discard length bytes from channel. Return -errno on failure, or
+ * the amount of bytes consumed. */
+static ssize_t drop_sync(QIOChannel *ioc, size_t size)
+{
+ ssize_t ret, dropped = size;
+ char small[1024];
+ char *buffer;
+
+ buffer = sizeof(small) < size ? small : g_malloc(MIN(65536, size));
+ while (size > 0) {
+ ret = read_sync(ioc, buffer, MIN(65536, size));
+ if (ret < 0) {
+ goto cleanup;
+ }
+ assert(ret <= size);
+ size -= ret;
+ }
+ ret = dropped;
+
+ cleanup:
+ if (buffer != small) {
+ g_free(buffer);
+ }
+ return ret;
+}
+
/* Send an option request.
*
* The request is for option @opt, with @data containing @len bytes of
@@ -285,19 +311,12 @@ static int nbd_receive_list(QIOChannel *ioc, char **name, Error **errp)
}
(*name)[namelen] = '\0';
len -= namelen;
- if (len) {
- char *buf = g_malloc(len + 1);
- if (read_sync(ioc, buf, len) != len) {
- error_setg(errp, "failed to read export description");
- g_free(*name);
- g_free(buf);
- *name = NULL;
- nbd_send_opt_abort(ioc);
- return -1;
- }
- buf[len] = '\0';
- TRACE("Ignoring export description: %s", buf);
- g_free(buf);
+ if (drop_sync(ioc, len) != len) {
+ error_setg(errp, "failed to read export description");
+ g_free(*name);
+ *name = NULL;
+ nbd_send_opt_abort(ioc);
+ return -1;
}
} else {
error_setg(errp, "Unexpected reply type %" PRIx32 " expected %x",
@@ -576,7 +595,7 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char *name, uint16_t *flags,
}
TRACE("Size is %" PRIu64 ", export flags %" PRIx16, *size, *flags);
- if (read_sync(ioc, &buf, 124) != 124) {
+ if (drop_sync(ioc, 124) != 124) {
error_setg(errp, "Failed to read reserved block");
goto fail;
}
--
2.7.4
next prev parent reply other threads:[~2016-10-13 20:59 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-13 20:58 [Qemu-devel] [PATCH v6 00/15] nbd: efficient write zeroes Eric Blake
2016-10-13 20:58 ` [Qemu-devel] [PATCH v6 01/15] nbd: Add qemu-nbd -D for human-readable description Eric Blake
2016-10-13 20:58 ` [Qemu-devel] [PATCH v6 02/15] nbd: Treat flags vs. command type as separate fields Eric Blake
2016-10-13 20:58 ` [Qemu-devel] [PATCH v6 03/15] nbd: Rename NBDRequest to NBDRequestData Eric Blake
2016-10-13 20:58 ` [Qemu-devel] [PATCH v6 04/15] nbd: Rename NbdClientSession to NBDClientSession Eric Blake
2016-10-13 20:58 ` [Qemu-devel] [PATCH v6 05/15] nbd: Rename struct nbd_request and nbd_reply Eric Blake
2016-10-13 20:58 ` [Qemu-devel] [PATCH v6 06/15] nbd: Share common reply-sending code in server Eric Blake
2016-10-13 20:58 ` [Qemu-devel] [PATCH v6 07/15] nbd: Send message along with server NBD_REP_ERR errors Eric Blake
2016-10-13 20:58 ` [Qemu-devel] [PATCH v6 08/15] nbd: Share common option-sending code in client Eric Blake
2016-10-13 20:58 ` [Qemu-devel] [PATCH v6 09/15] nbd: Let server know when client gives up negotiation Eric Blake
2016-10-13 20:58 ` Eric Blake [this message]
2016-10-13 20:58 ` [Qemu-devel] [PATCH v6 11/15] nbd: Less allocation during NBD_OPT_LIST Eric Blake
2016-10-13 20:58 ` [Qemu-devel] [PATCH v6 12/15] nbd: Support shorter handshake Eric Blake
2016-10-13 20:58 ` [Qemu-devel] [PATCH v6 13/15] nbd: Improve server handling of shutdown requests Eric Blake
2016-10-13 20:58 ` [Qemu-devel] [PATCH v6 14/15] nbd: Implement NBD_CMD_WRITE_ZEROES on server Eric Blake
2016-10-13 20:58 ` [Qemu-devel] [PATCH v6 15/15] nbd: Implement NBD_CMD_WRITE_ZEROES on client Eric Blake
2016-10-14 0:00 ` [Qemu-devel] [PATCH v6 00/15] nbd: efficient write zeroes no-reply
2016-10-14 2:06 ` Eric Blake
2016-10-14 4:59 ` no-reply
2016-10-14 14:19 ` 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=1476392335-9256-11-git-send-email-eblake@redhat.com \
--to=eblake@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).