On Wed 11 Apr 2018 08:54:18 PM CEST, Max Reitz wrote: > 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: Max Reitz <mre...@redhat.com> > Reviewed-by: Fam Zheng <f...@redhat.com>
Reviewed-by: Alberto Garcia <be...@igalia.com> Berto