[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH v7 10/16] nbd: Let client skip portions of server re
From: |
Eric Blake |
Subject: |
[Qemu-block] [PATCH v7 10/16] nbd: Let client skip portions of server reply |
Date: |
Fri, 14 Oct 2016 13:33:12 -0500 |
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 <address@hidden>
---
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
- [Qemu-block] [PATCH v7 00/16] nbd: efficient write zeroes, Eric Blake, 2016/10/14
- [Qemu-block] [PATCH v7 03/16] nbd: Rename NBDRequest to NBDRequestData, Eric Blake, 2016/10/14
- [Qemu-block] [PATCH v7 01/16] nbd: Add qemu-nbd -D for human-readable description, Eric Blake, 2016/10/14
- [Qemu-block] [PATCH v7 02/16] nbd: Treat flags vs. command type as separate fields, Eric Blake, 2016/10/14
- [Qemu-block] [PATCH v7 04/16] nbd: Rename NbdClientSession to NBDClientSession, Eric Blake, 2016/10/14
- [Qemu-block] [PATCH v7 05/16] nbd: Rename struct nbd_request and nbd_reply, Eric Blake, 2016/10/14
- [Qemu-block] [PATCH v7 06/16] nbd: Share common reply-sending code in server, Eric Blake, 2016/10/14
- [Qemu-block] [PATCH v7 10/16] nbd: Let client skip portions of server reply,
Eric Blake <=
- [Qemu-block] [PATCH v7 07/16] nbd: Send message along with server NBD_REP_ERR errors, Eric Blake, 2016/10/14
- [Qemu-block] [PATCH v7 08/16] nbd: Share common option-sending code in client, Eric Blake, 2016/10/14
- [Qemu-block] [PATCH v7 09/16] nbd: Let server know when client gives up negotiation, Eric Blake, 2016/10/14
- [Qemu-block] [PATCH v7 11/16] nbd: Less allocation during NBD_OPT_LIST, Eric Blake, 2016/10/14
- [Qemu-block] [PATCH v7 14/16] nbd: Improve server handling of shutdown requests, Eric Blake, 2016/10/14
- [Qemu-block] [PATCH v7 12/16] nbd: Support shorter handshake, Eric Blake, 2016/10/14
- [Qemu-block] [PATCH v7 16/16] nbd: Implement NBD_CMD_WRITE_ZEROES on client, Eric Blake, 2016/10/14
- [Qemu-block] [PATCH v7 13/16] nbd: Refactor conversion to errno to silence checkpatch, Eric Blake, 2016/10/14
- [Qemu-block] [PATCH v7 15/16] nbd: Implement NBD_CMD_WRITE_ZEROES on server, Eric Blake, 2016/10/14
- Re: [Qemu-block] [Qemu-devel] [PATCH v7 00/16] nbd: efficient write zeroes, Eric Blake, 2016/10/25