}
+static int
+qemuProcessSetupDisksTransientSnapshot(virDomainObj *vm,
+ qemuDomainAsyncJob asyncJob)
+{
+ qemuDomainObjPrivate *priv = vm->privateData;
+ g_autoptr(qemuSnapshotDiskContext) snapctxt = NULL;
+ g_autoptr(GHashTable) blockNamedNodeData = NULL;
+ size_t i;
+
+ if (!(blockNamedNodeData = qemuBlockGetNamedNodeData(vm, asyncJob)))
+ return -1;
+
+ snapctxt = qemuSnapshotDiskContextNew(vm->def->ndisks, vm, asyncJob);
+
+ for (i = 0; i < vm->def->ndisks; i++) {
+ virDomainDiskDef *domdisk = vm->def->disks[i];
+ g_autoptr(virDomainSnapshotDiskDef) snapdisk = NULL;
+
+ if (!domdisk->transient)
+ continue;
+
+ /* validation code makes sure that we do this only for local disks
+ * with a file source */
+
+ if (!(snapdisk = qemuSnapshotGetTransientDiskDef(domdisk)))
+ return -1;
+
+ if (qemuSnapshotDiskPrepareOne(snapctxt, domdisk, snapdisk,
+ blockNamedNodeData,
+ false,
+ false) < 0)
+ return -1;
+ }
+
+ if (qemuSnapshotDiskCreate(snapctxt) < 0)
+ return -1;
+
+ /* the overlays are established, so they can be deleted on shutdown */
+ priv->inhibitDiskTransientDelete = false;
+
+ return 0;
+}
+
+
+static int
+qemuProcessSetupDisksTransient(virDomainObj *vm,
+ qemuDomainAsyncJob asyncJob)
+{
+ qemuDomainObjPrivate *priv = vm->privateData;
+
+ if (!(virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)))
+ return 0;
+
+ if (qemuProcessSetupDisksTransientSnapshot(vm, asyncJob) < 0)
+ return -1;
+
+ return 0;
+}
+
+
/**
* qemuProcessLaunch:
*
if (!incoming && !snapshot) {
VIR_DEBUG("Setting up transient disk");
- if (qemuSnapshotCreateDisksTransient(vm, asyncJob) < 0)
+ if (qemuProcessSetupDisksTransient(vm, asyncJob) < 0)
goto cleanup;
}
typedef struct _qemuSnapshotDiskContext qemuSnapshotDiskContext;
-static qemuSnapshotDiskContext *
+qemuSnapshotDiskContext *
qemuSnapshotDiskContextNew(size_t ndisks,
virDomainObj *vm,
qemuDomainAsyncJob asyncJob)
}
-static void
+void
qemuSnapshotDiskContextCleanup(qemuSnapshotDiskContext *snapctxt)
{
if (!snapctxt)
g_free(snapctxt);
}
-G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuSnapshotDiskContext, qemuSnapshotDiskContextCleanup);
-
/**
* qemuSnapshotDiskBitmapsPropagate:
}
-static int
+int
qemuSnapshotDiskPrepareOne(qemuSnapshotDiskContext *snapctxt,
virDomainDiskDef *disk,
virDomainSnapshotDiskDef *snapdisk,
}
-static virDomainSnapshotDiskDef *
+virDomainSnapshotDiskDef *
qemuSnapshotGetTransientDiskDef(virDomainDiskDef *domdisk)
{
g_autoptr(virDomainSnapshotDiskDef) snapdisk = g_new0(virDomainSnapshotDiskDef, 1);
}
-static qemuSnapshotDiskContext *
-qemuSnapshotDiskPrepareDisksTransient(virDomainObj *vm,
- GHashTable *blockNamedNodeData,
- qemuDomainAsyncJob asyncJob)
-{
- g_autoptr(qemuSnapshotDiskContext) snapctxt = NULL;
- size_t i;
-
- snapctxt = qemuSnapshotDiskContextNew(vm->def->ndisks, vm, asyncJob);
-
- for (i = 0; i < vm->def->ndisks; i++) {
- virDomainDiskDef *domdisk = vm->def->disks[i];
- g_autoptr(virDomainSnapshotDiskDef) snapdisk = NULL;
-
- if (!domdisk->transient)
- continue;
-
- /* validation code makes sure that we do this only for local disks
- * with a file source */
-
- if (!(snapdisk = qemuSnapshotGetTransientDiskDef(domdisk)))
- return NULL;
-
- if (qemuSnapshotDiskPrepareOne(snapctxt, domdisk, snapdisk,
- blockNamedNodeData,
- false,
- false) < 0)
- return NULL;
- }
-
- return g_steal_pointer(&snapctxt);
-}
-
-
static void
qemuSnapshotDiskUpdateSourceRenumber(virStorageSource *src)
{
}
-static int
+int
qemuSnapshotDiskCreate(qemuSnapshotDiskContext *snapctxt)
{
qemuDomainObjPrivate *priv = snapctxt->vm->privateData;
}
-/**
- * qemuSnapshotCreateDisksTransient:
- * @vm: domain object
- * @asyncJob: qemu async job type
- *
- * Creates overlays on top of disks which are configured as <transient/>. Note
- * that the validation code ensures that <transient> disks have appropriate
- * configuration.
- */
-int
-qemuSnapshotCreateDisksTransient(virDomainObj *vm,
- qemuDomainAsyncJob asyncJob)
-{
- qemuDomainObjPrivate *priv = vm->privateData;
- g_autoptr(qemuSnapshotDiskContext) snapctxt = NULL;
- g_autoptr(GHashTable) blockNamedNodeData = NULL;
-
- if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) {
- if (!(blockNamedNodeData = qemuBlockGetNamedNodeData(vm, asyncJob)))
- return -1;
-
- if (!(snapctxt = qemuSnapshotDiskPrepareDisksTransient(vm,
- blockNamedNodeData,
- asyncJob)))
- return -1;
-
- if (qemuSnapshotDiskCreate(snapctxt) < 0)
- return -1;
- }
-
- /* the overlays are established, so they can be deleted on shutdown */
- priv->inhibitDiskTransientDelete = false;
-
- return 0;
-}
-
-
static int
qemuSnapshotCreateActiveExternal(virQEMUDriver *driver,
virDomainObj *vm,
virDomainSnapshotPtr snapshot,
unsigned int flags);
+
+typedef struct _qemuSnapshotDiskContext qemuSnapshotDiskContext;
+
+qemuSnapshotDiskContext *
+qemuSnapshotDiskContextNew(size_t ndisks,
+ virDomainObj *vm,
+ qemuDomainAsyncJob asyncJob);
+
+void
+qemuSnapshotDiskContextCleanup(qemuSnapshotDiskContext *snapctxt);
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuSnapshotDiskContext, qemuSnapshotDiskContextCleanup);
+
+int
+qemuSnapshotDiskPrepareOne(qemuSnapshotDiskContext *snapctxt,
+ virDomainDiskDef *disk,
+ virDomainSnapshotDiskDef *snapdisk,
+ GHashTable *blockNamedNodeData,
+ bool reuse,
+ bool updateConfig);
int
-qemuSnapshotCreateDisksTransient(virDomainObj *vm,
- qemuDomainAsyncJob asyncJob);
+qemuSnapshotDiskCreate(qemuSnapshotDiskContext *snapctxt);
+
+virDomainSnapshotDiskDef *
+qemuSnapshotGetTransientDiskDef(virDomainDiskDef *domdisk);