cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

qcow2-snapshot.c (34400B)


      1/*
      2 * Block driver for the QCOW version 2 format
      3 *
      4 * Copyright (c) 2004-2006 Fabrice Bellard
      5 *
      6 * Permission is hereby granted, free of charge, to any person obtaining a copy
      7 * of this software and associated documentation files (the "Software"), to deal
      8 * in the Software without restriction, including without limitation the rights
      9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     10 * copies of the Software, and to permit persons to whom the Software is
     11 * furnished to do so, subject to the following conditions:
     12 *
     13 * The above copyright notice and this permission notice shall be included in
     14 * all copies or substantial portions of the Software.
     15 *
     16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     22 * THE SOFTWARE.
     23 */
     24
     25#include "qemu/osdep.h"
     26#include "sysemu/block-backend.h"
     27#include "qapi/error.h"
     28#include "qcow2.h"
     29#include "qemu/bswap.h"
     30#include "qemu/error-report.h"
     31#include "qemu/cutils.h"
     32
     33static void qcow2_free_single_snapshot(BlockDriverState *bs, int i)
     34{
     35    BDRVQcow2State *s = bs->opaque;
     36
     37    assert(i >= 0 && i < s->nb_snapshots);
     38    g_free(s->snapshots[i].name);
     39    g_free(s->snapshots[i].id_str);
     40    g_free(s->snapshots[i].unknown_extra_data);
     41    memset(&s->snapshots[i], 0, sizeof(s->snapshots[i]));
     42}
     43
     44void qcow2_free_snapshots(BlockDriverState *bs)
     45{
     46    BDRVQcow2State *s = bs->opaque;
     47    int i;
     48
     49    for(i = 0; i < s->nb_snapshots; i++) {
     50        qcow2_free_single_snapshot(bs, i);
     51    }
     52    g_free(s->snapshots);
     53    s->snapshots = NULL;
     54    s->nb_snapshots = 0;
     55}
     56
     57/*
     58 * If @repair is true, try to repair a broken snapshot table instead
     59 * of just returning an error:
     60 *
     61 * - If the snapshot table was too long, set *nb_clusters_reduced to
     62 *   the number of snapshots removed off the end.
     63 *   The caller will update the on-disk nb_snapshots accordingly;
     64 *   this leaks clusters, but is safe.
     65 *   (The on-disk information must be updated before
     66 *   qcow2_check_refcounts(), because that function relies on
     67 *   s->nb_snapshots to reflect the on-disk value.)
     68 *
     69 * - If there were snapshots with too much extra metadata, increment
     70 *   *extra_data_dropped for each.
     71 *   This requires the caller to eventually rewrite the whole snapshot
     72 *   table, which requires cluster allocation.  Therefore, this should
     73 *   be done only after qcow2_check_refcounts() made sure the refcount
     74 *   structures are valid.
     75 *   (In the meantime, the image is still valid because
     76 *   qcow2_check_refcounts() does not do anything with snapshots'
     77 *   extra data.)
     78 */
     79static int qcow2_do_read_snapshots(BlockDriverState *bs, bool repair,
     80                                   int *nb_clusters_reduced,
     81                                   int *extra_data_dropped,
     82                                   Error **errp)
     83{
     84    BDRVQcow2State *s = bs->opaque;
     85    QCowSnapshotHeader h;
     86    QCowSnapshotExtraData extra;
     87    QCowSnapshot *sn;
     88    int i, id_str_size, name_size;
     89    int64_t offset, pre_sn_offset;
     90    uint64_t table_length = 0;
     91    int ret;
     92
     93    if (!s->nb_snapshots) {
     94        s->snapshots = NULL;
     95        s->snapshots_size = 0;
     96        return 0;
     97    }
     98
     99    offset = s->snapshots_offset;
    100    s->snapshots = g_new0(QCowSnapshot, s->nb_snapshots);
    101
    102    for(i = 0; i < s->nb_snapshots; i++) {
    103        bool truncate_unknown_extra_data = false;
    104
    105        pre_sn_offset = offset;
    106        table_length = ROUND_UP(table_length, 8);
    107
    108        /* Read statically sized part of the snapshot header */
    109        offset = ROUND_UP(offset, 8);
    110        ret = bdrv_pread(bs->file, offset, &h, sizeof(h));
    111        if (ret < 0) {
    112            error_setg_errno(errp, -ret, "Failed to read snapshot table");
    113            goto fail;
    114        }
    115
    116        offset += sizeof(h);
    117        sn = s->snapshots + i;
    118        sn->l1_table_offset = be64_to_cpu(h.l1_table_offset);
    119        sn->l1_size = be32_to_cpu(h.l1_size);
    120        sn->vm_state_size = be32_to_cpu(h.vm_state_size);
    121        sn->date_sec = be32_to_cpu(h.date_sec);
    122        sn->date_nsec = be32_to_cpu(h.date_nsec);
    123        sn->vm_clock_nsec = be64_to_cpu(h.vm_clock_nsec);
    124        sn->extra_data_size = be32_to_cpu(h.extra_data_size);
    125
    126        id_str_size = be16_to_cpu(h.id_str_size);
    127        name_size = be16_to_cpu(h.name_size);
    128
    129        if (sn->extra_data_size > QCOW_MAX_SNAPSHOT_EXTRA_DATA) {
    130            if (!repair) {
    131                ret = -EFBIG;
    132                error_setg(errp, "Too much extra metadata in snapshot table "
    133                           "entry %i", i);
    134                error_append_hint(errp, "You can force-remove this extra "
    135                                  "metadata with qemu-img check -r all\n");
    136                goto fail;
    137            }
    138
    139            fprintf(stderr, "Discarding too much extra metadata in snapshot "
    140                    "table entry %i (%" PRIu32 " > %u)\n",
    141                    i, sn->extra_data_size, QCOW_MAX_SNAPSHOT_EXTRA_DATA);
    142
    143            (*extra_data_dropped)++;
    144            truncate_unknown_extra_data = true;
    145        }
    146
    147        /* Read known extra data */
    148        ret = bdrv_pread(bs->file, offset, &extra,
    149                         MIN(sizeof(extra), sn->extra_data_size));
    150        if (ret < 0) {
    151            error_setg_errno(errp, -ret, "Failed to read snapshot table");
    152            goto fail;
    153        }
    154        offset += MIN(sizeof(extra), sn->extra_data_size);
    155
    156        if (sn->extra_data_size >= endof(QCowSnapshotExtraData,
    157                                         vm_state_size_large)) {
    158            sn->vm_state_size = be64_to_cpu(extra.vm_state_size_large);
    159        }
    160
    161        if (sn->extra_data_size >= endof(QCowSnapshotExtraData, disk_size)) {
    162            sn->disk_size = be64_to_cpu(extra.disk_size);
    163        } else {
    164            sn->disk_size = bs->total_sectors * BDRV_SECTOR_SIZE;
    165        }
    166
    167        if (sn->extra_data_size >= endof(QCowSnapshotExtraData, icount)) {
    168            sn->icount = be64_to_cpu(extra.icount);
    169        } else {
    170            sn->icount = -1ULL;
    171        }
    172
    173        if (sn->extra_data_size > sizeof(extra)) {
    174            uint64_t extra_data_end;
    175            size_t unknown_extra_data_size;
    176
    177            extra_data_end = offset + sn->extra_data_size - sizeof(extra);
    178
    179            if (truncate_unknown_extra_data) {
    180                sn->extra_data_size = QCOW_MAX_SNAPSHOT_EXTRA_DATA;
    181            }
    182
    183            /* Store unknown extra data */
    184            unknown_extra_data_size = sn->extra_data_size - sizeof(extra);
    185            sn->unknown_extra_data = g_malloc(unknown_extra_data_size);
    186            ret = bdrv_pread(bs->file, offset, sn->unknown_extra_data,
    187                             unknown_extra_data_size);
    188            if (ret < 0) {
    189                error_setg_errno(errp, -ret,
    190                                 "Failed to read snapshot table");
    191                goto fail;
    192            }
    193            offset = extra_data_end;
    194        }
    195
    196        /* Read snapshot ID */
    197        sn->id_str = g_malloc(id_str_size + 1);
    198        ret = bdrv_pread(bs->file, offset, sn->id_str, id_str_size);
    199        if (ret < 0) {
    200            error_setg_errno(errp, -ret, "Failed to read snapshot table");
    201            goto fail;
    202        }
    203        offset += id_str_size;
    204        sn->id_str[id_str_size] = '\0';
    205
    206        /* Read snapshot name */
    207        sn->name = g_malloc(name_size + 1);
    208        ret = bdrv_pread(bs->file, offset, sn->name, name_size);
    209        if (ret < 0) {
    210            error_setg_errno(errp, -ret, "Failed to read snapshot table");
    211            goto fail;
    212        }
    213        offset += name_size;
    214        sn->name[name_size] = '\0';
    215
    216        /* Note that the extra data may have been truncated */
    217        table_length += sizeof(h) + sn->extra_data_size + id_str_size +
    218                        name_size;
    219        if (!repair) {
    220            assert(table_length == offset - s->snapshots_offset);
    221        }
    222
    223        if (table_length > QCOW_MAX_SNAPSHOTS_SIZE ||
    224            offset - s->snapshots_offset > INT_MAX)
    225        {
    226            if (!repair) {
    227                ret = -EFBIG;
    228                error_setg(errp, "Snapshot table is too big");
    229                error_append_hint(errp, "You can force-remove all %u "
    230                                  "overhanging snapshots with qemu-img check "
    231                                  "-r all\n", s->nb_snapshots - i);
    232                goto fail;
    233            }
    234
    235            fprintf(stderr, "Discarding %u overhanging snapshots (snapshot "
    236                    "table is too big)\n", s->nb_snapshots - i);
    237
    238            *nb_clusters_reduced += (s->nb_snapshots - i);
    239
    240            /* Discard current snapshot also */
    241            qcow2_free_single_snapshot(bs, i);
    242
    243            /*
    244             * This leaks all the rest of the snapshot table and the
    245             * snapshots' clusters, but we run in check -r all mode,
    246             * so qcow2_check_refcounts() will take care of it.
    247             */
    248            s->nb_snapshots = i;
    249            offset = pre_sn_offset;
    250            break;
    251        }
    252    }
    253
    254    assert(offset - s->snapshots_offset <= INT_MAX);
    255    s->snapshots_size = offset - s->snapshots_offset;
    256    return 0;
    257
    258fail:
    259    qcow2_free_snapshots(bs);
    260    return ret;
    261}
    262
    263int qcow2_read_snapshots(BlockDriverState *bs, Error **errp)
    264{
    265    return qcow2_do_read_snapshots(bs, false, NULL, NULL, errp);
    266}
    267
    268/* add at the end of the file a new list of snapshots */
    269int qcow2_write_snapshots(BlockDriverState *bs)
    270{
    271    BDRVQcow2State *s = bs->opaque;
    272    QCowSnapshot *sn;
    273    QCowSnapshotHeader h;
    274    QCowSnapshotExtraData extra;
    275    int i, name_size, id_str_size, snapshots_size;
    276    struct {
    277        uint32_t nb_snapshots;
    278        uint64_t snapshots_offset;
    279    } QEMU_PACKED header_data;
    280    int64_t offset, snapshots_offset = 0;
    281    int ret;
    282
    283    /* compute the size of the snapshots */
    284    offset = 0;
    285    for(i = 0; i < s->nb_snapshots; i++) {
    286        sn = s->snapshots + i;
    287        offset = ROUND_UP(offset, 8);
    288        offset += sizeof(h);
    289        offset += MAX(sizeof(extra), sn->extra_data_size);
    290        offset += strlen(sn->id_str);
    291        offset += strlen(sn->name);
    292
    293        if (offset > QCOW_MAX_SNAPSHOTS_SIZE) {
    294            ret = -EFBIG;
    295            goto fail;
    296        }
    297    }
    298
    299    assert(offset <= INT_MAX);
    300    snapshots_size = offset;
    301
    302    /* Allocate space for the new snapshot list */
    303    snapshots_offset = qcow2_alloc_clusters(bs, snapshots_size);
    304    offset = snapshots_offset;
    305    if (offset < 0) {
    306        ret = offset;
    307        goto fail;
    308    }
    309    ret = bdrv_flush(bs);
    310    if (ret < 0) {
    311        goto fail;
    312    }
    313
    314    /* The snapshot list position has not yet been updated, so these clusters
    315     * must indeed be completely free */
    316    ret = qcow2_pre_write_overlap_check(bs, 0, offset, snapshots_size, false);
    317    if (ret < 0) {
    318        goto fail;
    319    }
    320
    321
    322    /* Write all snapshots to the new list */
    323    for(i = 0; i < s->nb_snapshots; i++) {
    324        sn = s->snapshots + i;
    325        memset(&h, 0, sizeof(h));
    326        h.l1_table_offset = cpu_to_be64(sn->l1_table_offset);
    327        h.l1_size = cpu_to_be32(sn->l1_size);
    328        /* If it doesn't fit in 32 bit, older implementations should treat it
    329         * as a disk-only snapshot rather than truncate the VM state */
    330        if (sn->vm_state_size <= 0xffffffff) {
    331            h.vm_state_size = cpu_to_be32(sn->vm_state_size);
    332        }
    333        h.date_sec = cpu_to_be32(sn->date_sec);
    334        h.date_nsec = cpu_to_be32(sn->date_nsec);
    335        h.vm_clock_nsec = cpu_to_be64(sn->vm_clock_nsec);
    336        h.extra_data_size = cpu_to_be32(MAX(sizeof(extra),
    337                                            sn->extra_data_size));
    338
    339        memset(&extra, 0, sizeof(extra));
    340        extra.vm_state_size_large = cpu_to_be64(sn->vm_state_size);
    341        extra.disk_size = cpu_to_be64(sn->disk_size);
    342        extra.icount = cpu_to_be64(sn->icount);
    343
    344        id_str_size = strlen(sn->id_str);
    345        name_size = strlen(sn->name);
    346        assert(id_str_size <= UINT16_MAX && name_size <= UINT16_MAX);
    347        h.id_str_size = cpu_to_be16(id_str_size);
    348        h.name_size = cpu_to_be16(name_size);
    349        offset = ROUND_UP(offset, 8);
    350
    351        ret = bdrv_pwrite(bs->file, offset, &h, sizeof(h));
    352        if (ret < 0) {
    353            goto fail;
    354        }
    355        offset += sizeof(h);
    356
    357        ret = bdrv_pwrite(bs->file, offset, &extra, sizeof(extra));
    358        if (ret < 0) {
    359            goto fail;
    360        }
    361        offset += sizeof(extra);
    362
    363        if (sn->extra_data_size > sizeof(extra)) {
    364            size_t unknown_extra_data_size =
    365                sn->extra_data_size - sizeof(extra);
    366
    367            /* qcow2_read_snapshots() ensures no unbounded allocation */
    368            assert(unknown_extra_data_size <= BDRV_REQUEST_MAX_BYTES);
    369            assert(sn->unknown_extra_data);
    370
    371            ret = bdrv_pwrite(bs->file, offset, sn->unknown_extra_data,
    372                              unknown_extra_data_size);
    373            if (ret < 0) {
    374                goto fail;
    375            }
    376            offset += unknown_extra_data_size;
    377        }
    378
    379        ret = bdrv_pwrite(bs->file, offset, sn->id_str, id_str_size);
    380        if (ret < 0) {
    381            goto fail;
    382        }
    383        offset += id_str_size;
    384
    385        ret = bdrv_pwrite(bs->file, offset, sn->name, name_size);
    386        if (ret < 0) {
    387            goto fail;
    388        }
    389        offset += name_size;
    390    }
    391
    392    /*
    393     * Update the header to point to the new snapshot table. This requires the
    394     * new table and its refcounts to be stable on disk.
    395     */
    396    ret = bdrv_flush(bs);
    397    if (ret < 0) {
    398        goto fail;
    399    }
    400
    401    QEMU_BUILD_BUG_ON(offsetof(QCowHeader, snapshots_offset) !=
    402                      endof(QCowHeader, nb_snapshots));
    403
    404    header_data.nb_snapshots        = cpu_to_be32(s->nb_snapshots);
    405    header_data.snapshots_offset    = cpu_to_be64(snapshots_offset);
    406
    407    ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, nb_snapshots),
    408                           &header_data, sizeof(header_data));
    409    if (ret < 0) {
    410        goto fail;
    411    }
    412
    413    /* free the old snapshot table */
    414    qcow2_free_clusters(bs, s->snapshots_offset, s->snapshots_size,
    415                        QCOW2_DISCARD_SNAPSHOT);
    416    s->snapshots_offset = snapshots_offset;
    417    s->snapshots_size = snapshots_size;
    418    return 0;
    419
    420fail:
    421    if (snapshots_offset > 0) {
    422        qcow2_free_clusters(bs, snapshots_offset, snapshots_size,
    423                            QCOW2_DISCARD_ALWAYS);
    424    }
    425    return ret;
    426}
    427
    428int coroutine_fn qcow2_check_read_snapshot_table(BlockDriverState *bs,
    429                                                 BdrvCheckResult *result,
    430                                                 BdrvCheckMode fix)
    431{
    432    BDRVQcow2State *s = bs->opaque;
    433    Error *local_err = NULL;
    434    int nb_clusters_reduced = 0;
    435    int extra_data_dropped = 0;
    436    int ret;
    437    struct {
    438        uint32_t nb_snapshots;
    439        uint64_t snapshots_offset;
    440    } QEMU_PACKED snapshot_table_pointer;
    441
    442    /* qcow2_do_open() discards this information in check mode */
    443    ret = bdrv_pread(bs->file, offsetof(QCowHeader, nb_snapshots),
    444                     &snapshot_table_pointer, sizeof(snapshot_table_pointer));
    445    if (ret < 0) {
    446        result->check_errors++;
    447        fprintf(stderr, "ERROR failed to read the snapshot table pointer from "
    448                "the image header: %s\n", strerror(-ret));
    449        return ret;
    450    }
    451
    452    s->snapshots_offset = be64_to_cpu(snapshot_table_pointer.snapshots_offset);
    453    s->nb_snapshots = be32_to_cpu(snapshot_table_pointer.nb_snapshots);
    454
    455    if (s->nb_snapshots > QCOW_MAX_SNAPSHOTS && (fix & BDRV_FIX_ERRORS)) {
    456        fprintf(stderr, "Discarding %u overhanging snapshots\n",
    457                s->nb_snapshots - QCOW_MAX_SNAPSHOTS);
    458
    459        nb_clusters_reduced += s->nb_snapshots - QCOW_MAX_SNAPSHOTS;
    460        s->nb_snapshots = QCOW_MAX_SNAPSHOTS;
    461    }
    462
    463    ret = qcow2_validate_table(bs, s->snapshots_offset, s->nb_snapshots,
    464                               sizeof(QCowSnapshotHeader),
    465                               sizeof(QCowSnapshotHeader) * QCOW_MAX_SNAPSHOTS,
    466                               "snapshot table", &local_err);
    467    if (ret < 0) {
    468        result->check_errors++;
    469        error_reportf_err(local_err, "ERROR ");
    470
    471        if (s->nb_snapshots > QCOW_MAX_SNAPSHOTS) {
    472            fprintf(stderr, "You can force-remove all %u overhanging snapshots "
    473                    "with qemu-img check -r all\n",
    474                    s->nb_snapshots - QCOW_MAX_SNAPSHOTS);
    475        }
    476
    477        /* We did not read the snapshot table, so invalidate this information */
    478        s->snapshots_offset = 0;
    479        s->nb_snapshots = 0;
    480
    481        return ret;
    482    }
    483
    484    qemu_co_mutex_unlock(&s->lock);
    485    ret = qcow2_do_read_snapshots(bs, fix & BDRV_FIX_ERRORS,
    486                                  &nb_clusters_reduced, &extra_data_dropped,
    487                                  &local_err);
    488    qemu_co_mutex_lock(&s->lock);
    489    if (ret < 0) {
    490        result->check_errors++;
    491        error_reportf_err(local_err,
    492                          "ERROR failed to read the snapshot table: ");
    493
    494        /* We did not read the snapshot table, so invalidate this information */
    495        s->snapshots_offset = 0;
    496        s->nb_snapshots = 0;
    497
    498        return ret;
    499    }
    500    result->corruptions += nb_clusters_reduced + extra_data_dropped;
    501
    502    if (nb_clusters_reduced) {
    503        /*
    504         * Update image header now, because:
    505         * (1) qcow2_check_refcounts() relies on s->nb_snapshots to be
    506         *     the same as what the image header says,
    507         * (2) this leaks clusters, but qcow2_check_refcounts() will
    508         *     fix that.
    509         */
    510        assert(fix & BDRV_FIX_ERRORS);
    511
    512        snapshot_table_pointer.nb_snapshots = cpu_to_be32(s->nb_snapshots);
    513        ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, nb_snapshots),
    514                               &snapshot_table_pointer.nb_snapshots,
    515                               sizeof(snapshot_table_pointer.nb_snapshots));
    516        if (ret < 0) {
    517            result->check_errors++;
    518            fprintf(stderr, "ERROR failed to update the snapshot count in the "
    519                    "image header: %s\n", strerror(-ret));
    520            return ret;
    521        }
    522
    523        result->corruptions_fixed += nb_clusters_reduced;
    524        result->corruptions -= nb_clusters_reduced;
    525    }
    526
    527    /*
    528     * All of v3 images' snapshot table entries need to have at least
    529     * 16 bytes of extra data.
    530     */
    531    if (s->qcow_version >= 3) {
    532        int i;
    533        for (i = 0; i < s->nb_snapshots; i++) {
    534            if (s->snapshots[i].extra_data_size <
    535                sizeof_field(QCowSnapshotExtraData, vm_state_size_large) +
    536                sizeof_field(QCowSnapshotExtraData, disk_size))
    537            {
    538                result->corruptions++;
    539                fprintf(stderr, "%s snapshot table entry %i is incomplete\n",
    540                        fix & BDRV_FIX_ERRORS ? "Repairing" : "ERROR", i);
    541            }
    542        }
    543    }
    544
    545    return 0;
    546}
    547
    548int coroutine_fn qcow2_check_fix_snapshot_table(BlockDriverState *bs,
    549                                                BdrvCheckResult *result,
    550                                                BdrvCheckMode fix)
    551{
    552    BDRVQcow2State *s = bs->opaque;
    553    int ret;
    554
    555    if (result->corruptions && (fix & BDRV_FIX_ERRORS)) {
    556        qemu_co_mutex_unlock(&s->lock);
    557        ret = qcow2_write_snapshots(bs);
    558        qemu_co_mutex_lock(&s->lock);
    559        if (ret < 0) {
    560            result->check_errors++;
    561            fprintf(stderr, "ERROR failed to update snapshot table: %s\n",
    562                    strerror(-ret));
    563            return ret;
    564        }
    565
    566        result->corruptions_fixed += result->corruptions;
    567        result->corruptions = 0;
    568    }
    569
    570    return 0;
    571}
    572
    573static void find_new_snapshot_id(BlockDriverState *bs,
    574                                 char *id_str, int id_str_size)
    575{
    576    BDRVQcow2State *s = bs->opaque;
    577    QCowSnapshot *sn;
    578    int i;
    579    unsigned long id, id_max = 0;
    580
    581    for(i = 0; i < s->nb_snapshots; i++) {
    582        sn = s->snapshots + i;
    583        id = strtoul(sn->id_str, NULL, 10);
    584        if (id > id_max)
    585            id_max = id;
    586    }
    587    snprintf(id_str, id_str_size, "%lu", id_max + 1);
    588}
    589
    590static int find_snapshot_by_id_and_name(BlockDriverState *bs,
    591                                        const char *id,
    592                                        const char *name)
    593{
    594    BDRVQcow2State *s = bs->opaque;
    595    int i;
    596
    597    if (id && name) {
    598        for (i = 0; i < s->nb_snapshots; i++) {
    599            if (!strcmp(s->snapshots[i].id_str, id) &&
    600                !strcmp(s->snapshots[i].name, name)) {
    601                return i;
    602            }
    603        }
    604    } else if (id) {
    605        for (i = 0; i < s->nb_snapshots; i++) {
    606            if (!strcmp(s->snapshots[i].id_str, id)) {
    607                return i;
    608            }
    609        }
    610    } else if (name) {
    611        for (i = 0; i < s->nb_snapshots; i++) {
    612            if (!strcmp(s->snapshots[i].name, name)) {
    613                return i;
    614            }
    615        }
    616    }
    617
    618    return -1;
    619}
    620
    621static int find_snapshot_by_id_or_name(BlockDriverState *bs,
    622                                       const char *id_or_name)
    623{
    624    int ret;
    625
    626    ret = find_snapshot_by_id_and_name(bs, id_or_name, NULL);
    627    if (ret >= 0) {
    628        return ret;
    629    }
    630    return find_snapshot_by_id_and_name(bs, NULL, id_or_name);
    631}
    632
    633/* if no id is provided, a new one is constructed */
    634int qcow2_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info)
    635{
    636    BDRVQcow2State *s = bs->opaque;
    637    QCowSnapshot *new_snapshot_list = NULL;
    638    QCowSnapshot *old_snapshot_list = NULL;
    639    QCowSnapshot sn1, *sn = &sn1;
    640    int i, ret;
    641    uint64_t *l1_table = NULL;
    642    int64_t l1_table_offset;
    643
    644    if (s->nb_snapshots >= QCOW_MAX_SNAPSHOTS) {
    645        return -EFBIG;
    646    }
    647
    648    if (has_data_file(bs)) {
    649        return -ENOTSUP;
    650    }
    651
    652    memset(sn, 0, sizeof(*sn));
    653
    654    /* Generate an ID */
    655    find_new_snapshot_id(bs, sn_info->id_str, sizeof(sn_info->id_str));
    656
    657    /* Populate sn with passed data */
    658    sn->id_str = g_strdup(sn_info->id_str);
    659    sn->name = g_strdup(sn_info->name);
    660
    661    sn->disk_size = bs->total_sectors * BDRV_SECTOR_SIZE;
    662    sn->vm_state_size = sn_info->vm_state_size;
    663    sn->date_sec = sn_info->date_sec;
    664    sn->date_nsec = sn_info->date_nsec;
    665    sn->vm_clock_nsec = sn_info->vm_clock_nsec;
    666    sn->icount = sn_info->icount;
    667    sn->extra_data_size = sizeof(QCowSnapshotExtraData);
    668
    669    /* Allocate the L1 table of the snapshot and copy the current one there. */
    670    l1_table_offset = qcow2_alloc_clusters(bs, s->l1_size * L1E_SIZE);
    671    if (l1_table_offset < 0) {
    672        ret = l1_table_offset;
    673        goto fail;
    674    }
    675
    676    sn->l1_table_offset = l1_table_offset;
    677    sn->l1_size = s->l1_size;
    678
    679    l1_table = g_try_new(uint64_t, s->l1_size);
    680    if (s->l1_size && l1_table == NULL) {
    681        ret = -ENOMEM;
    682        goto fail;
    683    }
    684
    685    for(i = 0; i < s->l1_size; i++) {
    686        l1_table[i] = cpu_to_be64(s->l1_table[i]);
    687    }
    688
    689    ret = qcow2_pre_write_overlap_check(bs, 0, sn->l1_table_offset,
    690                                        s->l1_size * L1E_SIZE, false);
    691    if (ret < 0) {
    692        goto fail;
    693    }
    694
    695    ret = bdrv_pwrite(bs->file, sn->l1_table_offset, l1_table,
    696                      s->l1_size * L1E_SIZE);
    697    if (ret < 0) {
    698        goto fail;
    699    }
    700
    701    g_free(l1_table);
    702    l1_table = NULL;
    703
    704    /*
    705     * Increase the refcounts of all clusters and make sure everything is
    706     * stable on disk before updating the snapshot table to contain a pointer
    707     * to the new L1 table.
    708     */
    709    ret = qcow2_update_snapshot_refcount(bs, s->l1_table_offset, s->l1_size, 1);
    710    if (ret < 0) {
    711        goto fail;
    712    }
    713
    714    /* Append the new snapshot to the snapshot list */
    715    new_snapshot_list = g_new(QCowSnapshot, s->nb_snapshots + 1);
    716    if (s->snapshots) {
    717        memcpy(new_snapshot_list, s->snapshots,
    718               s->nb_snapshots * sizeof(QCowSnapshot));
    719        old_snapshot_list = s->snapshots;
    720    }
    721    s->snapshots = new_snapshot_list;
    722    s->snapshots[s->nb_snapshots++] = *sn;
    723
    724    ret = qcow2_write_snapshots(bs);
    725    if (ret < 0) {
    726        g_free(s->snapshots);
    727        s->snapshots = old_snapshot_list;
    728        s->nb_snapshots--;
    729        goto fail;
    730    }
    731
    732    g_free(old_snapshot_list);
    733
    734    /* The VM state isn't needed any more in the active L1 table; in fact, it
    735     * hurts by causing expensive COW for the next snapshot. */
    736    qcow2_cluster_discard(bs, qcow2_vm_state_offset(s),
    737                          ROUND_UP(sn->vm_state_size, s->cluster_size),
    738                          QCOW2_DISCARD_NEVER, false);
    739
    740#ifdef DEBUG_ALLOC
    741    {
    742      BdrvCheckResult result = {0};
    743      qcow2_check_refcounts(bs, &result, 0);
    744    }
    745#endif
    746    return 0;
    747
    748fail:
    749    g_free(sn->id_str);
    750    g_free(sn->name);
    751    g_free(l1_table);
    752
    753    return ret;
    754}
    755
    756/* copy the snapshot 'snapshot_name' into the current disk image */
    757int qcow2_snapshot_goto(BlockDriverState *bs, const char *snapshot_id)
    758{
    759    BDRVQcow2State *s = bs->opaque;
    760    QCowSnapshot *sn;
    761    Error *local_err = NULL;
    762    int i, snapshot_index;
    763    int cur_l1_bytes, sn_l1_bytes;
    764    int ret;
    765    uint64_t *sn_l1_table = NULL;
    766
    767    if (has_data_file(bs)) {
    768        return -ENOTSUP;
    769    }
    770
    771    /* Search the snapshot */
    772    snapshot_index = find_snapshot_by_id_or_name(bs, snapshot_id);
    773    if (snapshot_index < 0) {
    774        return -ENOENT;
    775    }
    776    sn = &s->snapshots[snapshot_index];
    777
    778    ret = qcow2_validate_table(bs, sn->l1_table_offset, sn->l1_size,
    779                               L1E_SIZE, QCOW_MAX_L1_SIZE,
    780                               "Snapshot L1 table", &local_err);
    781    if (ret < 0) {
    782        error_report_err(local_err);
    783        goto fail;
    784    }
    785
    786    if (sn->disk_size != bs->total_sectors * BDRV_SECTOR_SIZE) {
    787        BlockBackend *blk = blk_new_with_bs(bs, BLK_PERM_RESIZE, BLK_PERM_ALL,
    788                                            &local_err);
    789        if (!blk) {
    790            error_report_err(local_err);
    791            ret = -ENOTSUP;
    792            goto fail;
    793        }
    794
    795        ret = blk_truncate(blk, sn->disk_size, true, PREALLOC_MODE_OFF, 0,
    796                           &local_err);
    797        blk_unref(blk);
    798        if (ret < 0) {
    799            error_report_err(local_err);
    800            goto fail;
    801        }
    802    }
    803
    804    /*
    805     * Make sure that the current L1 table is big enough to contain the whole
    806     * L1 table of the snapshot. If the snapshot L1 table is smaller, the
    807     * current one must be padded with zeros.
    808     */
    809    ret = qcow2_grow_l1_table(bs, sn->l1_size, true);
    810    if (ret < 0) {
    811        goto fail;
    812    }
    813
    814    cur_l1_bytes = s->l1_size * L1E_SIZE;
    815    sn_l1_bytes = sn->l1_size * L1E_SIZE;
    816
    817    /*
    818     * Copy the snapshot L1 table to the current L1 table.
    819     *
    820     * Before overwriting the old current L1 table on disk, make sure to
    821     * increase all refcounts for the clusters referenced by the new one.
    822     * Decrease the refcount referenced by the old one only when the L1
    823     * table is overwritten.
    824     */
    825    sn_l1_table = g_try_malloc0(cur_l1_bytes);
    826    if (cur_l1_bytes && sn_l1_table == NULL) {
    827        ret = -ENOMEM;
    828        goto fail;
    829    }
    830
    831    ret = bdrv_pread(bs->file, sn->l1_table_offset,
    832                     sn_l1_table, sn_l1_bytes);
    833    if (ret < 0) {
    834        goto fail;
    835    }
    836
    837    ret = qcow2_update_snapshot_refcount(bs, sn->l1_table_offset,
    838                                         sn->l1_size, 1);
    839    if (ret < 0) {
    840        goto fail;
    841    }
    842
    843    ret = qcow2_pre_write_overlap_check(bs, QCOW2_OL_ACTIVE_L1,
    844                                        s->l1_table_offset, cur_l1_bytes,
    845                                        false);
    846    if (ret < 0) {
    847        goto fail;
    848    }
    849
    850    ret = bdrv_pwrite_sync(bs->file, s->l1_table_offset, sn_l1_table,
    851                           cur_l1_bytes);
    852    if (ret < 0) {
    853        goto fail;
    854    }
    855
    856    /*
    857     * Decrease refcount of clusters of current L1 table.
    858     *
    859     * At this point, the in-memory s->l1_table points to the old L1 table,
    860     * whereas on disk we already have the new one.
    861     *
    862     * qcow2_update_snapshot_refcount special cases the current L1 table to use
    863     * the in-memory data instead of really using the offset to load a new one,
    864     * which is why this works.
    865     */
    866    ret = qcow2_update_snapshot_refcount(bs, s->l1_table_offset,
    867                                         s->l1_size, -1);
    868
    869    /*
    870     * Now update the in-memory L1 table to be in sync with the on-disk one. We
    871     * need to do this even if updating refcounts failed.
    872     */
    873    for(i = 0;i < s->l1_size; i++) {
    874        s->l1_table[i] = be64_to_cpu(sn_l1_table[i]);
    875    }
    876
    877    if (ret < 0) {
    878        goto fail;
    879    }
    880
    881    g_free(sn_l1_table);
    882    sn_l1_table = NULL;
    883
    884    /*
    885     * Update QCOW_OFLAG_COPIED in the active L1 table (it may have changed
    886     * when we decreased the refcount of the old snapshot.
    887     */
    888    ret = qcow2_update_snapshot_refcount(bs, s->l1_table_offset, s->l1_size, 0);
    889    if (ret < 0) {
    890        goto fail;
    891    }
    892
    893#ifdef DEBUG_ALLOC
    894    {
    895        BdrvCheckResult result = {0};
    896        qcow2_check_refcounts(bs, &result, 0);
    897    }
    898#endif
    899    return 0;
    900
    901fail:
    902    g_free(sn_l1_table);
    903    return ret;
    904}
    905
    906int qcow2_snapshot_delete(BlockDriverState *bs,
    907                          const char *snapshot_id,
    908                          const char *name,
    909                          Error **errp)
    910{
    911    BDRVQcow2State *s = bs->opaque;
    912    QCowSnapshot sn;
    913    int snapshot_index, ret;
    914
    915    if (has_data_file(bs)) {
    916        return -ENOTSUP;
    917    }
    918
    919    /* Search the snapshot */
    920    snapshot_index = find_snapshot_by_id_and_name(bs, snapshot_id, name);
    921    if (snapshot_index < 0) {
    922        error_setg(errp, "Can't find the snapshot");
    923        return -ENOENT;
    924    }
    925    sn = s->snapshots[snapshot_index];
    926
    927    ret = qcow2_validate_table(bs, sn.l1_table_offset, sn.l1_size,
    928                               L1E_SIZE, QCOW_MAX_L1_SIZE,
    929                               "Snapshot L1 table", errp);
    930    if (ret < 0) {
    931        return ret;
    932    }
    933
    934    /* Remove it from the snapshot list */
    935    memmove(s->snapshots + snapshot_index,
    936            s->snapshots + snapshot_index + 1,
    937            (s->nb_snapshots - snapshot_index - 1) * sizeof(sn));
    938    s->nb_snapshots--;
    939    ret = qcow2_write_snapshots(bs);
    940    if (ret < 0) {
    941        error_setg_errno(errp, -ret,
    942                         "Failed to remove snapshot from snapshot list");
    943        return ret;
    944    }
    945
    946    /*
    947     * The snapshot is now unused, clean up. If we fail after this point, we
    948     * won't recover but just leak clusters.
    949     */
    950    g_free(sn.unknown_extra_data);
    951    g_free(sn.id_str);
    952    g_free(sn.name);
    953
    954    /*
    955     * Now decrease the refcounts of clusters referenced by the snapshot and
    956     * free the L1 table.
    957     */
    958    ret = qcow2_update_snapshot_refcount(bs, sn.l1_table_offset,
    959                                         sn.l1_size, -1);
    960    if (ret < 0) {
    961        error_setg_errno(errp, -ret, "Failed to free the cluster and L1 table");
    962        return ret;
    963    }
    964    qcow2_free_clusters(bs, sn.l1_table_offset, sn.l1_size * L1E_SIZE,
    965                        QCOW2_DISCARD_SNAPSHOT);
    966
    967    /* must update the copied flag on the current cluster offsets */
    968    ret = qcow2_update_snapshot_refcount(bs, s->l1_table_offset, s->l1_size, 0);
    969    if (ret < 0) {
    970        error_setg_errno(errp, -ret,
    971                         "Failed to update snapshot status in disk");
    972        return ret;
    973    }
    974
    975#ifdef DEBUG_ALLOC
    976    {
    977        BdrvCheckResult result = {0};
    978        qcow2_check_refcounts(bs, &result, 0);
    979    }
    980#endif
    981    return 0;
    982}
    983
    984int qcow2_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab)
    985{
    986    BDRVQcow2State *s = bs->opaque;
    987    QEMUSnapshotInfo *sn_tab, *sn_info;
    988    QCowSnapshot *sn;
    989    int i;
    990
    991    if (has_data_file(bs)) {
    992        return -ENOTSUP;
    993    }
    994    if (!s->nb_snapshots) {
    995        *psn_tab = NULL;
    996        return s->nb_snapshots;
    997    }
    998
    999    sn_tab = g_new0(QEMUSnapshotInfo, s->nb_snapshots);
   1000    for(i = 0; i < s->nb_snapshots; i++) {
   1001        sn_info = sn_tab + i;
   1002        sn = s->snapshots + i;
   1003        pstrcpy(sn_info->id_str, sizeof(sn_info->id_str),
   1004                sn->id_str);
   1005        pstrcpy(sn_info->name, sizeof(sn_info->name),
   1006                sn->name);
   1007        sn_info->vm_state_size = sn->vm_state_size;
   1008        sn_info->date_sec = sn->date_sec;
   1009        sn_info->date_nsec = sn->date_nsec;
   1010        sn_info->vm_clock_nsec = sn->vm_clock_nsec;
   1011        sn_info->icount = sn->icount;
   1012    }
   1013    *psn_tab = sn_tab;
   1014    return s->nb_snapshots;
   1015}
   1016
   1017int qcow2_snapshot_load_tmp(BlockDriverState *bs,
   1018                            const char *snapshot_id,
   1019                            const char *name,
   1020                            Error **errp)
   1021{
   1022    int i, snapshot_index;
   1023    BDRVQcow2State *s = bs->opaque;
   1024    QCowSnapshot *sn;
   1025    uint64_t *new_l1_table;
   1026    int new_l1_bytes;
   1027    int ret;
   1028
   1029    assert(bdrv_is_read_only(bs));
   1030
   1031    /* Search the snapshot */
   1032    snapshot_index = find_snapshot_by_id_and_name(bs, snapshot_id, name);
   1033    if (snapshot_index < 0) {
   1034        error_setg(errp,
   1035                   "Can't find snapshot");
   1036        return -ENOENT;
   1037    }
   1038    sn = &s->snapshots[snapshot_index];
   1039
   1040    /* Allocate and read in the snapshot's L1 table */
   1041    ret = qcow2_validate_table(bs, sn->l1_table_offset, sn->l1_size,
   1042                               L1E_SIZE, QCOW_MAX_L1_SIZE,
   1043                               "Snapshot L1 table", errp);
   1044    if (ret < 0) {
   1045        return ret;
   1046    }
   1047    new_l1_bytes = sn->l1_size * L1E_SIZE;
   1048    new_l1_table = qemu_try_blockalign(bs->file->bs, new_l1_bytes);
   1049    if (new_l1_table == NULL) {
   1050        return -ENOMEM;
   1051    }
   1052
   1053    ret = bdrv_pread(bs->file, sn->l1_table_offset,
   1054                     new_l1_table, new_l1_bytes);
   1055    if (ret < 0) {
   1056        error_setg(errp, "Failed to read l1 table for snapshot");
   1057        qemu_vfree(new_l1_table);
   1058        return ret;
   1059    }
   1060
   1061    /* Switch the L1 table */
   1062    qemu_vfree(s->l1_table);
   1063
   1064    s->l1_size = sn->l1_size;
   1065    s->l1_table_offset = sn->l1_table_offset;
   1066    s->l1_table = new_l1_table;
   1067
   1068    for(i = 0;i < s->l1_size; i++) {
   1069        be64_to_cpus(&s->l1_table[i]);
   1070    }
   1071
   1072    return 0;
   1073}