block: Add missing locking in bdrv_co_drain_bh_cb()
commitaa1361d54aac43094b98024b8b6c804eb6e41661
authorKevin Wolf <kwolf@redhat.com>
Fri, 17 Aug 2018 16:54:18 +0000 (17 18:54 +0200)
committerKevin Wolf <kwolf@redhat.com>
Tue, 25 Sep 2018 13:50:15 +0000 (25 15:50 +0200)
tree5ae88b570aa3073f13e15c57e0594633b6d42584
parentae23dde9dd486e57e152a0ebc9802caddedc45fc
block: Add missing locking in bdrv_co_drain_bh_cb()

bdrv_do_drained_begin/end() assume that they are called with the
AioContext lock of bs held. If we call drain functions from a coroutine
with the AioContext lock held, we yield and schedule a BH to move out of
coroutine context. This means that the lock for the home context of the
coroutine is released and must be re-acquired in the bottom half.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
block/io.c
include/qemu/coroutine.h
util/qemu-coroutine.c