Skip to content
  • Paolo Bonzini's avatar
    block: fix streaming/closing race · 3e914655
    Paolo Bonzini authored
    
    
    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: default avatarPaolo Bonzini <pbonzini@redhat.com>
    Reviewed-by: default avatarStefan Hajnoczi <stefanha@linux.vnet.ibm.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    3e914655