• Stefan Hajnoczi's avatar
    block: stop relying on io_flush() in bdrv_drain_all() · 88266f5a
    Stefan Hajnoczi authored
    
    
    If a block driver has no file descriptors to monitor but there are still
    active requests, it can return 1 from .io_flush().  This is used to spin
    during synchronous I/O.
    
    Stop relying on .io_flush() and instead check
    QLIST_EMPTY(&bs->tracked_requests) to decide whether there are active
    requests.
    
    This is the first step in removing .io_flush() so that event loops no
    longer need to have the concept of synchronous I/O.  Eventually we may
    be able to kill synchronous I/O completely by running everything in a
    coroutine, but that is future work.
    
    Note this patch moves bs->throttled_reqs initialization to bdrv_new() so
    that bdrv_requests_pending(bs) can safely access it.  In practice bs is
    g_malloc0() so the memory is already zeroed but it's safer to initialize
    the queue properly.
    
    We also need to fix up block/stream.c:close_unused_images() to prevent
    traversing a dangling pointer while it rearranges the backing file
    chain.  This is necessary since the new bdrv_drain_all() traverses the
    backing file chain.
    Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
    88266f5a
block.c 127 KB