From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
To: qemu-devel@nongnu.org, qemu-block@nongnu.org
Cc: pbonzini@redhat.com, eblake@redhat.com, den@openvz.org,
vsementsov@virtuozzo.com
Subject: [Qemu-devel] [PATCH v2 2/5] nbd/server: fix sparse read
Date: Thu, 8 Mar 2018 21:46:33 +0300 [thread overview]
Message-ID: <20180308184636.178534-3-vsementsov@virtuozzo.com> (raw)
In-Reply-To: <20180308184636.178534-1-vsementsov@virtuozzo.com>
In case of io error in nbd_co_send_sparse_read we should not
"goto reply:", as it is fatal error and common behavior is
disconnect in this case. We should not try to send client an
error reply, representing channel-io error on previous try to
send a reply.
Fix this by handle block-status error in nbd_co_send_sparse_read,
so nbd_co_send_sparse_read fails only on io error. Then just skip
common "reply:" code path in nbd_trip.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
v2: code movement splitted to 01
remove error_report
fix indent
fix commit message subject line
add comment to nbd_co_send_sparse_read (be free to adjust it)
nbd/server.c | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/nbd/server.c b/nbd/server.c
index c406b0656d..e0de431e10 100644
--- a/nbd/server.c
+++ b/nbd/server.c
@@ -1365,6 +1365,10 @@ static int coroutine_fn nbd_co_send_structured_error(NBDClient *client,
return nbd_co_send_iov(client, iov, 1 + !!iov[1].iov_len, errp);
}
+/* Do sparse read and send structured reply to the client.
+ * Returns -errno if sending fails. bdrv_block_status_above() fail is not
+ * considered as an error, but reported to the client instead (as a structured
+ * error). */
static int coroutine_fn nbd_co_send_sparse_read(NBDClient *client,
uint64_t handle,
uint64_t offset,
@@ -1385,8 +1389,13 @@ static int coroutine_fn nbd_co_send_sparse_read(NBDClient *client,
bool final;
if (status < 0) {
- error_setg_errno(errp, -status, "unable to check for holes");
- return status;
+ char *msg = g_strdup_printf("unable to check for holes: %s",
+ strerror(-status));
+
+ ret = nbd_co_send_structured_error(client, handle, -status, msg,
+ errp);
+ g_free(msg);
+ return ret;
}
assert(pnum && pnum <= size - progress);
final = progress + pnum == size;
@@ -1567,7 +1576,7 @@ static coroutine_fn void nbd_trip(void *opaque)
request.from, req->data, request.len,
&local_err);
if (ret < 0) {
- goto reply;
+ goto replied;
}
goto done;
}
@@ -1664,6 +1673,8 @@ reply:
req->data, reply_data_len, &local_err);
}
g_free(msg);
+
+replied:
if (ret < 0) {
error_prepend(&local_err, "Failed to send reply: ");
goto disconnect;
--
2.11.1
next prev parent reply other threads:[~2018-03-08 18:46 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-08 18:46 [Qemu-devel] [PATCH 0/5] nbd server fixing and refactoring before BLOCK_STATUS Vladimir Sementsov-Ogievskiy
2018-03-08 18:46 ` [Qemu-devel] [PATCH 1/5] nbd/server: move nbd_co_send_structured_error up Vladimir Sementsov-Ogievskiy
2018-03-09 16:39 ` Eric Blake
2018-03-08 18:46 ` Vladimir Sementsov-Ogievskiy [this message]
2018-03-09 19:55 ` [Qemu-devel] [PATCH v2 2/5] nbd/server: fix sparse read Eric Blake
2018-03-08 18:46 ` [Qemu-devel] [PATCH 3/5] nbd/server: fix: check client->closing before reply sending Vladimir Sementsov-Ogievskiy
2018-03-09 21:51 ` Eric Blake
2018-03-12 21:51 ` Eric Blake
2018-03-08 18:46 ` [Qemu-devel] [PATCH 4/5] nbd/server: refactor nbd_trip: cmd_read and generic reply Vladimir Sementsov-Ogievskiy
2018-03-09 22:21 ` Eric Blake
2018-03-08 18:46 ` [Qemu-devel] [PATCH 5/5] nbd/server: refactor nbd_trip: split out nbd_handle_request Vladimir Sementsov-Ogievskiy
2018-03-09 22:29 ` Eric Blake
2018-03-09 16:41 ` [Qemu-devel] [PATCH 0/5] nbd server fixing and refactoring before BLOCK_STATUS Eric Blake
2018-03-09 16:57 ` Vladimir Sementsov-Ogievskiy
2018-03-09 19:20 ` Eric Blake
2018-03-12 22:31 ` 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=20180308184636.178534-3-vsementsov@virtuozzo.com \
--to=vsementsov@virtuozzo.com \
--cc=den@openvz.org \
--cc=eblake@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).