Blame SOURCES/kvm-nbd-generalize-usage-of-nbd_read.patch

7711c0
From 3523bdc1d6abb74fdc0a572c9fecd7f2633ec4b9 Mon Sep 17 00:00:00 2001
7711c0
From: John Snow <jsnow@redhat.com>
7711c0
Date: Wed, 27 Mar 2019 17:22:57 +0100
7711c0
Subject: [PATCH 119/163] nbd: generalize usage of nbd_read
7711c0
7711c0
RH-Author: John Snow <jsnow@redhat.com>
7711c0
Message-id: <20190327172308.31077-45-jsnow@redhat.com>
7711c0
Patchwork-id: 85205
7711c0
O-Subject: [RHEL-7.7 qemu-kvm-rhev PATCH 44/55] nbd: generalize usage of nbd_read
7711c0
Bugzilla: 1691009
7711c0
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
7711c0
RH-Acked-by: Max Reitz <mreitz@redhat.com>
7711c0
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
7711c0
7711c0
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
7711c0
7711c0
We generally do very similar things around nbd_read: error_prepend
7711c0
specifying what we have tried to read, and be_to_cpu conversion of
7711c0
integers.
7711c0
7711c0
So, it seems reasonable to move common things to helper functions,
7711c0
which:
7711c0
1. simplify code a bit
7711c0
2. generalize nbd_read error descriptions, all starting with
7711c0
   "Failed to read"
7711c0
3. make it more difficult to forget to convert things from BE
7711c0
7711c0
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
7711c0
Reviewed-by: Eric Blake <eblake@redhat.com>
7711c0
Message-Id: <20190128165830.165170-1-vsementsov@virtuozzo.com>
7711c0
[eblake: rename macro to DEF_NBD_READ_N and formatting tweaks;
7711c0
checkpatch has false positive complaint]
7711c0
Signed-off-by: Eric Blake <eblake@redhat.com>
7711c0
(cherry picked from commit e6798f06a67a25def45a6636259de38cc38f1414)
7711c0
Signed-off-by: John Snow <jsnow@redhat.com>
7711c0
7711c0
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
7711c0
---
7711c0
 block/nbd-client.c  |  5 ++-
7711c0
 include/block/nbd.h | 32 +++++++++++++++++--
7711c0
 nbd/client.c        | 88 ++++++++++++++++++-----------------------------------
7711c0
 nbd/common.c        |  2 +-
7711c0
 nbd/server.c        | 27 ++++++----------
7711c0
 5 files changed, 71 insertions(+), 83 deletions(-)
7711c0
7711c0
diff --git a/block/nbd-client.c b/block/nbd-client.c
7711c0
index 8135396..5c97052 100644
7711c0
--- a/block/nbd-client.c
7711c0
+++ b/block/nbd-client.c
7711c0
@@ -337,10 +337,9 @@ static int nbd_co_receive_offset_data_payload(NBDClientSession *s,
7711c0
         return -EINVAL;
7711c0
     }
7711c0
 
