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 <kwolf@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Acked-by: Fam Zheng <famz@redhat.com>
This commit is contained in:
Kevin Wolf 2017-01-17 13:39:34 +01:00
parent d083319fe0
commit 26de9438c1
2 changed files with 7 additions and 0 deletions

View File

@ -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

View File

@ -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);