nbd/server: do not poll within a coroutine context
authorZhu Yangyang <zhuyangyang14@huawei.com>
Mon, 8 Apr 2024 16:00:43 +0000 (11:00 -0500)
committerEric Blake <eblake@redhat.com>
Thu, 25 Apr 2024 12:56:16 +0000 (07:56 -0500)
commitae6d91a7e9b77abb029ed3fa9fad461422286942
tree3d8a72e2602f5d394816ba25152f7ee3c2d89648
parent5da72194df36535d773c8bdc951529ecd5e31707
nbd/server: do not poll within a coroutine context

Coroutines are not supposed to block. Instead, they should yield.

The client performs TLS upgrade outside of an AIOContext, during
synchronous handshake; this still requires g_main_loop.  But the
server responds to TLS upgrade inside a coroutine, so a nested
g_main_loop is wrong.  Since the two callbacks no longer share more
than the setting of data.complete and data.error, it's just as easy to
use static helpers instead of trying to share a common code path.  It
is also possible to add assertions that no other code is interfering
with the eventual path to qio reaching the callback, whether or not it
required a yield or main loop.

Fixes: f95910f ("nbd: implement TLS support in the protocol negotiation")
Signed-off-by: Zhu Yangyang <zhuyangyang14@huawei.com>
[eblake: move callbacks to their use point, add assertions]
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-ID: <20240408160214.1200629-5-eblake@redhat.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
nbd/client.c
nbd/common.c
nbd/nbd-internal.h
nbd/server.c