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