Revision f9209915 savevm.c
b/savevm.c | ||
---|---|---|
2039 | 2039 |
void do_info_snapshots(Monitor *mon) |
2040 | 2040 |
{ |
2041 | 2041 |
BlockDriverState *bs, *bs1; |
2042 |
QEMUSnapshotInfo *sn_tab, *sn; |
|
2043 |
int nb_sns, i; |
|
2042 |
QEMUSnapshotInfo *sn_tab, *sn, s, *sn_info = &s; |
|
2043 |
int nb_sns, i, ret, available; |
|
2044 |
int total; |
|
2045 |
int *available_snapshots; |
|
2044 | 2046 |
char buf[256]; |
2045 | 2047 |
|
2046 | 2048 |
bs = bdrv_snapshots(); |
... | ... | |
2048 | 2050 |
monitor_printf(mon, "No available block device supports snapshots\n"); |
2049 | 2051 |
return; |
2050 | 2052 |
} |
2051 |
monitor_printf(mon, "Snapshot devices:"); |
|
2052 |
bs1 = NULL; |
|
2053 |
while ((bs1 = bdrv_next(bs1))) { |
|
2054 |
if (bdrv_can_snapshot(bs1)) { |
|
2055 |
if (bs == bs1) |
|
2056 |
monitor_printf(mon, " %s", bdrv_get_device_name(bs1)); |
|
2057 |
} |
|
2058 |
} |
|
2059 |
monitor_printf(mon, "\n"); |
|
2060 | 2053 |
|
2061 | 2054 |
nb_sns = bdrv_snapshot_list(bs, &sn_tab); |
2062 | 2055 |
if (nb_sns < 0) { |
2063 | 2056 |
monitor_printf(mon, "bdrv_snapshot_list: error %d\n", nb_sns); |
2064 | 2057 |
return; |
2065 | 2058 |
} |
2066 |
monitor_printf(mon, "Snapshot list (from %s):\n", |
|
2067 |
bdrv_get_device_name(bs)); |
|
2068 |
monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL)); |
|
2069 |
for(i = 0; i < nb_sns; i++) { |
|
2059 |
|
|
2060 |
if (nb_sns == 0) { |
|
2061 |
monitor_printf(mon, "There is no snapshot available.\n"); |
|
2062 |
return; |
|
2063 |
} |
|
2064 |
|
|
2065 |
available_snapshots = qemu_mallocz(sizeof(int) * nb_sns); |
|
2066 |
total = 0; |
|
2067 |
for (i = 0; i < nb_sns; i++) { |
|
2070 | 2068 |
sn = &sn_tab[i]; |
2071 |
monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn)); |
|
2069 |
available = 1; |
|
2070 |
bs1 = NULL; |
|
2071 |
|
|
2072 |
while ((bs1 = bdrv_next(bs1))) { |
|
2073 |
if (bdrv_can_snapshot(bs1) && bs1 != bs) { |
|
2074 |
ret = bdrv_snapshot_find(bs1, sn_info, sn->id_str); |
|
2075 |
if (ret < 0) { |
|
2076 |
available = 0; |
|
2077 |
break; |
|
2078 |
} |
|
2079 |
} |
|
2080 |
} |
|
2081 |
|
|
2082 |
if (available) { |
|
2083 |
available_snapshots[total] = i; |
|
2084 |
total++; |
|
2085 |
} |
|
2072 | 2086 |
} |
2087 |
|
|
2088 |
if (total > 0) { |
|
2089 |
monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL)); |
|
2090 |
for (i = 0; i < total; i++) { |
|
2091 |
sn = &sn_tab[available_snapshots[i]]; |
|
2092 |
monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn)); |
|
2093 |
} |
|
2094 |
} else { |
|
2095 |
monitor_printf(mon, "There is no suitable snapshot available\n"); |
|
2096 |
} |
|
2097 |
|
|
2073 | 2098 |
qemu_free(sn_tab); |
2099 |
qemu_free(available_snapshots); |
|
2100 |
|
|
2074 | 2101 |
} |
Also available in: Unified diff