mirror of https://gitee.com/openkylin/qemu.git
block: all I/O should be completed before removing throttle timers.
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>
This commit is contained in:
parent
508ba0f7e2
commit
632a773543
|
@ -655,12 +655,16 @@ BlockBackend *blk_by_public(BlockBackendPublic *public)
|
||||||
*/
|
*/
|
||||||
void blk_remove_bs(BlockBackend *blk)
|
void blk_remove_bs(BlockBackend *blk)
|
||||||
{
|
{
|
||||||
|
BlockDriverState *bs;
|
||||||
ThrottleTimers *tt;
|
ThrottleTimers *tt;
|
||||||
|
|
||||||
notifier_list_notify(&blk->remove_bs_notifiers, blk);
|
notifier_list_notify(&blk->remove_bs_notifiers, blk);
|
||||||
if (blk->public.throttle_group_member.throttle_state) {
|
if (blk->public.throttle_group_member.throttle_state) {
|
||||||
tt = &blk->public.throttle_group_member.throttle_timers;
|
tt = &blk->public.throttle_group_member.throttle_timers;
|
||||||
|
bs = blk_bs(blk);
|
||||||
|
bdrv_drained_begin(bs);
|
||||||
throttle_timers_detach_aio_context(tt);
|
throttle_timers_detach_aio_context(tt);
|
||||||
|
bdrv_drained_end(bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
blk_update_root_state(blk);
|
blk_update_root_state(blk);
|
||||||
|
|
Loading…
Reference in New Issue