snapshot: qemu: Fix detection of external snapshots when deleting

This patch adds a helper to determine if snapshots are external and uses
the helper to fix detection of those in snapshot deletion code.

Snapshots are external if they have an external memory image or if the
disk locations are external. As mixed snapshots are forbidden for now
we need to check just one disk to know.
This commit is contained in:
Peter Krempa 2012-10-19 11:55:36 +02:00
parent e5aab47ab3
commit 30f1bccf33
4 changed files with 23 additions and 3 deletions

View File

@ -1023,3 +1023,20 @@ cleanup:
}
return ret;
}
bool
virDomainSnapshotIsExternal(virDomainSnapshotObjPtr snap)
{
int i;
if (snap->def->memory == VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL)
return true;
for (i = 0; i < snap->def->ndisks; i++) {
if (snap->def->disks[i].snapshot == VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL)
return true;
}
return false;
}

View File

@ -155,6 +155,8 @@ int virDomainListSnapshots(virDomainSnapshotObjListPtr snapshots,
virDomainSnapshotPtr **snaps,
unsigned int flags);
bool virDomainSnapshotIsExternal(virDomainSnapshotObjPtr snap);
VIR_ENUM_DECL(virDomainSnapshotLocation)
VIR_ENUM_DECL(virDomainSnapshotState)

View File

@ -1083,6 +1083,7 @@ virDomainSnapshotFindByName;
virDomainSnapshotForEach;
virDomainSnapshotForEachChild;
virDomainSnapshotForEachDescendant;
virDomainSnapshotIsExternal;
virDomainSnapshotLocationTypeFromString;
virDomainSnapshotLocationTypeToString;
virDomainSnapshotObjListGetNames;

View File

@ -2025,7 +2025,7 @@ cleanup:
}
/* Count how many snapshots in a set have external disk snapshots. */
/* Count how many snapshots in a set are external snapshots or checkpoints. */
static void
qemuDomainSnapshotCountExternal(void *payload,
const void *name ATTRIBUTE_UNUSED,
@ -2034,7 +2034,7 @@ qemuDomainSnapshotCountExternal(void *payload,
virDomainSnapshotObjPtr snap = payload;
int *count = data;
if (snap->def->state == VIR_DOMAIN_DISK_SNAPSHOT)
if (virDomainSnapshotIsExternal(snap))
(*count)++;
}
@ -12512,7 +12512,7 @@ static int qemuDomainSnapshotDelete(virDomainSnapshotPtr snapshot,
if (!(flags & VIR_DOMAIN_SNAPSHOT_DELETE_METADATA_ONLY)) {
if (!(flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY) &&
snap->def->state == VIR_DOMAIN_DISK_SNAPSHOT)
virDomainSnapshotIsExternal(snap))
external++;
if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN)
virDomainSnapshotForEachDescendant(snap,