On Fri, Mar 30, 2012 at 12:17 PM, Paolo Bonzini <pbonz...@redhat.com> wrote: > Streaming can issue I/O while qcow2_close is running. This causes the > L2 caches to become very confused or, alternatively, could cause a > segfault when the streaming coroutine is reentered after closing its > block device. The fix is to cancel streaming jobs when closing their > underlying device. > > The cancellation must be synchronous, on the other hand qemu_aio_wait > will not restart a coroutine that is sleeping in co_sleep. So add > a flag saying whether streaming has in-flight I/O. If the busy flag > is false, the coroutine is quiescent and, when cancelled, will not > issue any new I/O. > > This protects streaming against closing, but not against deleting. > We have a reference count protecting us against concurrent deletion, > but I still added an assertion to ensure nothing bad happens. > > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> > --- > block.c | 16 ++++++++++++++++ > block/stream.c | 6 ++++-- > block_int.h | 2 ++ > 3 files changed, 22 insertions(+), 2 deletions(-)
Reviewed-by: Stefan Hajnoczi <stefa...@linux.vnet.ibm.com>