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