-nbd: Fix regression with multiple meta contexts Signed-off-by: Pan Nengyuan <pannengyuan@huawei.com>
61 lines
2.6 KiB
Diff
61 lines
2.6 KiB
Diff
From 32c6cb39cbadd6fc2026ff6311fcf58549f71d49 Mon Sep 17 00:00:00 2001
|
|
From: Pan Nengyuan <pannengyuan@huawei.com>
|
|
Date: Wed, 15 Apr 2020 14:29:04 +0800
|
|
Subject: [PATCH] nbd: Fix regression with multiple meta contexts
|
|
|
|
Detected by a hang in the libnbd testsuite. If a client requests
|
|
multiple meta contexts (both base:allocation and qemu:dirty-bitmap:x)
|
|
at the same time, our attempt to silence a false-positive warning
|
|
about a potential uninitialized variable introduced botched logic: we
|
|
were short-circuiting the second context, and never sending the
|
|
NBD_REPLY_FLAG_DONE. Combining two 'if' into one 'if/else' in
|
|
bdf200a55 was wrong (I'm a bit embarrassed that such a change was my
|
|
initial suggestion after the v1 patch, then I did not review the v2
|
|
patch that actually got committed). Revert that, and instead silence
|
|
the false positive warning by replacing 'return ret' with 'return 0'
|
|
(the value it always has at that point in the code, even though it
|
|
eluded the deduction abilities of the robot that reported the false
|
|
positive).
|
|
|
|
Fixes: bdf200a5535
|
|
Signed-off-by: Eric Blake <eblake@redhat.com>
|
|
Message-Id: <20200206173832.130004-1-eblake@redhat.com>
|
|
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
|
|
(cherry picked from commit 73e064ccf09d908febc83761addcc6e76feabf78)
|
|
---
|
|
nbd/server.c | 11 +++++++++--
|
|
1 file changed, 9 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/nbd/server.c b/nbd/server.c
|
|
index aefb07d..3630352 100644
|
|
--- a/nbd/server.c
|
|
+++ b/nbd/server.c
|
|
@@ -2304,15 +2304,22 @@ static coroutine_fn int nbd_handle_request(NBDClient *client,
|
|
!client->export_meta.bitmap,
|
|
NBD_META_ID_BASE_ALLOCATION,
|
|
errp);
|
|
- } else { /* client->export_meta.bitmap */
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
+ }
|
|
+ }
|
|
+ if (client->export_meta.bitmap) {
|
|
ret = nbd_co_send_bitmap(client, request->handle,
|
|
client->exp->export_bitmap,
|
|
request->from, request->len,
|
|
dont_fragment,
|
|
true, NBD_META_ID_DIRTY_BITMAP, errp);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
+ }
|
|
}
|
|
|
|
- return ret;
|
|
+ return 0;
|
|
} else {
|
|
return nbd_send_generic_reply(client, request->handle, -EINVAL,
|
|
"CMD_BLOCK_STATUS not negotiated",
|
|
--
|
|
1.8.3.1
|
|
|