qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 3/4] nbd: make client_close synchronous


From: Eric Blake
Subject: Re: [PATCH 3/4] nbd: make client_close synchronous
Date: Thu, 25 Jun 2020 09:48:04 -0500
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.9.0

On 6/25/20 9:25 AM, Vladimir Sementsov-Ogievskiy wrote:
client_close doesn't guarantee that client is closed: nbd_trip() keeps
reference to it. Let's wait for nbd_trip to finish.

Without this fix, the following crash is possible:

- export bitmap through unternal Qemu NBD server

internal

- connect a client
- shutdown Qemu

On shutdown nbd_export_close_all is called, but it actually don't wait
for nbd_trip() to finish and to release its references. So, export is
not release, and exported bitmap remains busy, and on try to remove the
bitmap (which is part of bdrv_close()) the assertion fairs:

fails


bdrv_release_dirty_bitmap_locked: Assertion `!bdrv_dirty_bitmap_busy(bitmap)' 
failed

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
  nbd/server.c | 3 +++
  1 file changed, 3 insertions(+)

diff --git a/nbd/server.c b/nbd/server.c
index 20754e9ebc..5e27a8d31a 100644
--- a/nbd/server.c
+++ b/nbd/server.c
@@ -1419,6 +1419,8 @@ static void client_close(NBDClient *client, bool 
negotiated)
      qio_channel_shutdown(client->ioc, QIO_CHANNEL_SHUTDOWN_BOTH,
                           NULL);
+ AIO_WAIT_WHILE(client->exp->ctx, client->recv_coroutine);
+
      /* Also tell the client, so that they release their reference.  */
      if (client->close_fn) {
          client->close_fn(client, negotiated);
@@ -2450,6 +2452,7 @@ static coroutine_fn void nbd_trip(void *opaque)
trace_nbd_trip();
      if (client->closing) {
+        client->recv_coroutine = NULL;
          nbd_client_put(client);
          return;
      }


Reviewed-by: Eric Blake <eblake@redhat.com>

--
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org




reply via email to

[Prev in Thread] Current Thread [Next in Thread]