7711c0
-    if (nbd_read(s->ioc, &offset, sizeof(offset), errp) < 0) {
7711c0
+    if (nbd_read64(s->ioc, &offset, "OFFSET_DATA offset", errp) < 0) {
7711c0
         return -EIO;
7711c0
     }
7711c0
-    be64_to_cpus(&offset);
7711c0
 
7711c0
     data_size = chunk->length - sizeof(offset);
7711c0
     assert(data_size);
7711c0
@@ -387,7 +386,7 @@ static coroutine_fn int nbd_co_receive_structured_payload(
7711c0
     }
7711c0
 
7711c0
     *payload = g_new(char, len);
7711c0
-    ret = nbd_read(s->ioc, *payload, len, errp);
7711c0
+    ret = nbd_read(s->ioc, *payload, len, "structured payload", errp);
7711c0
     if (ret < 0) {
7711c0
         g_free(*payload);
7711c0
         *payload = NULL;
7711c0
diff --git a/include/block/nbd.h b/include/block/nbd.h
7711c0
index 4faf394..96cfb1d 100644
7711c0
--- a/include/block/nbd.h
7711c0
+++ b/include/block/nbd.h
7711c0
@@ -23,6 +23,7 @@
7711c0
 #include "qapi/qapi-types-block.h"
7711c0
 #include "io/channel-socket.h"
7711c0
 #include "crypto/tlscreds.h"
7711c0
+#include "qapi/error.h"
7711c0
 
7711c0
 /* Handshake phase structs - this struct is passed on the wire */
7711c0
 
7711c0
@@ -336,11 +337,38 @@ void nbd_server_start(SocketAddress *addr, const char *tls_creds,
7711c0
  * Reads @size bytes from @ioc. Returns 0 on success.
7711c0
  */
7711c0
 static inline int nbd_read(QIOChannel *ioc, void *buffer, size_t size,
7711c0
-                           Error **errp)
7711c0
+                           const char *desc, Error **errp)
7711c0
 {
7711c0
-    return qio_channel_read_all(ioc, buffer, size, errp) < 0 ? -EIO : 0;
7711c0
+    int ret = qio_channel_read_all(ioc, buffer, size, errp) < 0 ? -EIO : 0;
7711c0
+
7711c0
+    if (ret < 0) {
7711c0
+        if (desc) {
7711c0
+            error_prepend(errp, "Failed to read %s: ", desc);
7711c0
+        }
7711c0
+        return -1;
7711c0
+    }
7711c0
+
7711c0
+    return 0;
7711c0
+}
7711c0
+
7711c0
+#define DEF_NBD_READ_N(bits)                                            \
7711c0
+static inline int nbd_read##bits(QIOChannel *ioc,                       \
7711c0
+                                 uint##bits##_t *val,                   \
7711c0
+                                 const char *desc, Error **errp)        \
7711c0
+{                                                                       \
7711c0
+    if (nbd_read(ioc, val, sizeof(*val), desc, errp) < 0) {             \
7711c0
+        return -1;                                                      \
7711c0
+    }                                                                   \
7711c0
+    *val = be##bits##_to_cpu(*val);                                     \
7711c0
+    return 0;                                                           \
7711c0
 }
7711c0
 
7711c0
+DEF_NBD_READ_N(16) /* Defines nbd_read16(). */
7711c0
+DEF_NBD_READ_N(32) /* Defines nbd_read32(). */
7711c0
+DEF_NBD_READ_N(64) /* Defines nbd_read64(). */
7711c0
+
7711c0
+#undef DEF_NBD_READ_N
7711c0
+
7711c0
 static inline bool nbd_reply_is_simple(NBDReply *reply)
7711c0
 {
7711c0
     return reply->magic == NBD_SIMPLE_REPLY_MAGIC;
7711c0
diff --git a/nbd/client.c b/nbd/client.c
7711c0
index 8a083c2..10a52ad 100644
7711c0
--- a/nbd/client.c
7711c0
+++ b/nbd/client.c
7711c0
@@ -113,8 +113,7 @@ static int nbd_receive_option_reply(QIOChannel *ioc, uint32_t opt,
7711c0
                                     NBDOptionReply *reply, Error **errp)
7711c0
 {
7711c0
     QEMU_BUILD_BUG_ON(sizeof(*reply) != 20);
7711c0
-    if (nbd_read(ioc, reply, sizeof(*reply), errp) < 0) {
7711c0
-        error_prepend(errp, "failed to read option reply: ");
7711c0
+    if (nbd_read(ioc, reply, sizeof(*reply), "option reply", errp) < 0) {
7711c0
         nbd_send_opt_abort(ioc);
7711c0
         return -1;
7711c0
     }
7711c0
@@ -166,8 +165,8 @@ static int nbd_handle_reply_err(QIOChannel *ioc, NBDOptionReply *reply,
7711c0
             goto cleanup;
7711c0
         }
7711c0
         msg = g_malloc(reply->length + 1);
7711c0
-        if (nbd_read(ioc, msg, reply->length, errp) < 0) {
7711c0
-            error_prepend(errp, "failed to read option error %" PRIu32
7711c0
+        if (nbd_read(ioc, msg, reply->length, NULL, errp) < 0) {
7711c0
+            error_prepend(errp, "Failed to read option error %" PRIu32
7711c0
                           " (%s) message: ",
7711c0
                           reply->type, nbd_rep_lookup(reply->type));
7711c0
             goto cleanup;
7711c0
@@ -284,12 +283,10 @@ static int nbd_receive_list(QIOChannel *ioc, char **name, char **description,
7711c0
         nbd_send_opt_abort(ioc);
7711c0
         return -1;
7711c0
     }
7711c0
-    if (nbd_read(ioc, &namelen, sizeof(namelen), errp) < 0) {
7711c0
-        error_prepend(errp, "failed to read option name length: ");
7711c0
+    if (nbd_read32(ioc, &namelen, "option name length", errp) < 0) {
7711c0
         nbd_send_opt_abort(ioc);
7711c0
         return -1;
7711c0
     }
7711c0
-    namelen = be32_to_cpu(namelen);
7711c0
     len -= sizeof(namelen);
7711c0
     if (len < namelen) {
7711c0
         error_setg(errp, "incorrect option name length");
7711c0
@@ -298,8 +295,7 @@ static int nbd_receive_list(QIOChannel *ioc, char **name, char **description,
7711c0
     }
7711c0
 
7711c0
     local_name = g_malloc(namelen + 1);
7711c0
-    if (nbd_read(ioc, local_name, namelen, errp) < 0) {
7711c0
-        error_prepend(errp, "failed to read export name: ");
7711c0
+    if (nbd_read(ioc, local_name, namelen, "export name", errp) < 0) {
7711c0
         nbd_send_opt_abort(ioc);
7711c0
         goto out;
7711c0
     }
7711c0
@@ -307,8 +303,7 @@ static int nbd_receive_list(QIOChannel *ioc, char **name, char **description,
7711c0
     len -= namelen;
7711c0
     if (len) {
7711c0
         local_desc = g_malloc(len + 1);
7711c0
-        if (nbd_read(ioc, local_desc, len, errp) < 0) {
7711c0
-            error_prepend(errp, "failed to read export description: ");
7711c0
+        if (nbd_read(ioc, local_desc, len, "export description", errp) < 0) {
7711c0
             nbd_send_opt_abort(ioc);
7711c0
             goto out;
7711c0
         }
7711c0
@@ -410,13 +405,11 @@ static int nbd_opt_info_or_go(QIOChannel *ioc, uint32_t opt,
7711c0
             nbd_send_opt_abort(ioc);
7711c0
             return -1;
7711c0
         }
7711c0
-        if (nbd_read(ioc, &type, sizeof(type), errp) < 0) {
7711c0
-            error_prepend(errp, "failed to read info type: ");
7711c0
+        if (nbd_read16(ioc, &type, "info type", errp) < 0) {
7711c0
             nbd_send_opt_abort(ioc);
7711c0
             return -1;
7711c0
         }
7711c0
         len -= sizeof(type);
7711c0
-        type = be16_to_cpu(type);
7711c0
         switch (type) {
7711c0
         case NBD_INFO_EXPORT:
7711c0
             if (len != sizeof(info->size) + sizeof(info->flags)) {
7711c0
@@ -425,18 +418,14 @@ static int nbd_opt_info_or_go(QIOChannel *ioc, uint32_t opt,
7711c0
                 nbd_send_opt_abort(ioc);
7711c0
                 return -1;
7711c0
             }
7711c0
-            if (nbd_read(ioc, &info->size, sizeof(info->size), errp) < 0) {
7711c0
-                error_prepend(errp, "failed to read info size: ");
7711c0
+            if (nbd_read64(ioc, &info->size, "info size", errp) < 0) {
7711c0
                 nbd_send_opt_abort(ioc);
7711c0
                 return -1;
7711c0
             }
7711c0
-            info->size = be64_to_cpu(info->size);
7711c0
-            if (nbd_read(ioc, &info->flags, sizeof(info->flags), errp) < 0) {
7711c0
-                error_prepend(errp, "failed to read info flags: ");
7711c0
+            if (nbd_read16(ioc, &info->flags, "info flags", errp) < 0) {
7711c0
                 nbd_send_opt_abort(ioc);
7711c0
                 return -1;
7711c0
             }
7711c0
-            info->flags = be16_to_cpu(info->flags);
7711c0
             trace_nbd_receive_negotiate_size_flags(info->size, info->flags);
7711c0
             break;
7711c0
 
7711c0
@@ -447,27 +436,23 @@ static int nbd_opt_info_or_go(QIOChannel *ioc, uint32_t opt,
7711c0
                 nbd_send_opt_abort(ioc);
7711c0
                 return -1;
7711c0
             }
7711c0
-            if (nbd_read(ioc, &info->min_block, sizeof(info->min_block),
7711c0
-                         errp) < 0) {
7711c0
-                error_prepend(errp, "failed to read info minimum block size: ");
7711c0
+            if (nbd_read32(ioc, &info->min_block, "info minimum block size",
7711c0
+                           errp) < 0) {
7711c0
                 nbd_send_opt_abort(ioc);
7711c0
                 return -1;
7711c0
             }
7711c0
-            info->min_block = be32_to_cpu(info->min_block);
7711c0
             if (!is_power_of_2(info->min_block)) {
7711c0
                 error_setg(errp, "server minimum block size %" PRIu32
7711c0
                            " is not a power of two", info->min_block);
7711c0
                 nbd_send_opt_abort(ioc);
7711c0
                 return -1;
7711c0
             }
7711c0
-            if (nbd_read(ioc, &info->opt_block, sizeof(info->opt_block),
7711c0
-                         errp) < 0) {
7711c0
-                error_prepend(errp,
7711c0
-                              "failed to read info preferred block size: ");
7711c0
+            if (nbd_read32(ioc, &info->opt_block, "info preferred block size",
7711c0
+                           errp) < 0)
7711c0
+            {
7711c0
                 nbd_send_opt_abort(ioc);
7711c0
                 return -1;
7711c0
             }
7711c0
-            info->opt_block = be32_to_cpu(info->opt_block);
7711c0
             if (!is_power_of_2(info->opt_block) ||
7711c0
                 info->opt_block < info->min_block) {
7711c0
                 error_setg(errp, "server preferred block size %" PRIu32
7711c0
@@ -475,13 +460,12 @@ static int nbd_opt_info_or_go(QIOChannel *ioc, uint32_t opt,
7711c0
                 nbd_send_opt_abort(ioc);
7711c0
                 return -1;
7711c0
             }
7711c0
-            if (nbd_read(ioc, &info->max_block, sizeof(info->max_block),
7711c0
-                         errp) < 0) {
7711c0
-                error_prepend(errp, "failed to read info maximum block size: ");
7711c0
+            if (nbd_read32(ioc, &info->max_block, "info maximum block size",
7711c0
+                           errp) < 0)
7711c0
+            {
7711c0
                 nbd_send_opt_abort(ioc);
7711c0
                 return -1;
7711c0
             }
7711c0
-            info->max_block = be32_to_cpu(info->max_block);
7711c0
             if (info->max_block < info->min_block) {
7711c0
                 error_setg(errp, "server maximum block size %" PRIu32
7711c0
                            " is not valid", info->max_block);
7711c0
@@ -731,14 +715,13 @@ static int nbd_receive_one_meta_context(QIOChannel *ioc,
7711c0
         return -1;
7711c0
     }
7711c0
 
7711c0
-    if (nbd_read(ioc, &local_id, sizeof(local_id), errp) < 0) {
7711c0
+    if (nbd_read32(ioc, &local_id, "context id", errp) < 0) {
7711c0
         return -1;
7711c0
     }
7711c0
-    local_id = be32_to_cpu(local_id);
7711c0
 
7711c0
     reply.length -= sizeof(local_id);
7711c0
     local_name = g_malloc(reply.length + 1);
7711c0
-    if (nbd_read(ioc, local_name, reply.length, errp) < 0) {
7711c0
+    if (nbd_read(ioc, local_name, reply.length, "context name", errp) < 0) {
7711c0
         g_free(local_name);
7711c0
         return -1;
7711c0
     }
7711c0
@@ -896,11 +879,9 @@ static int nbd_start_negotiate(QIOChannel *ioc, QCryptoTLSCreds *tlscreds,
7711c0
         return -EINVAL;
7711c0
     }
7711c0
 
7711c0
-    if (nbd_read(ioc, &magic, sizeof(magic), errp) < 0) {
7711c0
-        error_prepend(errp, "Failed to read initial magic: ");
7711c0
+    if (nbd_read64(ioc, &magic, "initial magic", errp) < 0) {
7711c0
         return -EINVAL;
7711c0
     }
7711c0
-    magic = be64_to_cpu(magic);
7711c0
     trace_nbd_receive_negotiate_magic(magic);
7711c0
 
7711c0
     if (magic != NBD_INIT_MAGIC) {
7711c0
@@ -908,11 +889,9 @@ static int nbd_start_negotiate(QIOChannel *ioc, QCryptoTLSCreds *tlscreds,
7711c0
         return -EINVAL;
7711c0
     }
7711c0
 
7711c0
-    if (nbd_read(ioc, &magic, sizeof(magic), errp) < 0) {
7711c0
-        error_prepend(errp, "Failed to read server magic: ");
7711c0
+    if (nbd_read64(ioc, &magic, "server magic", errp) < 0) {
7711c0
         return -EINVAL;
7711c0
     }
7711c0
-    magic = be64_to_cpu(magic);
7711c0
     trace_nbd_receive_negotiate_magic(magic);
7711c0
 
7711c0
     if (magic == NBD_OPTS_MAGIC) {
7711c0
@@ -920,11 +899,9 @@ static int nbd_start_negotiate(QIOChannel *ioc, QCryptoTLSCreds *tlscreds,
7711c0
         uint16_t globalflags;
7711c0
         bool fixedNewStyle = false;
7711c0
 
7711c0
-        if (nbd_read(ioc, &globalflags, sizeof(globalflags), errp) < 0) {
7711c0
-            error_prepend(errp, "Failed to read server flags: ");
7711c0
+        if (nbd_read16(ioc, &globalflags, "server flags", errp) < 0) {
7711c0
             return -EINVAL;
7711c0
         }
7711c0
-        globalflags = be16_to_cpu(globalflags);
7711c0
         trace_nbd_receive_negotiate_server_flags(globalflags);
7711c0
         if (globalflags & NBD_FLAG_FIXED_NEWSTYLE) {
7711c0
             fixedNewStyle = true;
7711c0
@@ -992,17 +969,13 @@ static int nbd_negotiate_finish_oldstyle(QIOChannel *ioc, NBDExportInfo *info,
7711c0
 {
7711c0
     uint32_t oldflags;
7711c0
 
7711c0
-    if (nbd_read(ioc, &info->size, sizeof(info->size), errp) < 0) {
7711c0
-        error_prepend(errp, "Failed to read export length: ");
7711c0
+    if (nbd_read64(ioc, &info->size, "export length", errp) < 0) {
7711c0
         return -EINVAL;
7711c0
     }
7711c0
-    info->size = be64_to_cpu(info->size);
7711c0
 
7711c0
-    if (nbd_read(ioc, &oldflags, sizeof(oldflags), errp) < 0) {
7711c0
-        error_prepend(errp, "Failed to read export flags: ");
7711c0
+    if (nbd_read32(ioc, &oldflags, "export flags", errp) < 0) {
7711c0
         return -EINVAL;
7711c0
     }
7711c0
-    oldflags = be32_to_cpu(oldflags);
7711c0
     if (oldflags & ~0xffff) {
7711c0
         error_setg(errp, "Unexpected export flags %0x" PRIx32, oldflags);
7711c0
         return -EINVAL;
7711c0
@@ -1079,17 +1052,13 @@ int nbd_receive_negotiate(QIOChannel *ioc, QCryptoTLSCreds *tlscreds,
7711c0
         }
7711c0
 
7711c0
         /* Read the response */
7711c0
-        if (nbd_read(ioc, &info->size, sizeof(info->size), errp) < 0) {
7711c0
-            error_prepend(errp, "Failed to read export length: ");
7711c0
+        if (nbd_read64(ioc, &info->size, "export length", errp) < 0) {
7711c0
             return -EINVAL;
7711c0
         }
7711c0
-        info->size = be64_to_cpu(info->size);
7711c0
 
7711c0
-        if (nbd_read(ioc, &info->flags, sizeof(info->flags), errp) < 0) {
7711c0
-            error_prepend(errp, "Failed to read export flags: ");
7711c0
+        if (nbd_read16(ioc, &info->flags, "export flags", errp) < 0) {
7711c0
             return -EINVAL;
7711c0
         }
7711c0
-        info->flags = be16_to_cpu(info->flags);
7711c0
         break;
7711c0
     case 0: /* oldstyle, parse length and flags */
7711c0
         if (*info->name) {
7711c0
@@ -1379,7 +1348,7 @@ static int nbd_receive_simple_reply(QIOChannel *ioc, NBDSimpleReply *reply,
7711c0
     assert(reply->magic == NBD_SIMPLE_REPLY_MAGIC);
7711c0
 
7711c0
     ret = nbd_read(ioc, (uint8_t *)reply + sizeof(reply->magic),
7711c0
-                   sizeof(*reply) - sizeof(reply->magic), errp);
7711c0
+                   sizeof(*reply) - sizeof(reply->magic), "reply", errp);
7711c0
     if (ret < 0) {
7711c0
         return ret;
7711c0
     }
7711c0
@@ -1404,7 +1373,8 @@ static int nbd_receive_structured_reply_chunk(QIOChannel *ioc,
7711c0
     assert(chunk->magic == NBD_STRUCTURED_REPLY_MAGIC);
7711c0
 
7711c0
     ret = nbd_read(ioc, (uint8_t *)chunk + sizeof(chunk->magic),
7711c0
-                   sizeof(*chunk) - sizeof(chunk->magic), errp);
7711c0
+                   sizeof(*chunk) - sizeof(chunk->magic), "structured chunk",
7711c0
+                   errp);
7711c0
     if (ret < 0) {
7711c0
         return ret;
7711c0
     }
7711c0
diff --git a/nbd/common.c b/nbd/common.c
7711c0
index 41f5ed8..cc8b278 100644
7711c0
--- a/nbd/common.c
7711c0
+++ b/nbd/common.c
7711c0
@@ -31,7 +31,7 @@ int nbd_drop(QIOChannel *ioc, size_t size, Error **errp)
7711c0
     buffer = sizeof(small) >= size ? small : g_malloc(MIN(65536, size));
7711c0
     while (size > 0) {
7711c0
         ssize_t count = MIN(65536, size);
7711c0
-        ret = nbd_read(ioc, buffer, MIN(65536, size), errp);
7711c0
+        ret = nbd_read(ioc, buffer, MIN(65536, size), NULL, errp);
7711c0
 
7711c0
         if (ret < 0) {
7711c0
             goto cleanup;
7711c0
diff --git a/nbd/server.c b/nbd/server.c
7711c0
index cb0d563..838c150 100644
7711c0
--- a/nbd/server.c
7711c0
+++ b/nbd/server.c
7711c0
@@ -438,8 +438,7 @@ static int nbd_negotiate_handle_export_name(NBDClient *client,
7711c0
         error_setg(errp, "Bad length received");
7711c0
         return -EINVAL;
7711c0
     }
7711c0
-    if (nbd_read(client->ioc, name, client->optlen, errp) < 0) {
7711c0
-        error_prepend(errp, "read failed: ");
7711c0
+    if (nbd_read(client->ioc, name, client->optlen, "export name", errp) < 0) {
7711c0
         return -EIO;
7711c0
     }
7711c0
     name[client->optlen] = '\0';
7711c0
@@ -1046,11 +1045,9 @@ static int nbd_negotiate_options(NBDClient *client, uint16_t myflags,
7711c0
         ...           Rest of request
7711c0
     */
7711c0
 
7711c0
-    if (nbd_read(client->ioc, &flags, sizeof(flags), errp) < 0) {
7711c0
-        error_prepend(errp, "read failed: ");
7711c0
+    if (nbd_read32(client->ioc, &flags, "flags", errp) < 0) {
7711c0
         return -EIO;
7711c0
     }
7711c0
-    flags = be32_to_cpu(flags);
7711c0
     trace_nbd_negotiate_options_flags(flags);
7711c0
     if (flags & NBD_FLAG_C_FIXED_NEWSTYLE) {
7711c0
         fixedNewstyle = true;
7711c0
@@ -1070,30 +1067,23 @@ static int nbd_negotiate_options(NBDClient *client, uint16_t myflags,
7711c0
         uint32_t option, length;
7711c0
         uint64_t magic;
7711c0
 
7711c0
-        if (nbd_read(client->ioc, &magic, sizeof(magic), errp) < 0) {
7711c0
-            error_prepend(errp, "read failed: ");
7711c0
+        if (nbd_read64(client->ioc, &magic, "opts magic", errp) < 0) {
7711c0
             return -EINVAL;
7711c0
         }
7711c0
-        magic = be64_to_cpu(magic);
7711c0
         trace_nbd_negotiate_options_check_magic(magic);
7711c0
         if (magic != NBD_OPTS_MAGIC) {
7711c0
             error_setg(errp, "Bad magic received");
7711c0
             return -EINVAL;
7711c0
         }
7711c0
 
7711c0
-        if (nbd_read(client->ioc, &option,
7711c0
-                     sizeof(option), errp) < 0) {
7711c0
-            error_prepend(errp, "read failed: ");
7711c0
+        if (nbd_read32(client->ioc, &option, "option", errp) < 0) {
7711c0
             return -EINVAL;
7711c0
         }
7711c0
-        option = be32_to_cpu(option);
7711c0
         client->opt = option;
7711c0
 
7711c0
-        if (nbd_read(client->ioc, &length, sizeof(length), errp) < 0) {
7711c0
-            error_prepend(errp, "read failed: ");
7711c0
+        if (nbd_read32(client->ioc, &length, "option length", errp) < 0) {
7711c0
             return -EINVAL;
7711c0
         }
7711c0
-        length = be32_to_cpu(length);
7711c0
         assert(!client->optlen);
7711c0
         client->optlen = length;
7711c0
 
7711c0
@@ -1306,7 +1296,7 @@ static int nbd_receive_request(QIOChannel *ioc, NBDRequest *request,
7711c0
     uint32_t magic;
7711c0
     int ret;
7711c0
 
7711c0
-    ret = nbd_read(ioc, buf, sizeof(buf), errp);
7711c0
+    ret = nbd_read(ioc, buf, sizeof(buf), "request", errp);
7711c0
     if (ret < 0) {
7711c0
         return ret;
7711c0
     }
7711c0
@@ -2111,8 +2101,9 @@ static int nbd_co_receive_request(NBDRequestData *req, NBDRequest *request,
7711c0
         }
7711c0
     }
7711c0
     if (request->type == NBD_CMD_WRITE) {
7711c0
-        if (nbd_read(client->ioc, req->data, request->len, errp) < 0) {
7711c0
-            error_prepend(errp, "reading from socket failed: ");
7711c0
+        if (nbd_read(client->ioc, req->data, request->len, "CMD_WRITE data",
7711c0
+                     errp) < 0)
7711c0
+        {
7711c0
             return -EIO;
7711c0
         }
7711c0
         req->complete = true;
7711c0
-- 
7711c0
1.8.3.1
7711c0