On 16.07.2020 00:22, Andrey Shinkevich wrote:
On 25.06.2020 18:21, Max Reitz wrote:
If the top node's driver does not provide snapshot functionality and we
want to fall back to a node down the chain, we need to snapshot all
non-COW children. For simplicity's sake, just do not fall back if there
I guess it comes to COW children like BDRV_CHILD_DATA |
BDRV_CHILD_METADATA rather than non-COW ones, does it?
The BDRV_CHILD_COW is mutually exclusive with DATA, METADATA and
FILTERED per definition.
Sorry about the question.
Andrey
is more than one such child. Furthermore, we really only can fall back
to bs->file and bs->backing, because bdrv_snapshot_goto() has to modify
the child link (notably, set it to NULL).
Suggested-by: Vladimir Sementsov-Ogievskiy <[email protected]>
Signed-off-by: Max Reitz <[email protected]>
---
block/snapshot.c | 104 +++++++++++++++++++++++++++++++++++++----------
1 file changed, 83 insertions(+), 21 deletions(-)
diff --git a/block/snapshot.c b/block/snapshot.c
...
+ /*
+ * Check that there are no other children that would need to be
+ * snapshotted. If there are, it is not safe to fall back to
+ * *fallback.
+ */
+ QLIST_FOREACH(child, &bs->children, next) {
+ if (child->role & (BDRV_CHILD_DATA | BDRV_CHILD_METADATA |
+ BDRV_CHILD_FILTERED) &&
+ child != *fallback)
+ {
+ return NULL;
+ }
+ }
+
+ return fallback;
+}
...
Reviewed-by: Andrey Shinkevich <[email protected]>