• M
    block: Reduce (un)drains when replacing a child · debc2927
    Max Reitz 提交于
    Currently, bdrv_replace_child_noperm() undrains the parent until it is
    completely undrained, then re-drains it after attaching the new child
    node.
    
    This is a problem with bdrv_drop_intermediate(): We want to keep the
    whole subtree drained, including parents, while the operation is
    under way.  bdrv_replace_child_noperm() breaks this by allowing every
    parent to become unquiesced briefly, and then redraining it.
    
    In fact, there is no reason why the parent should become unquiesced and
    be allowed to submit requests to the new child node if that new node is
    supposed to be kept drained.  So if anything, we have to drain the
    parent before detaching the old child node.  Conversely, we have to
    undrain it only after attaching the new child node.
    
    Thus, change the whole drain algorithm here: Calculate the number of
    times we have to drain/undrain the parent before replacing the child
    node then drain it (if necessary), replace the child node, and then
    undrain it.
    Signed-off-by: NMax Reitz <mreitz@redhat.com>
    Signed-off-by: NKevin Wolf <kwolf@redhat.com>
    debc2927
block.c 198.3 KB