Skip to content
  • Hanna Reitz's avatar
    ec9f10fe
    block: Generalize should_update_child() rule · ec9f10fe
    Hanna Reitz authored
    
    
    Currently, bdrv_replace_node() refuses to create loops from one BDS to
    itself if the BDS to be replaced is the backing node of the BDS to
    replace it: Say there is a node A and a node B.  Replacing B by A means
    making all references to B point to A.  If B is a child of A (i.e. A has
    a reference to B), that would mean we would have to make this reference
    point to A itself -- so we'd create a loop.
    
    bdrv_replace_node() (through should_update_child()) refuses to do so if
    B is the backing node of A.  There is no reason why we should create
    loops if B is not the backing node of A, though.  The BDS graph should
    never contain loops, so we should always refuse to create them.
    
    If B is a child of A and B is to be replaced by A, we should simply
    leave B in place there because it is the most sensible choice.
    
    A more specific argument would be: Putting filter drivers into the BDS
    graph is basically the same as appending an overlay to a backing chain.
    But the main child BDS of a filter driver is not "backing" but "file",
    so restricting the no-loop rule to backing nodes would fail here.
    
    Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
    Reviewed-by: default avatarFam Zheng <famz@redhat.com>
    Reviewed-by: default avatarAlberto Garcia <berto@igalia.com>
    Message-id: 20180613181823.13618-7-mreitz@redhat.com
    Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
    ec9f10fe
    block: Generalize should_update_child() rule
    Hanna Reitz authored
    
    
    Currently, bdrv_replace_node() refuses to create loops from one BDS to
    itself if the BDS to be replaced is the backing node of the BDS to
    replace it: Say there is a node A and a node B.  Replacing B by A means
    making all references to B point to A.  If B is a child of A (i.e. A has
    a reference to B), that would mean we would have to make this reference
    point to A itself -- so we'd create a loop.
    
    bdrv_replace_node() (through should_update_child()) refuses to do so if
    B is the backing node of A.  There is no reason why we should create
    loops if B is not the backing node of A, though.  The BDS graph should
    never contain loops, so we should always refuse to create them.
    
    If B is a child of A and B is to be replaced by A, we should simply
    leave B in place there because it is the most sensible choice.
    
    A more specific argument would be: Putting filter drivers into the BDS
    graph is basically the same as appending an overlay to a backing chain.
    But the main child BDS of a filter driver is not "backing" but "file",
    so restricting the no-loop rule to backing nodes would fail here.
    
    Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
    Reviewed-by: default avatarFam Zheng <famz@redhat.com>
    Reviewed-by: default avatarAlberto Garcia <berto@igalia.com>
    Message-id: 20180613181823.13618-7-mreitz@redhat.com
    Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
Loading