From: Kevin Wolf Date: Tue, 17 Jan 2017 12:39:34 +0000 (+0100) Subject: block: Add BdrvChildRole.stay_at_node X-Git-Tag: v2.9.0-rc0~48^2~21 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=26de9438c1b6013532fb95de0720e2696588332f;p=thirdparty%2Fqemu.git block: Add BdrvChildRole.stay_at_node When the parents' child links are updated in bdrv_append() or bdrv_replace_in_backing_chain(), this should affect all child links of BlockBackends or other nodes, but not on child links held for other purposes (like for setting permissions). This patch allows to control the behaviour per BdrvChildRole. Signed-off-by: Kevin Wolf Reviewed-by: Max Reitz Acked-by: Fam Zheng --- diff --git a/block.c b/block.c index f72a67f230b..9e538a5d410 100644 --- a/block.c +++ b/block.c @@ -2853,6 +2853,9 @@ static void change_parent_backing_link(BlockDriverState *from, BdrvChild *c, *next, *to_c; QLIST_FOREACH_SAFE(c, &from->parents, next_parent, next) { + if (c->role->stay_at_node) { + continue; + } if (c->role == &child_backing) { /* @from is generally not allowed to be a backing file, except for * when @to is the overlay. In that case, @from may not be replaced diff --git a/include/block/block_int.h b/include/block/block_int.h index 3177b9f4961..a0d9328b59d 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -441,6 +441,10 @@ typedef struct BdrvAioNotifier { } BdrvAioNotifier; struct BdrvChildRole { + /* If true, bdrv_replace_in_backing_chain() doesn't change the node this + * BdrvChild points to. */ + bool stay_at_node; + void (*inherit_options)(int *child_flags, QDict *child_options, int parent_flags, QDict *parent_options);