|
|
26ba25 |
From 92a9a816dd93a361ad2e0751e503c5e12accf38b Mon Sep 17 00:00:00 2001
|
|
|
26ba25 |
From: Kevin Wolf <kwolf@redhat.com>
|
|
|
26ba25 |
Date: Wed, 10 Oct 2018 20:22:03 +0100
|
|
|
26ba25 |
Subject: [PATCH 37/49] block-backend: Add .drained_poll callback
|
|
|
26ba25 |
|
|
|
26ba25 |
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
|
|
26ba25 |
Message-id: <20181010202213.7372-25-kwolf@redhat.com>
|
|
|
26ba25 |
Patchwork-id: 82614
|
|
|
26ba25 |
O-Subject: [RHEL-8 qemu-kvm PATCH 34/44] block-backend: Add .drained_poll callback
|
|
|
26ba25 |
Bugzilla: 1637976
|
|
|
26ba25 |
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
|
|
26ba25 |
RH-Acked-by: John Snow <jsnow@redhat.com>
|
|
|
26ba25 |
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
|
|
26ba25 |
|
|
|
26ba25 |
A bdrv_drain operation must ensure that all parents are quiesced, this
|
|
|
26ba25 |
includes BlockBackends. Otherwise, callbacks called by requests that are
|
|
|
26ba25 |
completed on the BDS layer, but not quite yet on the BlockBackend layer
|
|
|
26ba25 |
could still create new requests.
|
|
|
26ba25 |
|
|
|
26ba25 |
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
|
26ba25 |
Reviewed-by: Fam Zheng <famz@redhat.com>
|
|
|
26ba25 |
Reviewed-by: Max Reitz <mreitz@redhat.com>
|
|
|
26ba25 |
(cherry picked from commit fe5258a503a87e69be37c9ac48799e293809386e)
|
|
|
26ba25 |
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
|
26ba25 |
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
|
|
26ba25 |
---
|
|
|
26ba25 |
block/block-backend.c | 9 +++++++++
|
|
|
26ba25 |
1 file changed, 9 insertions(+)
|
|
|
26ba25 |
|
|
|
26ba25 |
diff --git a/block/block-backend.c b/block/block-backend.c
|
|
|
26ba25 |
index 3554b7e..dffc6f0 100644
|
|
|
26ba25 |
--- a/block/block-backend.c
|
|
|
26ba25 |
+++ b/block/block-backend.c
|
|
|
26ba25 |
@@ -121,6 +121,7 @@ static void blk_root_inherit_options(int *child_flags, QDict *child_options,
|
|
|
26ba25 |
abort();
|
|
|
26ba25 |
}
|
|
|
26ba25 |
static void blk_root_drained_begin(BdrvChild *child);
|
|
|
26ba25 |
+static bool blk_root_drained_poll(BdrvChild *child);
|
|
|
26ba25 |
static void blk_root_drained_end(BdrvChild *child);
|
|
|
26ba25 |
|
|
|
26ba25 |
static void blk_root_change_media(BdrvChild *child, bool load);
|
|
|
26ba25 |
@@ -294,6 +295,7 @@ static const BdrvChildRole child_root = {
|
|
|
26ba25 |
.get_parent_desc = blk_root_get_parent_desc,
|
|
|
26ba25 |
|
|
|
26ba25 |
.drained_begin = blk_root_drained_begin,
|
|
|
26ba25 |
+ .drained_poll = blk_root_drained_poll,
|
|
|
26ba25 |
.drained_end = blk_root_drained_end,
|
|
|
26ba25 |
|
|
|
26ba25 |
.activate = blk_root_activate,
|
|
|
26ba25 |
@@ -2198,6 +2200,13 @@ static void blk_root_drained_begin(BdrvChild *child)
|
|
|
26ba25 |
}
|
|
|
26ba25 |
}
|
|
|
26ba25 |
|
|
|
26ba25 |
+static bool blk_root_drained_poll(BdrvChild *child)
|
|
|
26ba25 |
+{
|
|
|
26ba25 |
+ BlockBackend *blk = child->opaque;
|
|
|
26ba25 |
+ assert(blk->quiesce_counter);
|
|
|
26ba25 |
+ return !!blk->in_flight;
|
|
|
26ba25 |
+}
|
|
|
26ba25 |
+
|
|
|
26ba25 |
static void blk_root_drained_end(BdrvChild *child)
|
|
|
26ba25 |
{
|
|
|
26ba25 |
BlockBackend *blk = child->opaque;
|
|
|
26ba25 |
--
|
|
|
26ba25 |
1.8.3.1
|
|
|
26ba25 |
|