|
|
76daa3 |
From 7d557c2a53a5baa7d566e5d8ffa467dd1bc382db Mon Sep 17 00:00:00 2001
|
|
|
76daa3 |
From: Eric Blake <eblake@redhat.com>
|
|
|
76daa3 |
Date: Wed, 19 Jul 2017 18:02:01 +0200
|
|
|
76daa3 |
Subject: [PATCH 04/17] nbd: make nbd_drop public
|
|
|
76daa3 |
|
|
|
76daa3 |
RH-Author: Eric Blake <eblake@redhat.com>
|
|
|
76daa3 |
Message-id: <20170719180202.23329-4-eblake@redhat.com>
|
|
|
76daa3 |
Patchwork-id: 75814
|
|
|
76daa3 |
O-Subject: [RHEV-7.4.z qemu-kvm-rhev PATCH 3/4] nbd: make nbd_drop public
|
|
|
76daa3 |
Bugzilla: 1473638
|
|
|
76daa3 |
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
|
|
|
76daa3 |
|
|
|
76daa3 |
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
|
|
76daa3 |
|
|
|
76daa3 |
Following commit will reuse it for nbd server too.
|
|
|
76daa3 |
|
|
|
76daa3 |
Reviewed-by: Eric Blake <eblake@redhat.com>
|
|
|
76daa3 |
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
|
|
|
76daa3 |
Message-Id: <20170602150150.258222-3-vsementsov@virtuozzo.com>
|
|
|
76daa3 |
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
76daa3 |
(cherry picked from commit 44298024d30ad36439707b89715a76333f58791b)
|
|
|
76daa3 |
|
|
|
76daa3 |
Conflicts:
|
|
|
76daa3 |
nbd/client.c, nbd/nbd_internal.h, nbd/common.c - missing errp
|
|
|
76daa3 |
addition (e44ed99) and bulk rename (d1fdf25)
|
|
|
76daa3 |
|
|
|
76daa3 |
Signed-off-by: Eric Blake <eblake@redhat.com>
|
|
|
76daa3 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
76daa3 |
---
|
|
|
76daa3 |
nbd/client.c | 32 +++-----------------------------
|
|
|
76daa3 |
nbd/common.c | 26 ++++++++++++++++++++++++++
|
|
|
76daa3 |
nbd/nbd-internal.h | 2 ++
|
|
|
76daa3 |
3 files changed, 31 insertions(+), 29 deletions(-)
|
|
|
76daa3 |
|
|
|
76daa3 |
diff --git a/nbd/client.c b/nbd/client.c
|
|
|
76daa3 |
index 6b74a62..1652f28 100644
|
|
|
76daa3 |
--- a/nbd/client.c
|
|
|
76daa3 |
+++ b/nbd/client.c
|
|
|
76daa3 |
@@ -86,32 +86,6 @@ static QTAILQ_HEAD(, NBDExport) exports = QTAILQ_HEAD_INITIALIZER(exports);
|
|
|
76daa3 |
|
|
|
76daa3 |
*/
|
|
|
76daa3 |
|
|
|
76daa3 |
-/* Discard length bytes from channel. Return -errno on failure and 0 on
|
|
|
76daa3 |
- * success*/
|
|
|
76daa3 |
-static int drop_sync(QIOChannel *ioc, size_t size)
|
|
|
76daa3 |
-{
|
|
|
76daa3 |
- ssize_t ret = 0;
|
|
|
76daa3 |
- char small[1024];
|
|
|
76daa3 |
- char *buffer;
|
|
|
76daa3 |
-
|
|
|
76daa3 |
- buffer = sizeof(small) >= size ? small : g_malloc(MIN(65536, size));
|
|
|
76daa3 |
- while (size > 0) {
|
|
|
76daa3 |
- ssize_t count = MIN(65536, size);
|
|
|
76daa3 |
- ret = read_sync(ioc, buffer, MIN(65536, size));
|
|
|
76daa3 |
-
|
|
|
76daa3 |
- if (ret < 0) {
|
|
|
76daa3 |
- goto cleanup;
|
|
|
76daa3 |
- }
|
|
|
76daa3 |
- size -= count;
|
|
|
76daa3 |
- }
|
|
|
76daa3 |
-
|
|
|
76daa3 |
- cleanup:
|
|
|
76daa3 |
- if (buffer != small) {
|
|
|
76daa3 |
- g_free(buffer);
|
|
|
76daa3 |
- }
|
|
|
76daa3 |
- return ret;
|
|
|
76daa3 |
-}
|
|
|
76daa3 |
-
|
|
|
76daa3 |
/* Send an option request.
|
|
|
76daa3 |
*
|
|
|
76daa3 |
* The request is for option @opt, with @data containing @len bytes of
|
|
|
76daa3 |
@@ -333,7 +307,7 @@ static int nbd_receive_list(QIOChannel *ioc, const char *want, bool *match,
|
|
|
76daa3 |
return -1;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
if (namelen != strlen(want)) {
|
|
|
76daa3 |
- if (drop_sync(ioc, len) < 0) {
|
|
|
76daa3 |
+ if (nbd_drop(ioc, len) < 0) {
|
|
|
76daa3 |
error_setg(errp, "failed to skip export name with wrong length");
|
|
|
76daa3 |
nbd_send_opt_abort(ioc);
|
|
|
76daa3 |
return -1;
|
|
|
76daa3 |
@@ -349,7 +323,7 @@ static int nbd_receive_list(QIOChannel *ioc, const char *want, bool *match,
|
|
|
76daa3 |
}
|
|
|
76daa3 |
name[namelen] = '\0';
|
|
|
76daa3 |
len -= namelen;
|
|
|
76daa3 |
- if (drop_sync(ioc, len) < 0) {
|
|
|
76daa3 |
+ if (nbd_drop(ioc, len) < 0) {
|
|
|
76daa3 |
error_setg(errp, "failed to read export description");
|
|
|
76daa3 |
nbd_send_opt_abort(ioc);
|
|
|
76daa3 |
return -1;
|
|
|
76daa3 |
@@ -616,7 +590,7 @@ int nbd_receive_negotiate(QIOChannel *ioc, const char *name, uint16_t *flags,
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
TRACE("Size is %" PRIu64 ", export flags %" PRIx16, *size, *flags);
|
|
|
76daa3 |
- if (zeroes && drop_sync(ioc, 124) < 0) {
|
|
|
76daa3 |
+ if (zeroes && nbd_drop(ioc, 124) < 0) {
|
|
|
76daa3 |
error_setg(errp, "Failed to read reserved block");
|
|
|
76daa3 |
goto fail;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
diff --git a/nbd/common.c b/nbd/common.c
|
|
|
76daa3 |
index 4db45b3..9a54010 100644
|
|
|
76daa3 |
--- a/nbd/common.c
|
|
|
76daa3 |
+++ b/nbd/common.c
|
|
|
76daa3 |
@@ -71,6 +71,32 @@ ssize_t nbd_wr_syncv(QIOChannel *ioc,
|
|
|
76daa3 |
return done;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
+/* Discard length bytes from channel. Return -errno on failure and 0 on
|
|
|
76daa3 |
+ * success */
|
|
|
76daa3 |
+int nbd_drop(QIOChannel *ioc, size_t size)
|
|
|
76daa3 |
+{
|
|
|
76daa3 |
+ ssize_t ret = 0;
|
|
|
76daa3 |
+ char small[1024];
|
|
|
76daa3 |
+ char *buffer;
|
|
|
76daa3 |
+
|
|
|
76daa3 |
+ buffer = sizeof(small) >= size ? small : g_malloc(MIN(65536, size));
|
|
|
76daa3 |
+ while (size > 0) {
|
|
|
76daa3 |
+ ssize_t count = MIN(65536, size);
|
|
|
76daa3 |
+ ret = read_sync(ioc, buffer, MIN(65536, size));
|
|
|
76daa3 |
+
|
|
|
76daa3 |
+ if (ret < 0) {
|
|
|
76daa3 |
+ goto cleanup;
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
+ size -= count;
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
+
|
|
|
76daa3 |
+ cleanup:
|
|
|
76daa3 |
+ if (buffer != small) {
|
|
|
76daa3 |
+ g_free(buffer);
|
|
|
76daa3 |
+ }
|
|
|
76daa3 |
+ return ret;
|
|
|
76daa3 |
+}
|
|
|
76daa3 |
+
|
|
|
76daa3 |
|
|
|
76daa3 |
void nbd_tls_handshake(QIOTask *task,
|
|
|
76daa3 |
void *opaque)
|
|
|
76daa3 |
diff --git a/nbd/nbd-internal.h b/nbd/nbd-internal.h
|
|
|
76daa3 |
index e6bbc7c..c02378c 100644
|
|
|
76daa3 |
--- a/nbd/nbd-internal.h
|
|
|
76daa3 |
+++ b/nbd/nbd-internal.h
|
|
|
76daa3 |
@@ -149,4 +149,6 @@ struct NBDTLSHandshakeData {
|
|
|
76daa3 |
void nbd_tls_handshake(QIOTask *task,
|
|
|
76daa3 |
void *opaque);
|
|
|
76daa3 |
|
|
|
76daa3 |
+int nbd_drop(QIOChannel *ioc, size_t size);
|
|
|
76daa3 |
+
|
|
|
76daa3 |
#endif
|
|
|
76daa3 |
--
|
|
|
76daa3 |
1.8.3.1
|
|
|
76daa3 |
|