Skip to content
  • Kevin Wolf's avatar
    0f12264e
    block: Allow graph changes in bdrv_drain_all_begin/end sections · 0f12264e
    Kevin Wolf authored
    
    
    bdrv_drain_all_*() used bdrv_next() to iterate over all root nodes and
    did a subtree drain for each of them. This works fine as long as the
    graph is static, but sadly, reality looks different.
    
    If the graph changes so that root nodes are added or removed, we would
    have to compensate for this. bdrv_next() returns each root node only
    once even if it's the root node for multiple BlockBackends or for a
    monitor-owned block driver tree, which would only complicate things.
    
    The much easier and more obviously correct way is to fundamentally
    change the way the functions work: Iterate over all BlockDriverStates,
    no matter who owns them, and drain them individually. Compensation is
    only necessary when a new BDS is created inside a drain_all section.
    Removal of a BDS doesn't require any action because it's gone afterwards
    anyway.
    
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    0f12264e
    block: Allow graph changes in bdrv_drain_all_begin/end sections
    Kevin Wolf authored
    
    
    bdrv_drain_all_*() used bdrv_next() to iterate over all root nodes and
    did a subtree drain for each of them. This works fine as long as the
    graph is static, but sadly, reality looks different.
    
    If the graph changes so that root nodes are added or removed, we would
    have to compensate for this. bdrv_next() returns each root node only
    once even if it's the root node for multiple BlockBackends or for a
    monitor-owned block driver tree, which would only complicate things.
    
    The much easier and more obviously correct way is to fundamentally
    change the way the functions work: Iterate over all BlockDriverStates,
    no matter who owns them, and drain them individually. Compensation is
    only necessary when a new BDS is created inside a drain_all section.
    Removal of a BDS doesn't require any action because it's gone afterwards
    anyway.
    
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
Loading