[PULL,for-2.11-rc2,1/5] block: all I/O should be completed before removing throttle timers.

Message ID 20171114103721.13869-2-stefanha@redhat.com
State New
Headers show
Series
  • [PULL,for-2.11-rc2,1/5] block: all I/O should be completed before removing throttle timers.
Related show

Commit Message

Stefan Hajnoczi Nov. 14, 2017, 10:37 a.m.
From: Zhengui <lizhengui@huawei.com>

In blk_remove_bs, all I/O should be completed before removing throttle
timers. If there has inflight I/O, removing throttle timers here will
cause the inflight I/O never return.
This patch add bdrv_drained_begin before throttle_timers_detach_aio_context
to let all I/O completed before removing throttle timers.

[Moved declaration of bs as suggested by Alberto Garcia
<berto@igalia.com>.
--Stefan]

Signed-off-by: Zhengui <lizhengui@huawei.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Message-id: 1508564040-120700-1-git-send-email-lizhengui@huawei.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 block/block-backend.c | 4 ++++
 1 file changed, 4 insertions(+)

Patch

diff --git a/block/block-backend.c b/block/block-backend.c
index 45d9101be3..18e543780d 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -655,12 +655,16 @@  BlockBackend *blk_by_public(BlockBackendPublic *public)
  */
 void blk_remove_bs(BlockBackend *blk)
 {
+    BlockDriverState *bs;
     ThrottleTimers *tt;
 
     notifier_list_notify(&blk->remove_bs_notifiers, blk);
     if (blk->public.throttle_group_member.throttle_state) {
         tt = &blk->public.throttle_group_member.throttle_timers;
+        bs = blk_bs(blk);
+        bdrv_drained_begin(bs);
         throttle_timers_detach_aio_context(tt);
+        bdrv_drained_end(bs);
     }
 
     blk_update_root_state(blk);