unsigned long long granularity;
};
+
+typedef struct _qemuBlockNamedNodeDataSnapshot qemuBlockNamedNodeDataSnapshot;
+struct _qemuBlockNamedNodeDataSnapshot {
+ bool vmstate;
+};
+
+
typedef struct _qemuBlockNamedNodeData qemuBlockNamedNodeData;
struct _qemuBlockNamedNodeData {
unsigned long long capacity;
qemuBlockNamedNodeDataBitmap **bitmaps;
size_t nbitmaps;
- /* NULL terminated string list of internal snapshot names */
- char **snapshots;
+ /* hash table indexed by snapshot name containing data about snapshots
+ * (qemuBlockNamedNodeDataSnapshot) */
+ GHashTable *snapshots;
/* the cluster size of the image is valid only when > 0 */
unsigned long long clusterSize;
for (i = 0; i < data->nbitmaps; i++)
qemuMonitorJSONBlockNamedNodeDataBitmapFree(data->bitmaps[i]);
- g_strfreev(data->snapshots);
+ g_clear_pointer(&data->snapshots, g_hash_table_unref);
g_free(data->bitmaps);
g_free(data);
}
if ((snapshots = virJSONValueObjectGetArray(img, "snapshots"))) {
size_t nsnapshots = virJSONValueArraySize(snapshots);
- size_t nsnapnames = 0;
size_t i;
- ent->snapshots = g_new0(char *, nsnapshots + 1);
+ ent->snapshots = virHashNew(g_free);
for (i = 0; i < nsnapshots; i++) {
virJSONValue *snapshot = virJSONValueArrayGet(snapshots, i);
const char *name = virJSONValueObjectGetString(snapshot, "name");
+ unsigned long long vmstate_size = 0;
+ qemuBlockNamedNodeDataSnapshot *snd;
if (!name)
continue;
- ent->snapshots[nsnapnames++] = g_strdup(name);
+ ignore_value(virJSONValueObjectGetNumberUlong(snapshot,
+ "vm-state-size",
+ &vmstate_size));
+
+ snd = g_new0(qemuBlockNamedNodeDataSnapshot, 1);
+
+ if (vmstate_size > 0)
+ snd->vmstate = true;
+
+ g_hash_table_insert(ent->snapshots, g_strdup(name), snd);
}
}
continue;
/* there might be no snapshot for given disk with given name */
- if (!d->snapshots ||
- !g_strv_contains((const char **) d->snapshots, snapname))
+ if (!virHashHasEntry(d->snapshots, snapname))
continue;
devices[ndevs++] = g_strdup(format_nodename);
if ((format_nodename = qemuBlockStorageSourceGetFormatNodename(vm->def->os.loader->nvram)) &&
(d = virHashLookup(blockNamedNodeData, format_nodename)) &&
- d->snapshots &&
- g_strv_contains((const char **) d->snapshots, snapname)) {
+ virHashHasEntry(d->snapshots, snapname)) {
devices[ndevs++] = g_strdup(format_nodename);
}
}
}
if (data->snapshots) {
- char **sn;
+ g_autofree virHashKeyValuePair *snaps = virHashGetItems(data->snapshots, NULL, true);
+ virHashKeyValuePair *n;
virBufferAddLit(buf, "internal snapshots:");
- for (sn = data->snapshots; *sn; sn++)
- virBufferAsprintf(buf, " '%s'", *sn);
+ for (n = snaps; n->key; n++) {
+ const qemuBlockNamedNodeDataSnapshot *d = n->value;
+ const char *vms = "";
+
+ if (d->vmstate)
+ vms = "(*)";
+
+ virBufferAsprintf(buf, " '%s'%s", (const char *) n->key, vms);
+ }
}
virBufferAdjustIndent(buf, -1);
libvirt-1-format:
- internal snapshots: '1727868651' '1727872064'
+ internal snapshots: '1727868651'(*) '1727872064'(*)