• K
    block: Make bdrv_drain_invoke() recursive · db0289b9
    Kevin Wolf 提交于
    This change separates bdrv_drain_invoke(), which calls the BlockDriver
    drain callbacks, from bdrv_drain_recurse(). Instead, the function
    performs its own recursion now.
    
    One reason for this is that bdrv_drain_recurse() can be called multiple
    times by bdrv_drain_all_begin(), but the callbacks may only be called
    once. The separation is necessary to fix this bug.
    
    The other reason is that we intend to go to a model where we call all
    driver callbacks first, and only then start polling. This is not fully
    achieved yet with this patch, as bdrv_drain_invoke() contains a
    BDRV_POLL_WHILE() loop for the block driver callbacks, which can still
    call callbacks for any unrelated event. It's a step in this direction
    anyway.
    
    Cc: qemu-stable@nongnu.org
    Signed-off-by: NKevin Wolf <kwolf@redhat.com>
    Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
    db0289b9
io.c 82.1 KB