backup-top: Begin drain earlier
authorMax Reitz <mreitz@redhat.com>
Thu, 19 Dec 2019 18:26:38 +0000 (19:26 +0100)
committerMax Reitz <mreitz@redhat.com>
Mon, 6 Jan 2020 13:26:23 +0000 (14:26 +0100)
When dropping backup-top, we need to drain the node before freeing the
BlockCopyState.  Otherwise, requests may still be in flight and then the
assertion in shres_destroy() will fail.

(This becomes visible in intermittent failure of 056.)

Cc: qemu-stable@nongnu.org
Signed-off-by: Max Reitz <mreitz@redhat.com>
Message-id: 20191219182638.104621-1-mreitz@redhat.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
block/backup-top.c

index 7cdb1f8eba1065c04057b4a2137eae13dc8cb19f..818d3f26b48da425ba061e21887fa8cd96baebf5 100644 (file)
@@ -257,12 +257,12 @@ void bdrv_backup_top_drop(BlockDriverState *bs)
     BDRVBackupTopState *s = bs->opaque;
     AioContext *aio_context = bdrv_get_aio_context(bs);
 
-    block_copy_state_free(s->bcs);
-
     aio_context_acquire(aio_context);
 
     bdrv_drained_begin(bs);
 
+    block_copy_state_free(s->bcs);
+
     s->active = false;
     bdrv_child_refresh_perms(bs, bs->backing, &error_abort);
     bdrv_replace_node(bs, backing_bs(bs), &error_abort);