virDomainSnapshotDiskDef *snapDisk; /* snapshot disk definition */
virDomainDiskDef *domDisk; /* VM disk definition */
virStorageSource *diskSrc; /* source of disk we are deleting */
+ virStorageSource *diskSrcMetadata; /* copy of diskSrc to be used when updating
+ metadata because diskSrc is freed */
virDomainMomentObj *parentSnap;
virDomainDiskDef *parentDomDisk; /* disk definition from snapshot metadata */
virStorageSource *parentDiskSrc; /* backing disk source of the @diskSrc */
if (!data)
return;
+ virObjectUnref(data->diskSrcMetadata);
virObjectUnref(data->job);
g_slist_free_full(data->disksWithBacking, g_free);
if (!data->diskSrc)
return -1;
+ data->diskSrcMetadata = virStorageSourceCopy(data->diskSrc, false);
+
if (!virStorageSourceIsSameLocation(data->diskSrc, snapDiskSrc)) {
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
_("VM disk source and snapshot disk source are not the same"));
struct _qemuSnapshotUpdateDisksData {
virDomainMomentObj *snap;
virDomainObj *vm;
+ GSList *externalData;
int error;
};
qemuSnapshotUpdateDisksSingle(virDomainMomentObj *snap,
virDomainDef *def,
virDomainDef *parentDef,
- virDomainSnapshotDiskDef *snapDisk)
+ virDomainSnapshotDiskDef *snapDisk,
+ virStorageSource *diskSrc)
{
virDomainDiskDef *disk = NULL;
if (!(parentDisk = qemuDomainDiskByName(parentDef, snapDisk->name)))
return -1;
- if (virStorageSourceIsSameLocation(snapDisk->src, disk->src)) {
+ if (virStorageSourceIsSameLocation(diskSrc, disk->src)) {
virObjectUnref(disk->src);
disk->src = virStorageSourceCopy(parentDisk->src, false);
}
virStorageSource *next = disk->src->backingStore;
while (next) {
- if (virStorageSourceIsSameLocation(snapDisk->src, next)) {
+ if (virStorageSourceIsSameLocation(diskSrc, next)) {
cur->backingStore = next->backingStore;
next->backingStore = NULL;
virObjectUnref(next);
qemuDomainObjPrivate *priv = data->vm->privateData;
virQEMUDriver *driver = priv->driver;
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
- virDomainSnapshotDef *snapdef = virDomainSnapshotObjGetDef(data->snap);
- ssize_t i;
-
- for (i = 0; i < snapdef->ndisks; i++) {
- virDomainSnapshotDiskDef *snapDisk = &(snapdef->disks[i]);
+ GSList *cur = NULL;
- if (snapDisk->snapshot == VIR_DOMAIN_SNAPSHOT_LOCATION_NO)
- continue;
+ for (cur = data->externalData; cur; cur = g_slist_next(cur)) {
+ qemuSnapshotDeleteExternalData *curdata = cur->data;
if (qemuSnapshotUpdateDisksSingle(snap, snap->def->dom,
- data->snap->def->dom, snapDisk) < 0) {
+ data->snap->def->dom,
+ curdata->snapDisk,
+ curdata->diskSrcMetadata) < 0) {
data->error = -1;
}
dom = data->snap->def->dom;
if (qemuSnapshotUpdateDisksSingle(snap, snap->def->inactiveDom,
- dom, snapDisk) < 0) {
+ dom, curdata->snapDisk,
+ curdata->diskSrcMetadata) < 0) {
data->error = -1;
}
}
static int
qemuSnapshotDiscardMetadata(virDomainObj *vm,
virDomainMomentObj *snap,
+ GSList *externalData,
bool update_parent)
{
qemuDomainObjPrivate *priv = vm->privateData;
if (virDomainSnapshotIsExternal(snap)) {
data.snap = snap;
data.vm = vm;
+ data.externalData = externalData;
data.error = 0;
virDomainMomentForEachDescendant(snap,
qemuSnapshotDeleteUpdateDisks,
}
}
- if (qemuSnapshotDiscardMetadata(vm, snap, update_parent) < 0)
+ if (qemuSnapshotDiscardMetadata(vm, snap, externalData, update_parent) < 0)
return -1;
return 0;