|
@@ -1497,6 +1497,22 @@ static void external_snapshot_action(TransactionAction *action,
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * Older QEMU versions have allowed adding an active parent node to an
|
|
|
+ * inactive child node. This is unsafe in the general case, but there is an
|
|
|
+ * important use case, which is taking a VM snapshot with migration to file
|
|
|
+ * and then adding an external snapshot while the VM is still stopped and
|
|
|
+ * images are inactive. Requiring the user to explicitly create the overlay
|
|
|
+ * as inactive would break compatibility, so just do it automatically here
|
|
|
+ * to keep this working.
|
|
|
+ */
|
|
|
+ if (bdrv_is_inactive(state->old_bs) && !bdrv_is_inactive(state->new_bs)) {
|
|
|
+ ret = bdrv_inactivate(state->new_bs, errp);
|
|
|
+ if (ret < 0) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
ret = bdrv_append(state->new_bs, state->old_bs, errp);
|
|
|
if (ret < 0) {
|
|
|
return;
|