aio_poll doesn't poll the external nodes so this should never be true, but aio_ctx_dispatch may get notified by the events from GSource. To make bdrv_drained_begin effective in main loop, we should check the is_external flag here too.
This could result in a few busy polls because the fd is left unhandled, but the drained section is only transient and shouldn't be longer than one or two event loop iterations. Signed-off-by: Fam Zheng <f...@redhat.com> --- aio-posix.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/aio-posix.c b/aio-posix.c index 7fd565f..a7c9304 100644 --- a/aio-posix.c +++ b/aio-posix.c @@ -323,6 +323,7 @@ bool aio_dispatch(AioContext *ctx) if (!node->deleted && (revents & (G_IO_IN | G_IO_HUP | G_IO_ERR)) && + aio_node_check(ctx, node->is_external) && node->io_read) { node->io_read(node->opaque); @@ -333,6 +334,7 @@ bool aio_dispatch(AioContext *ctx) } if (!node->deleted && (revents & (G_IO_OUT | G_IO_ERR)) && + aio_node_check(ctx, node->is_external) && node->io_write) { node->io_write(node->opaque); progress = true; -- 2.8.0