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-bitmap.c (52414B)


      1/*
      2 * Bitmaps for the QCOW version 2 format
      3 *
      4 * Copyright (c) 2014-2017 Vladimir Sementsov-Ogievskiy
      5 *
      6 * This file is derived from qcow2-snapshot.c, original copyright:
      7 * Copyright (c) 2004-2006 Fabrice Bellard
      8 *
      9 * Permission is hereby granted, free of charge, to any person obtaining a copy
     10 * of this software and associated documentation files (the "Software"), to deal
     11 * in the Software without restriction, including without limitation the rights
     12 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     13 * copies of the Software, and to permit persons to whom the Software is
     14 * furnished to do so, subject to the following conditions:
     15 *
     16 * The above copyright notice and this permission notice shall be included in
     17 * all copies or substantial portions of the Software.
     18 *
     19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     24 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     25 * THE SOFTWARE.
     26 */
     27
     28#include "qemu/osdep.h"
     29#include "qapi/error.h"
     30#include "qemu/cutils.h"
     31
     32#include "qcow2.h"
     33
     34/* NOTICE: BME here means Bitmaps Extension and used as a namespace for
     35 * _internal_ constants. Please do not use this _internal_ abbreviation for
     36 * other needs and/or outside of this file. */
     37
     38/* Bitmap directory entry constraints */
     39#define BME_MAX_TABLE_SIZE 0x8000000
     40#define BME_MAX_PHYS_SIZE 0x20000000 /* restrict BdrvDirtyBitmap size in RAM */
     41#define BME_MAX_GRANULARITY_BITS 31
     42#define BME_MIN_GRANULARITY_BITS 9
     43#define BME_MAX_NAME_SIZE 1023
     44
     45/* Size of bitmap table entries */
     46#define BME_TABLE_ENTRY_SIZE (sizeof(uint64_t))
     47
     48QEMU_BUILD_BUG_ON(BME_MAX_NAME_SIZE != BDRV_BITMAP_MAX_NAME_SIZE);
     49
     50#if BME_MAX_TABLE_SIZE * 8ULL > INT_MAX
     51#error In the code bitmap table physical size assumed to fit into int
     52#endif
     53
     54/* Bitmap directory entry flags */
     55#define BME_RESERVED_FLAGS 0xfffffffcU
     56#define BME_FLAG_IN_USE (1U << 0)
     57#define BME_FLAG_AUTO   (1U << 1)
     58
     59/* bits [1, 8] U [56, 63] are reserved */
     60#define BME_TABLE_ENTRY_RESERVED_MASK 0xff000000000001feULL
     61#define BME_TABLE_ENTRY_OFFSET_MASK 0x00fffffffffffe00ULL
     62#define BME_TABLE_ENTRY_FLAG_ALL_ONES (1ULL << 0)
     63
     64typedef struct QEMU_PACKED Qcow2BitmapDirEntry {
     65    /* header is 8 byte aligned */
     66    uint64_t bitmap_table_offset;
     67
     68    uint32_t bitmap_table_size;
     69    uint32_t flags;
     70
     71    uint8_t type;
     72    uint8_t granularity_bits;
     73    uint16_t name_size;
     74    uint32_t extra_data_size;
     75    /* extra data follows  */
     76    /* name follows  */
     77} Qcow2BitmapDirEntry;
     78
     79typedef struct Qcow2BitmapTable {
     80    uint64_t offset;
     81    uint32_t size; /* number of 64bit entries */
     82    QSIMPLEQ_ENTRY(Qcow2BitmapTable) entry;
     83} Qcow2BitmapTable;
     84
     85typedef struct Qcow2Bitmap {
     86    Qcow2BitmapTable table;
     87    uint32_t flags;
     88    uint8_t granularity_bits;
     89    char *name;
     90
     91    BdrvDirtyBitmap *dirty_bitmap;
     92
     93    QSIMPLEQ_ENTRY(Qcow2Bitmap) entry;
     94} Qcow2Bitmap;
     95typedef QSIMPLEQ_HEAD(Qcow2BitmapList, Qcow2Bitmap) Qcow2BitmapList;
     96
     97typedef enum BitmapType {
     98    BT_DIRTY_TRACKING_BITMAP = 1
     99} BitmapType;
    100
    101static inline bool can_write(BlockDriverState *bs)
    102{
    103    return !bdrv_is_read_only(bs) && !(bdrv_get_flags(bs) & BDRV_O_INACTIVE);
    104}
    105
    106static int update_header_sync(BlockDriverState *bs)
    107{
    108    int ret;
    109
    110    ret = qcow2_update_header(bs);
    111    if (ret < 0) {
    112        return ret;
    113    }
    114
    115    return bdrv_flush(bs->file->bs);
    116}
    117
    118static inline void bitmap_table_to_be(uint64_t *bitmap_table, size_t size)
    119{
    120    size_t i;
    121
    122    for (i = 0; i < size; ++i) {
    123        bitmap_table[i] = cpu_to_be64(bitmap_table[i]);
    124    }
    125}
    126
    127static int check_table_entry(uint64_t entry, int cluster_size)
    128{
    129    uint64_t offset;
    130
    131    if (entry & BME_TABLE_ENTRY_RESERVED_MASK) {
    132        return -EINVAL;
    133    }
    134
    135    offset = entry & BME_TABLE_ENTRY_OFFSET_MASK;
    136    if (offset != 0) {
    137        /* if offset specified, bit 0 is reserved */
    138        if (entry & BME_TABLE_ENTRY_FLAG_ALL_ONES) {
    139            return -EINVAL;
    140        }
    141
    142        if (offset % cluster_size != 0) {
    143            return -EINVAL;
    144        }
    145    }
    146
    147    return 0;
    148}
    149
    150static int64_t get_bitmap_bytes_needed(int64_t len, uint32_t granularity)
    151{
    152    int64_t num_bits = DIV_ROUND_UP(len, granularity);
    153
    154    return DIV_ROUND_UP(num_bits, 8);
    155}
    156
    157static int check_constraints_on_bitmap(BlockDriverState *bs,
    158                                       const char *name,
    159                                       uint32_t granularity,
    160                                       Error **errp)
    161{
    162    BDRVQcow2State *s = bs->opaque;
    163    int granularity_bits = ctz32(granularity);
    164    int64_t len = bdrv_getlength(bs);
    165    int64_t bitmap_bytes;
    166
    167    assert(granularity > 0);
    168    assert((granularity & (granularity - 1)) == 0);
    169
    170    if (len < 0) {
    171        error_setg_errno(errp, -len, "Failed to get size of '%s'",
    172                         bdrv_get_device_or_node_name(bs));
    173        return len;
    174    }
    175
    176    if (granularity_bits > BME_MAX_GRANULARITY_BITS) {
    177        error_setg(errp, "Granularity exceeds maximum (%llu bytes)",
    178                   1ULL << BME_MAX_GRANULARITY_BITS);
    179        return -EINVAL;
    180    }
    181    if (granularity_bits < BME_MIN_GRANULARITY_BITS) {
    182        error_setg(errp, "Granularity is under minimum (%llu bytes)",
    183                   1ULL << BME_MIN_GRANULARITY_BITS);
    184        return -EINVAL;
    185    }
    186
    187    bitmap_bytes = get_bitmap_bytes_needed(len, granularity);
    188    if ((bitmap_bytes > (uint64_t)BME_MAX_PHYS_SIZE) ||
    189        (bitmap_bytes > (uint64_t)BME_MAX_TABLE_SIZE * s->cluster_size))
    190    {
    191        error_setg(errp, "Too much space will be occupied by the bitmap. "
    192                   "Use larger granularity");
    193        return -EINVAL;
    194    }
    195
    196    if (strlen(name) > BME_MAX_NAME_SIZE) {
    197        error_setg(errp, "Name length exceeds maximum (%u characters)",
    198                   BME_MAX_NAME_SIZE);
    199        return -EINVAL;
    200    }
    201
    202    return 0;
    203}
    204
    205static void clear_bitmap_table(BlockDriverState *bs, uint64_t *bitmap_table,
    206                               uint32_t bitmap_table_size)
    207{
    208    BDRVQcow2State *s = bs->opaque;
    209    int i;
    210
    211    for (i = 0; i < bitmap_table_size; ++i) {
    212        uint64_t addr = bitmap_table[i] & BME_TABLE_ENTRY_OFFSET_MASK;
    213        if (!addr) {
    214            continue;
    215        }
    216
    217        qcow2_free_clusters(bs, addr, s->cluster_size, QCOW2_DISCARD_ALWAYS);
    218        bitmap_table[i] = 0;
    219    }
    220}
    221
    222static int bitmap_table_load(BlockDriverState *bs, Qcow2BitmapTable *tb,
    223                             uint64_t **bitmap_table)
    224{
    225    int ret;
    226    BDRVQcow2State *s = bs->opaque;
    227    uint32_t i;
    228    uint64_t *table;
    229
    230    assert(tb->size != 0);
    231    table = g_try_new(uint64_t, tb->size);
    232    if (table == NULL) {
    233        return -ENOMEM;
    234    }
    235
    236    assert(tb->size <= BME_MAX_TABLE_SIZE);
    237    ret = bdrv_pread(bs->file, tb->offset,
    238                     table, tb->size * BME_TABLE_ENTRY_SIZE);
    239    if (ret < 0) {
    240        goto fail;
    241    }
    242
    243    for (i = 0; i < tb->size; ++i) {
    244        table[i] = be64_to_cpu(table[i]);
    245        ret = check_table_entry(table[i], s->cluster_size);
    246        if (ret < 0) {
    247            goto fail;
    248        }
    249    }
    250
    251    *bitmap_table = table;
    252    return 0;
    253
    254fail:
    255    g_free(table);
    256
    257    return ret;
    258}
    259
    260static int free_bitmap_clusters(BlockDriverState *bs, Qcow2BitmapTable *tb)
    261{
    262    int ret;
    263    uint64_t *bitmap_table;
    264
    265    ret = bitmap_table_load(bs, tb, &bitmap_table);
    266    if (ret < 0) {
    267        return ret;
    268    }
    269
    270    clear_bitmap_table(bs, bitmap_table, tb->size);
    271    qcow2_free_clusters(bs, tb->offset, tb->size * BME_TABLE_ENTRY_SIZE,
    272                        QCOW2_DISCARD_OTHER);
    273    g_free(bitmap_table);
    274
    275    tb->offset = 0;
    276    tb->size = 0;
    277
    278    return 0;
    279}
    280
    281/* load_bitmap_data
    282 * @bitmap_table entries must satisfy specification constraints.
    283 * @bitmap must be cleared */
    284static int load_bitmap_data(BlockDriverState *bs,
    285                            const uint64_t *bitmap_table,
    286                            uint32_t bitmap_table_size,
    287                            BdrvDirtyBitmap *bitmap)
    288{
    289    int ret = 0;
    290    BDRVQcow2State *s = bs->opaque;
    291    uint64_t offset, limit;
    292    uint64_t bm_size = bdrv_dirty_bitmap_size(bitmap);
    293    uint8_t *buf = NULL;
    294    uint64_t i, tab_size =
    295            size_to_clusters(s,
    296                bdrv_dirty_bitmap_serialization_size(bitmap, 0, bm_size));
    297
    298    if (tab_size != bitmap_table_size || tab_size > BME_MAX_TABLE_SIZE) {
    299        return -EINVAL;
    300    }
    301
    302    buf = g_malloc(s->cluster_size);
    303    limit = bdrv_dirty_bitmap_serialization_coverage(s->cluster_size, bitmap);
    304    for (i = 0, offset = 0; i < tab_size; ++i, offset += limit) {
    305        uint64_t count = MIN(bm_size - offset, limit);
    306        uint64_t entry = bitmap_table[i];
    307        uint64_t data_offset = entry & BME_TABLE_ENTRY_OFFSET_MASK;
    308
    309        assert(check_table_entry(entry, s->cluster_size) == 0);
    310
    311        if (data_offset == 0) {
    312            if (entry & BME_TABLE_ENTRY_FLAG_ALL_ONES) {
    313                bdrv_dirty_bitmap_deserialize_ones(bitmap, offset, count,
    314                                                   false);
    315            } else {
    316                /* No need to deserialize zeros because the dirty bitmap is
    317                 * already cleared */
    318            }
    319        } else {
    320            ret = bdrv_pread(bs->file, data_offset, buf, s->cluster_size);
    321            if (ret < 0) {
    322                goto finish;
    323            }
    324            bdrv_dirty_bitmap_deserialize_part(bitmap, buf, offset, count,
    325                                               false);
    326        }
    327    }
    328    ret = 0;
    329
    330    bdrv_dirty_bitmap_deserialize_finish(bitmap);
    331
    332finish:
    333    g_free(buf);
    334
    335    return ret;
    336}
    337
    338static BdrvDirtyBitmap *load_bitmap(BlockDriverState *bs,
    339                                    Qcow2Bitmap *bm, Error **errp)
    340{
    341    int ret;
    342    uint64_t *bitmap_table = NULL;
    343    uint32_t granularity;
    344    BdrvDirtyBitmap *bitmap = NULL;
    345
    346    granularity = 1U << bm->granularity_bits;
    347    bitmap = bdrv_create_dirty_bitmap(bs, granularity, bm->name, errp);
    348    if (bitmap == NULL) {
    349        goto fail;
    350    }
    351
    352    if (bm->flags & BME_FLAG_IN_USE) {
    353        /* Data is unusable, skip loading it */
    354        return bitmap;
    355    }
    356
    357    ret = bitmap_table_load(bs, &bm->table, &bitmap_table);
    358    if (ret < 0) {
    359        error_setg_errno(errp, -ret,
    360                         "Could not read bitmap_table table from image for "
    361                         "bitmap '%s'", bm->name);
    362        goto fail;
    363    }
    364
    365    ret = load_bitmap_data(bs, bitmap_table, bm->table.size, bitmap);
    366    if (ret < 0) {
    367        error_setg_errno(errp, -ret, "Could not read bitmap '%s' from image",
    368                         bm->name);
    369        goto fail;
    370    }
    371
    372    g_free(bitmap_table);
    373    return bitmap;
    374
    375fail:
    376    g_free(bitmap_table);
    377    if (bitmap != NULL) {
    378        bdrv_release_dirty_bitmap(bitmap);
    379    }
    380
    381    return NULL;
    382}
    383
    384/*
    385 * Bitmap List
    386 */
    387
    388/*
    389 * Bitmap List private functions
    390 * Only Bitmap List knows about bitmap directory structure in Qcow2.
    391 */
    392
    393static inline void bitmap_dir_entry_to_cpu(Qcow2BitmapDirEntry *entry)
    394{
    395    entry->bitmap_table_offset = be64_to_cpu(entry->bitmap_table_offset);
    396    entry->bitmap_table_size = be32_to_cpu(entry->bitmap_table_size);
    397    entry->flags = be32_to_cpu(entry->flags);
    398    entry->name_size = be16_to_cpu(entry->name_size);
    399    entry->extra_data_size = be32_to_cpu(entry->extra_data_size);
    400}
    401
    402static inline void bitmap_dir_entry_to_be(Qcow2BitmapDirEntry *entry)
    403{
    404    entry->bitmap_table_offset = cpu_to_be64(entry->bitmap_table_offset);
    405    entry->bitmap_table_size = cpu_to_be32(entry->bitmap_table_size);
    406    entry->flags = cpu_to_be32(entry->flags);
    407    entry->name_size = cpu_to_be16(entry->name_size);
    408    entry->extra_data_size = cpu_to_be32(entry->extra_data_size);
    409}
    410
    411static inline int calc_dir_entry_size(size_t name_size, size_t extra_data_size)
    412{
    413    int size = sizeof(Qcow2BitmapDirEntry) + name_size + extra_data_size;
    414    return ROUND_UP(size, 8);
    415}
    416
    417static inline int dir_entry_size(Qcow2BitmapDirEntry *entry)
    418{
    419    return calc_dir_entry_size(entry->name_size, entry->extra_data_size);
    420}
    421
    422static inline const char *dir_entry_name_field(Qcow2BitmapDirEntry *entry)
    423{
    424    return (const char *)(entry + 1) + entry->extra_data_size;
    425}
    426
    427static inline char *dir_entry_copy_name(Qcow2BitmapDirEntry *entry)
    428{
    429    const char *name_field = dir_entry_name_field(entry);
    430    return g_strndup(name_field, entry->name_size);
    431}
    432
    433static inline Qcow2BitmapDirEntry *next_dir_entry(Qcow2BitmapDirEntry *entry)
    434{
    435    return (Qcow2BitmapDirEntry *)((uint8_t *)entry + dir_entry_size(entry));
    436}
    437
    438static int check_dir_entry(BlockDriverState *bs, Qcow2BitmapDirEntry *entry)
    439{
    440    BDRVQcow2State *s = bs->opaque;
    441    uint64_t phys_bitmap_bytes;
    442    int64_t len;
    443
    444    bool fail = (entry->bitmap_table_size == 0) ||
    445                (entry->bitmap_table_offset == 0) ||
    446                (entry->bitmap_table_offset % s->cluster_size) ||
    447                (entry->bitmap_table_size > BME_MAX_TABLE_SIZE) ||
    448                (entry->granularity_bits > BME_MAX_GRANULARITY_BITS) ||
    449                (entry->granularity_bits < BME_MIN_GRANULARITY_BITS) ||
    450                (entry->flags & BME_RESERVED_FLAGS) ||
    451                (entry->name_size > BME_MAX_NAME_SIZE) ||
    452                (entry->type != BT_DIRTY_TRACKING_BITMAP);
    453
    454    if (fail) {
    455        return -EINVAL;
    456    }
    457
    458    phys_bitmap_bytes = (uint64_t)entry->bitmap_table_size * s->cluster_size;
    459    len = bdrv_getlength(bs);
    460
    461    if (len < 0) {
    462        return len;
    463    }
    464
    465    if (phys_bitmap_bytes > BME_MAX_PHYS_SIZE) {
    466        return -EINVAL;
    467    }
    468
    469    if (!(entry->flags & BME_FLAG_IN_USE) &&
    470        (len > ((phys_bitmap_bytes * 8) << entry->granularity_bits)))
    471    {
    472        /*
    473         * We've loaded a valid bitmap (IN_USE not set) or we are going to
    474         * store a valid bitmap, but the allocated bitmap table size is not
    475         * enough to store this bitmap.
    476         *
    477         * Note, that it's OK to have an invalid bitmap with invalid size due
    478         * to a bitmap that was not correctly saved after image resize.
    479         */
    480        return -EINVAL;
    481    }
    482
    483    return 0;
    484}
    485
    486static inline void bitmap_directory_to_be(uint8_t *dir, size_t size)
    487{
    488    uint8_t *end = dir + size;
    489    while (dir < end) {
    490        Qcow2BitmapDirEntry *e = (Qcow2BitmapDirEntry *)dir;
    491        dir += dir_entry_size(e);
    492
    493        bitmap_dir_entry_to_be(e);
    494    }
    495}
    496
    497/*
    498 * Bitmap List public functions
    499 */
    500
    501static void bitmap_free(Qcow2Bitmap *bm)
    502{
    503    if (bm == NULL) {
    504        return;
    505    }
    506
    507    g_free(bm->name);
    508    g_free(bm);
    509}
    510
    511static void bitmap_list_free(Qcow2BitmapList *bm_list)
    512{
    513    Qcow2Bitmap *bm;
    514
    515    if (bm_list == NULL) {
    516        return;
    517    }
    518
    519    while ((bm = QSIMPLEQ_FIRST(bm_list)) != NULL) {
    520        QSIMPLEQ_REMOVE_HEAD(bm_list, entry);
    521        bitmap_free(bm);
    522    }
    523
    524    g_free(bm_list);
    525}
    526
    527static Qcow2BitmapList *bitmap_list_new(void)
    528{
    529    Qcow2BitmapList *bm_list = g_new(Qcow2BitmapList, 1);
    530    QSIMPLEQ_INIT(bm_list);
    531
    532    return bm_list;
    533}
    534
    535static uint32_t bitmap_list_count(Qcow2BitmapList *bm_list)
    536{
    537    Qcow2Bitmap *bm;
    538    uint32_t nb_bitmaps = 0;
    539
    540    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
    541        nb_bitmaps++;
    542    }
    543
    544    return nb_bitmaps;
    545}
    546
    547/* bitmap_list_load
    548 * Get bitmap list from qcow2 image. Actually reads bitmap directory,
    549 * checks it and convert to bitmap list.
    550 */
    551static Qcow2BitmapList *bitmap_list_load(BlockDriverState *bs, uint64_t offset,
    552                                         uint64_t size, Error **errp)
    553{
    554    int ret;
    555    BDRVQcow2State *s = bs->opaque;
    556    uint8_t *dir, *dir_end;
    557    Qcow2BitmapDirEntry *e;
    558    uint32_t nb_dir_entries = 0;
    559    Qcow2BitmapList *bm_list = NULL;
    560
    561    if (size == 0) {
    562        error_setg(errp, "Requested bitmap directory size is zero");
    563        return NULL;
    564    }
    565
    566    if (size > QCOW2_MAX_BITMAP_DIRECTORY_SIZE) {
    567        error_setg(errp, "Requested bitmap directory size is too big");
    568        return NULL;
    569    }
    570
    571    dir = g_try_malloc(size);
    572    if (dir == NULL) {
    573        error_setg(errp, "Failed to allocate space for bitmap directory");
    574        return NULL;
    575    }
    576    dir_end = dir + size;
    577
    578    ret = bdrv_pread(bs->file, offset, dir, size);
    579    if (ret < 0) {
    580        error_setg_errno(errp, -ret, "Failed to read bitmap directory");
    581        goto fail;
    582    }
    583
    584    bm_list = bitmap_list_new();
    585    for (e = (Qcow2BitmapDirEntry *)dir;
    586         e < (Qcow2BitmapDirEntry *)dir_end;
    587         e = next_dir_entry(e))
    588    {
    589        Qcow2Bitmap *bm;
    590
    591        if ((uint8_t *)(e + 1) > dir_end) {
    592            goto broken_dir;
    593        }
    594
    595        if (++nb_dir_entries > s->nb_bitmaps) {
    596            error_setg(errp, "More bitmaps found than specified in header"
    597                       " extension");
    598            goto fail;
    599        }
    600        bitmap_dir_entry_to_cpu(e);
    601
    602        if ((uint8_t *)next_dir_entry(e) > dir_end) {
    603            goto broken_dir;
    604        }
    605
    606        if (e->extra_data_size != 0) {
    607            error_setg(errp, "Bitmap extra data is not supported");
    608            goto fail;
    609        }
    610
    611        ret = check_dir_entry(bs, e);
    612        if (ret < 0) {
    613            error_setg(errp, "Bitmap '%.*s' doesn't satisfy the constraints",
    614                       e->name_size, dir_entry_name_field(e));
    615            goto fail;
    616        }
    617
    618        bm = g_new0(Qcow2Bitmap, 1);
    619        bm->table.offset = e->bitmap_table_offset;
    620        bm->table.size = e->bitmap_table_size;
    621        bm->flags = e->flags;
    622        bm->granularity_bits = e->granularity_bits;
    623        bm->name = dir_entry_copy_name(e);
    624        QSIMPLEQ_INSERT_TAIL(bm_list, bm, entry);
    625    }
    626
    627    if (nb_dir_entries != s->nb_bitmaps) {
    628        error_setg(errp, "Less bitmaps found than specified in header"
    629                         " extension");
    630        goto fail;
    631    }
    632
    633    if ((uint8_t *)e != dir_end) {
    634        goto broken_dir;
    635    }
    636
    637    g_free(dir);
    638    return bm_list;
    639
    640broken_dir:
    641    error_setg(errp, "Broken bitmap directory");
    642
    643fail:
    644    g_free(dir);
    645    bitmap_list_free(bm_list);
    646
    647    return NULL;
    648}
    649
    650int qcow2_check_bitmaps_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
    651                                  void **refcount_table,
    652                                  int64_t *refcount_table_size)
    653{
    654    int ret;
    655    BDRVQcow2State *s = bs->opaque;
    656    Qcow2BitmapList *bm_list;
    657    Qcow2Bitmap *bm;
    658
    659    if (s->nb_bitmaps == 0) {
    660        return 0;
    661    }
    662
    663    ret = qcow2_inc_refcounts_imrt(bs, res, refcount_table, refcount_table_size,
    664                                   s->bitmap_directory_offset,
    665                                   s->bitmap_directory_size);
    666    if (ret < 0) {
    667        return ret;
    668    }
    669
    670    bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
    671                               s->bitmap_directory_size, NULL);
    672    if (bm_list == NULL) {
    673        res->corruptions++;
    674        return -EINVAL;
    675    }
    676
    677    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
    678        uint64_t *bitmap_table = NULL;
    679        int i;
    680
    681        ret = qcow2_inc_refcounts_imrt(bs, res,
    682                                       refcount_table, refcount_table_size,
    683                                       bm->table.offset,
    684                                       bm->table.size * BME_TABLE_ENTRY_SIZE);
    685        if (ret < 0) {
    686            goto out;
    687        }
    688
    689        ret = bitmap_table_load(bs, &bm->table, &bitmap_table);
    690        if (ret < 0) {
    691            res->corruptions++;
    692            goto out;
    693        }
    694
    695        for (i = 0; i < bm->table.size; ++i) {
    696            uint64_t entry = bitmap_table[i];
    697            uint64_t offset = entry & BME_TABLE_ENTRY_OFFSET_MASK;
    698
    699            if (check_table_entry(entry, s->cluster_size) < 0) {
    700                res->corruptions++;
    701                continue;
    702            }
    703
    704            if (offset == 0) {
    705                continue;
    706            }
    707
    708            ret = qcow2_inc_refcounts_imrt(bs, res,
    709                                           refcount_table, refcount_table_size,
    710                                           offset, s->cluster_size);
    711            if (ret < 0) {
    712                g_free(bitmap_table);
    713                goto out;
    714            }
    715        }
    716
    717        g_free(bitmap_table);
    718    }
    719
    720out:
    721    bitmap_list_free(bm_list);
    722
    723    return ret;
    724}
    725
    726/* bitmap_list_store
    727 * Store bitmap list to qcow2 image as a bitmap directory.
    728 * Everything is checked.
    729 */
    730static int bitmap_list_store(BlockDriverState *bs, Qcow2BitmapList *bm_list,
    731                             uint64_t *offset, uint64_t *size, bool in_place)
    732{
    733    int ret;
    734    uint8_t *dir;
    735    int64_t dir_offset = 0;
    736    uint64_t dir_size = 0;
    737    Qcow2Bitmap *bm;
    738    Qcow2BitmapDirEntry *e;
    739
    740    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
    741        dir_size += calc_dir_entry_size(strlen(bm->name), 0);
    742    }
    743
    744    if (dir_size == 0 || dir_size > QCOW2_MAX_BITMAP_DIRECTORY_SIZE) {
    745        return -EINVAL;
    746    }
    747
    748    if (in_place) {
    749        if (*size != dir_size || *offset == 0) {
    750            return -EINVAL;
    751        }
    752
    753        dir_offset = *offset;
    754    }
    755
    756    dir = g_try_malloc0(dir_size);
    757    if (dir == NULL) {
    758        return -ENOMEM;
    759    }
    760
    761    e = (Qcow2BitmapDirEntry *)dir;
    762    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
    763        e->bitmap_table_offset = bm->table.offset;
    764        e->bitmap_table_size = bm->table.size;
    765        e->flags = bm->flags;
    766        e->type = BT_DIRTY_TRACKING_BITMAP;
    767        e->granularity_bits = bm->granularity_bits;
    768        e->name_size = strlen(bm->name);
    769        e->extra_data_size = 0;
    770        memcpy(e + 1, bm->name, e->name_size);
    771
    772        if (check_dir_entry(bs, e) < 0) {
    773            ret = -EINVAL;
    774            goto fail;
    775        }
    776
    777        e = next_dir_entry(e);
    778    }
    779
    780    bitmap_directory_to_be(dir, dir_size);
    781
    782    if (!in_place) {
    783        dir_offset = qcow2_alloc_clusters(bs, dir_size);
    784        if (dir_offset < 0) {
    785            ret = dir_offset;
    786            goto fail;
    787        }
    788    }
    789
    790    /* Actually, even in in-place case ignoring QCOW2_OL_BITMAP_DIRECTORY is not
    791     * necessary, because we drop QCOW2_AUTOCLEAR_BITMAPS when updating bitmap
    792     * directory in-place (actually, turn-off the extension), which is checked
    793     * in qcow2_check_metadata_overlap() */
    794    ret = qcow2_pre_write_overlap_check(
    795            bs, in_place ? QCOW2_OL_BITMAP_DIRECTORY : 0, dir_offset, dir_size,
    796            false);
    797    if (ret < 0) {
    798        goto fail;
    799    }
    800
    801    ret = bdrv_pwrite(bs->file, dir_offset, dir, dir_size);
    802    if (ret < 0) {
    803        goto fail;
    804    }
    805
    806    g_free(dir);
    807
    808    if (!in_place) {
    809        *size = dir_size;
    810        *offset = dir_offset;
    811    }
    812
    813    return 0;
    814
    815fail:
    816    g_free(dir);
    817
    818    if (!in_place && dir_offset > 0) {
    819        qcow2_free_clusters(bs, dir_offset, dir_size, QCOW2_DISCARD_OTHER);
    820    }
    821
    822    return ret;
    823}
    824
    825/*
    826 * Bitmap List end
    827 */
    828
    829static int update_ext_header_and_dir_in_place(BlockDriverState *bs,
    830                                              Qcow2BitmapList *bm_list)
    831{
    832    BDRVQcow2State *s = bs->opaque;
    833    int ret;
    834
    835    if (!(s->autoclear_features & QCOW2_AUTOCLEAR_BITMAPS) ||
    836        bm_list == NULL || QSIMPLEQ_EMPTY(bm_list) ||
    837        bitmap_list_count(bm_list) != s->nb_bitmaps)
    838    {
    839        return -EINVAL;
    840    }
    841
    842    s->autoclear_features &= ~(uint64_t)QCOW2_AUTOCLEAR_BITMAPS;
    843    ret = update_header_sync(bs);
    844    if (ret < 0) {
    845        /* Two variants are possible here:
    846         * 1. Autoclear flag is dropped, all bitmaps will be lost.
    847         * 2. Autoclear flag is not dropped, old state is left.
    848         */
    849        return ret;
    850    }
    851
    852    /* autoclear bit is not set, so we can safely update bitmap directory */
    853
    854    ret = bitmap_list_store(bs, bm_list, &s->bitmap_directory_offset,
    855                            &s->bitmap_directory_size, true);
    856    if (ret < 0) {
    857        /* autoclear bit is cleared, so all leaked clusters would be removed on
    858         * qemu-img check */
    859        return ret;
    860    }
    861
    862    ret = update_header_sync(bs);
    863    if (ret < 0) {
    864        /* autoclear bit is cleared, so all leaked clusters would be removed on
    865         * qemu-img check */
    866        return ret;
    867    }
    868
    869    s->autoclear_features |= QCOW2_AUTOCLEAR_BITMAPS;
    870    return update_header_sync(bs);
    871    /* If final update_header_sync() fails, two variants are possible:
    872     * 1. Autoclear flag is not set, all bitmaps will be lost.
    873     * 2. Autoclear flag is set, header and directory are successfully updated.
    874     */
    875}
    876
    877static int update_ext_header_and_dir(BlockDriverState *bs,
    878                                     Qcow2BitmapList *bm_list)
    879{
    880    BDRVQcow2State *s = bs->opaque;
    881    int ret;
    882    uint64_t new_offset = 0;
    883    uint64_t new_size = 0;
    884    uint32_t new_nb_bitmaps = 0;
    885    uint64_t old_offset = s->bitmap_directory_offset;
    886    uint64_t old_size = s->bitmap_directory_size;
    887    uint32_t old_nb_bitmaps = s->nb_bitmaps;
    888    uint64_t old_autocl = s->autoclear_features;
    889
    890    if (bm_list != NULL && !QSIMPLEQ_EMPTY(bm_list)) {
    891        new_nb_bitmaps = bitmap_list_count(bm_list);
    892
    893        if (new_nb_bitmaps > QCOW2_MAX_BITMAPS) {
    894            return -EINVAL;
    895        }
    896
    897        ret = bitmap_list_store(bs, bm_list, &new_offset, &new_size, false);
    898        if (ret < 0) {
    899            return ret;
    900        }
    901
    902        ret = qcow2_flush_caches(bs);
    903        if (ret < 0) {
    904            goto fail;
    905        }
    906
    907        s->autoclear_features |= QCOW2_AUTOCLEAR_BITMAPS;
    908    } else {
    909        s->autoclear_features &= ~(uint64_t)QCOW2_AUTOCLEAR_BITMAPS;
    910    }
    911
    912    s->bitmap_directory_offset = new_offset;
    913    s->bitmap_directory_size = new_size;
    914    s->nb_bitmaps = new_nb_bitmaps;
    915
    916    ret = update_header_sync(bs);
    917    if (ret < 0) {
    918        goto fail;
    919    }
    920
    921    if (old_size > 0) {
    922        qcow2_free_clusters(bs, old_offset, old_size, QCOW2_DISCARD_OTHER);
    923    }
    924
    925    return 0;
    926
    927fail:
    928    if (new_offset > 0) {
    929        qcow2_free_clusters(bs, new_offset, new_size, QCOW2_DISCARD_OTHER);
    930    }
    931
    932    s->bitmap_directory_offset = old_offset;
    933    s->bitmap_directory_size = old_size;
    934    s->nb_bitmaps = old_nb_bitmaps;
    935    s->autoclear_features = old_autocl;
    936
    937    return ret;
    938}
    939
    940/* for g_slist_foreach for GSList of BdrvDirtyBitmap* elements */
    941static void release_dirty_bitmap_helper(gpointer bitmap,
    942                                        gpointer bs)
    943{
    944    bdrv_release_dirty_bitmap(bitmap);
    945}
    946
    947/* for g_slist_foreach for GSList of BdrvDirtyBitmap* elements */
    948static void set_readonly_helper(gpointer bitmap, gpointer value)
    949{
    950    bdrv_dirty_bitmap_set_readonly(bitmap, (bool)value);
    951}
    952
    953/*
    954 * Return true on success, false on failure.
    955 * If header_updated is not NULL then it is set appropriately regardless of
    956 * the return value.
    957 */
    958bool qcow2_load_dirty_bitmaps(BlockDriverState *bs, bool *header_updated,
    959                              Error **errp)
    960{
    961    BDRVQcow2State *s = bs->opaque;
    962    Qcow2BitmapList *bm_list;
    963    Qcow2Bitmap *bm;
    964    GSList *created_dirty_bitmaps = NULL;
    965    bool needs_update = false;
    966
    967    if (header_updated) {
    968        *header_updated = false;
    969    }
    970
    971    if (s->nb_bitmaps == 0) {
    972        /* No bitmaps - nothing to do */
    973        return true;
    974    }
    975
    976    bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
    977                               s->bitmap_directory_size, errp);
    978    if (bm_list == NULL) {
    979        return false;
    980    }
    981
    982    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
    983        BdrvDirtyBitmap *bitmap;
    984
    985        if ((bm->flags & BME_FLAG_IN_USE) &&
    986            bdrv_find_dirty_bitmap(bs, bm->name))
    987        {
    988            /*
    989             * We already have corresponding BdrvDirtyBitmap, and bitmap in the
    990             * image is marked IN_USE. Firstly, this state is valid, no reason
    991             * to consider existing BdrvDirtyBitmap to be bad. Secondly it's
    992             * absolutely possible, when we do migration with shared storage
    993             * with dirty-bitmaps capability enabled: if the bitmap was loaded
    994             * from this storage before migration start, the storage will
    995             * of-course contain IN_USE outdated version of the bitmap, and we
    996             * should not load it on migration target, as we already have this
    997             * bitmap, being migrated.
    998             */
    999            continue;
   1000        }
   1001
   1002        bitmap = load_bitmap(bs, bm, errp);
   1003        if (bitmap == NULL) {
   1004            goto fail;
   1005        }
   1006
   1007        bdrv_dirty_bitmap_set_persistence(bitmap, true);
   1008        if (bm->flags & BME_FLAG_IN_USE) {
   1009            bdrv_dirty_bitmap_set_inconsistent(bitmap);
   1010        } else {
   1011            /* NB: updated flags only get written if can_write(bs) is true. */
   1012            bm->flags |= BME_FLAG_IN_USE;
   1013            needs_update = true;
   1014        }
   1015        if (!(bm->flags & BME_FLAG_AUTO)) {
   1016            bdrv_disable_dirty_bitmap(bitmap);
   1017        }
   1018        created_dirty_bitmaps =
   1019            g_slist_append(created_dirty_bitmaps, bitmap);
   1020    }
   1021
   1022    if (needs_update && can_write(bs)) {
   1023        /* in_use flags must be updated */
   1024        int ret = update_ext_header_and_dir_in_place(bs, bm_list);
   1025        if (ret < 0) {
   1026            error_setg_errno(errp, -ret, "Can't update bitmap directory");
   1027            goto fail;
   1028        }
   1029        if (header_updated) {
   1030            *header_updated = true;
   1031        }
   1032    }
   1033
   1034    if (!can_write(bs)) {
   1035        g_slist_foreach(created_dirty_bitmaps, set_readonly_helper,
   1036                        (gpointer)true);
   1037    }
   1038
   1039    g_slist_free(created_dirty_bitmaps);
   1040    bitmap_list_free(bm_list);
   1041
   1042    return true;
   1043
   1044fail:
   1045    g_slist_foreach(created_dirty_bitmaps, release_dirty_bitmap_helper, bs);
   1046    g_slist_free(created_dirty_bitmaps);
   1047    bitmap_list_free(bm_list);
   1048
   1049    return false;
   1050}
   1051
   1052
   1053static Qcow2BitmapInfoFlagsList *get_bitmap_info_flags(uint32_t flags)
   1054{
   1055    Qcow2BitmapInfoFlagsList *list = NULL;
   1056    Qcow2BitmapInfoFlagsList **tail = &list;
   1057    int i;
   1058
   1059    static const struct {
   1060        int bme;  /* Bitmap directory entry flags */
   1061        int info; /* The flags to report to the user */
   1062    } map[] = {
   1063        { BME_FLAG_IN_USE, QCOW2_BITMAP_INFO_FLAGS_IN_USE },
   1064        { BME_FLAG_AUTO,   QCOW2_BITMAP_INFO_FLAGS_AUTO },
   1065    };
   1066
   1067    int map_size = ARRAY_SIZE(map);
   1068
   1069    for (i = 0; i < map_size; ++i) {
   1070        if (flags & map[i].bme) {
   1071            QAPI_LIST_APPEND(tail, map[i].info);
   1072            flags &= ~map[i].bme;
   1073        }
   1074    }
   1075    /* Check if the BME_* mapping above is complete */
   1076    assert(!flags);
   1077
   1078    return list;
   1079}
   1080
   1081/*
   1082 * qcow2_get_bitmap_info_list()
   1083 * Returns a list of QCOW2 bitmap details.
   1084 * On success return true with info_list set (note, that if there are no
   1085 * bitmaps, info_list is set to NULL).
   1086 * On failure return false with errp set.
   1087 */
   1088bool qcow2_get_bitmap_info_list(BlockDriverState *bs,
   1089                                Qcow2BitmapInfoList **info_list, Error **errp)
   1090{
   1091    BDRVQcow2State *s = bs->opaque;
   1092    Qcow2BitmapList *bm_list;
   1093    Qcow2Bitmap *bm;
   1094    Qcow2BitmapInfoList **tail;
   1095
   1096    if (s->nb_bitmaps == 0) {
   1097        *info_list = NULL;
   1098        return true;
   1099    }
   1100
   1101    bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
   1102                               s->bitmap_directory_size, errp);
   1103    if (!bm_list) {
   1104        return false;
   1105    }
   1106
   1107    *info_list = NULL;
   1108    tail = info_list;
   1109
   1110    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
   1111        Qcow2BitmapInfo *info = g_new0(Qcow2BitmapInfo, 1);
   1112        info->granularity = 1U << bm->granularity_bits;
   1113        info->name = g_strdup(bm->name);
   1114        info->flags = get_bitmap_info_flags(bm->flags & ~BME_RESERVED_FLAGS);
   1115        QAPI_LIST_APPEND(tail, info);
   1116    }
   1117
   1118    bitmap_list_free(bm_list);
   1119
   1120    return true;
   1121}
   1122
   1123int qcow2_reopen_bitmaps_rw(BlockDriverState *bs, Error **errp)
   1124{
   1125    BDRVQcow2State *s = bs->opaque;
   1126    Qcow2BitmapList *bm_list;
   1127    Qcow2Bitmap *bm;
   1128    GSList *ro_dirty_bitmaps = NULL;
   1129    int ret = -EINVAL;
   1130    bool need_header_update = false;
   1131
   1132    if (s->nb_bitmaps == 0) {
   1133        /* No bitmaps - nothing to do */
   1134        return 0;
   1135    }
   1136
   1137    bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
   1138                               s->bitmap_directory_size, errp);
   1139    if (bm_list == NULL) {
   1140        return -EINVAL;
   1141    }
   1142
   1143    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
   1144        BdrvDirtyBitmap *bitmap = bdrv_find_dirty_bitmap(bs, bm->name);
   1145
   1146        if (!bitmap) {
   1147            error_setg(errp, "Unexpected bitmap '%s' in image '%s'",
   1148                       bm->name, bs->filename);
   1149            goto out;
   1150        }
   1151
   1152        if (!(bm->flags & BME_FLAG_IN_USE)) {
   1153            if (!bdrv_dirty_bitmap_readonly(bitmap)) {
   1154                error_setg(errp, "Corruption: bitmap '%s' is not marked IN_USE "
   1155                           "in the image '%s' and not marked readonly in RAM",
   1156                           bm->name, bs->filename);
   1157                goto out;
   1158            }
   1159            if (bdrv_dirty_bitmap_inconsistent(bitmap)) {
   1160                error_setg(errp, "Corruption: bitmap '%s' is inconsistent but "
   1161                           "is not marked IN_USE in the image '%s'", bm->name,
   1162                           bs->filename);
   1163                goto out;
   1164            }
   1165
   1166            bm->flags |= BME_FLAG_IN_USE;
   1167            need_header_update = true;
   1168        } else {
   1169            /*
   1170             * What if flags already has BME_FLAG_IN_USE ?
   1171             *
   1172             * 1. if we are reopening RW -> RW it's OK, of course.
   1173             * 2. if we are reopening RO -> RW:
   1174             *   2.1 if @bitmap is inconsistent, it's OK. It means that it was
   1175             *       inconsistent (IN_USE) when we loaded it
   1176             *   2.2 if @bitmap is not inconsistent. This seems to be impossible
   1177             *       and implies third party interaction. Let's error-out for
   1178             *       safety.
   1179             */
   1180            if (bdrv_dirty_bitmap_readonly(bitmap) &&
   1181                !bdrv_dirty_bitmap_inconsistent(bitmap))
   1182            {
   1183                error_setg(errp, "Corruption: bitmap '%s' is marked IN_USE "
   1184                           "in the image '%s' but it is readonly and "
   1185                           "consistent in RAM",
   1186                           bm->name, bs->filename);
   1187                goto out;
   1188            }
   1189        }
   1190
   1191        if (bdrv_dirty_bitmap_readonly(bitmap)) {
   1192            ro_dirty_bitmaps = g_slist_append(ro_dirty_bitmaps, bitmap);
   1193        }
   1194    }
   1195
   1196    if (need_header_update) {
   1197        if (!can_write(bs->file->bs) || !(bs->file->perm & BLK_PERM_WRITE)) {
   1198            error_setg(errp, "Failed to reopen bitmaps rw: no write access "
   1199                       "the protocol file");
   1200            goto out;
   1201        }
   1202
   1203        /* in_use flags must be updated */
   1204        ret = update_ext_header_and_dir_in_place(bs, bm_list);
   1205        if (ret < 0) {
   1206            error_setg_errno(errp, -ret, "Cannot update bitmap directory");
   1207            goto out;
   1208        }
   1209    }
   1210
   1211    g_slist_foreach(ro_dirty_bitmaps, set_readonly_helper, false);
   1212    ret = 0;
   1213
   1214out:
   1215    g_slist_free(ro_dirty_bitmaps);
   1216    bitmap_list_free(bm_list);
   1217
   1218    return ret;
   1219}
   1220
   1221/* Checks to see if it's safe to resize bitmaps */
   1222int qcow2_truncate_bitmaps_check(BlockDriverState *bs, Error **errp)
   1223{
   1224    BDRVQcow2State *s = bs->opaque;
   1225    Qcow2BitmapList *bm_list;
   1226    Qcow2Bitmap *bm;
   1227    int ret = 0;
   1228
   1229    if (s->nb_bitmaps == 0) {
   1230        return 0;
   1231    }
   1232
   1233    bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
   1234                               s->bitmap_directory_size, errp);
   1235    if (bm_list == NULL) {
   1236        return -EINVAL;
   1237    }
   1238
   1239    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
   1240        BdrvDirtyBitmap *bitmap = bdrv_find_dirty_bitmap(bs, bm->name);
   1241        if (bitmap == NULL) {
   1242            /*
   1243             * We rely on all bitmaps being in-memory to be able to resize them,
   1244             * Otherwise, we'd need to resize them on disk explicitly
   1245             */
   1246            error_setg(errp, "Cannot resize qcow2 with persistent bitmaps that "
   1247                       "were not loaded into memory");
   1248            ret = -ENOTSUP;
   1249            goto out;
   1250        }
   1251
   1252        /*
   1253         * The checks against readonly and busy are redundant, but certainly
   1254         * do no harm. checks against inconsistent are crucial:
   1255         */
   1256        if (bdrv_dirty_bitmap_check(bitmap, BDRV_BITMAP_DEFAULT, errp)) {
   1257            ret = -ENOTSUP;
   1258            goto out;
   1259        }
   1260    }
   1261
   1262out:
   1263    bitmap_list_free(bm_list);
   1264    return ret;
   1265}
   1266
   1267/* store_bitmap_data()
   1268 * Store bitmap to image, filling bitmap table accordingly.
   1269 */
   1270static uint64_t *store_bitmap_data(BlockDriverState *bs,
   1271                                   BdrvDirtyBitmap *bitmap,
   1272                                   uint32_t *bitmap_table_size, Error **errp)
   1273{
   1274    int ret;
   1275    BDRVQcow2State *s = bs->opaque;
   1276    int64_t offset;
   1277    uint64_t limit;
   1278    uint64_t bm_size = bdrv_dirty_bitmap_size(bitmap);
   1279    const char *bm_name = bdrv_dirty_bitmap_name(bitmap);
   1280    uint8_t *buf = NULL;
   1281    uint64_t *tb;
   1282    uint64_t tb_size =
   1283            size_to_clusters(s,
   1284                bdrv_dirty_bitmap_serialization_size(bitmap, 0, bm_size));
   1285
   1286    if (tb_size > BME_MAX_TABLE_SIZE ||
   1287        tb_size * s->cluster_size > BME_MAX_PHYS_SIZE)
   1288    {
   1289        error_setg(errp, "Bitmap '%s' is too big", bm_name);
   1290        return NULL;
   1291    }
   1292
   1293    tb = g_try_new0(uint64_t, tb_size);
   1294    if (tb == NULL) {
   1295        error_setg(errp, "No memory");
   1296        return NULL;
   1297    }
   1298
   1299    buf = g_malloc(s->cluster_size);
   1300    limit = bdrv_dirty_bitmap_serialization_coverage(s->cluster_size, bitmap);
   1301    assert(DIV_ROUND_UP(bm_size, limit) == tb_size);
   1302
   1303    offset = 0;
   1304    while ((offset = bdrv_dirty_bitmap_next_dirty(bitmap, offset, INT64_MAX))
   1305           >= 0)
   1306    {
   1307        uint64_t cluster = offset / limit;
   1308        uint64_t end, write_size;
   1309        int64_t off;
   1310
   1311        /*
   1312         * We found the first dirty offset, but want to write out the
   1313         * entire cluster of the bitmap that includes that offset,
   1314         * including any leading zero bits.
   1315         */
   1316        offset = QEMU_ALIGN_DOWN(offset, limit);
   1317        end = MIN(bm_size, offset + limit);
   1318        write_size = bdrv_dirty_bitmap_serialization_size(bitmap, offset,
   1319                                                          end - offset);
   1320        assert(write_size <= s->cluster_size);
   1321
   1322        off = qcow2_alloc_clusters(bs, s->cluster_size);
   1323        if (off < 0) {
   1324            error_setg_errno(errp, -off,
   1325                             "Failed to allocate clusters for bitmap '%s'",
   1326                             bm_name);
   1327            goto fail;
   1328        }
   1329        tb[cluster] = off;
   1330
   1331        bdrv_dirty_bitmap_serialize_part(bitmap, buf, offset, end - offset);
   1332        if (write_size < s->cluster_size) {
   1333            memset(buf + write_size, 0, s->cluster_size - write_size);
   1334        }
   1335
   1336        ret = qcow2_pre_write_overlap_check(bs, 0, off, s->cluster_size, false);
   1337        if (ret < 0) {
   1338            error_setg_errno(errp, -ret, "Qcow2 overlap check failed");
   1339            goto fail;
   1340        }
   1341
   1342        ret = bdrv_pwrite(bs->file, off, buf, s->cluster_size);
   1343        if (ret < 0) {
   1344            error_setg_errno(errp, -ret, "Failed to write bitmap '%s' to file",
   1345                             bm_name);
   1346            goto fail;
   1347        }
   1348
   1349        offset = end;
   1350    }
   1351
   1352    *bitmap_table_size = tb_size;
   1353    g_free(buf);
   1354
   1355    return tb;
   1356
   1357fail:
   1358    clear_bitmap_table(bs, tb, tb_size);
   1359    g_free(buf);
   1360    g_free(tb);
   1361
   1362    return NULL;
   1363}
   1364
   1365/* store_bitmap()
   1366 * Store bm->dirty_bitmap to qcow2.
   1367 * Set bm->table_offset and bm->table_size accordingly.
   1368 */
   1369static int store_bitmap(BlockDriverState *bs, Qcow2Bitmap *bm, Error **errp)
   1370{
   1371    int ret;
   1372    uint64_t *tb;
   1373    int64_t tb_offset;
   1374    uint32_t tb_size;
   1375    BdrvDirtyBitmap *bitmap = bm->dirty_bitmap;
   1376    const char *bm_name;
   1377
   1378    assert(bitmap != NULL);
   1379
   1380    bm_name = bdrv_dirty_bitmap_name(bitmap);
   1381
   1382    tb = store_bitmap_data(bs, bitmap, &tb_size, errp);
   1383    if (tb == NULL) {
   1384        return -EINVAL;
   1385    }
   1386
   1387    assert(tb_size <= BME_MAX_TABLE_SIZE);
   1388    tb_offset = qcow2_alloc_clusters(bs, tb_size * sizeof(tb[0]));
   1389    if (tb_offset < 0) {
   1390        error_setg_errno(errp, -tb_offset,
   1391                         "Failed to allocate clusters for bitmap '%s'",
   1392                         bm_name);
   1393        ret = tb_offset;
   1394        goto fail;
   1395    }
   1396
   1397    ret = qcow2_pre_write_overlap_check(bs, 0, tb_offset,
   1398                                        tb_size * sizeof(tb[0]), false);
   1399    if (ret < 0) {
   1400        error_setg_errno(errp, -ret, "Qcow2 overlap check failed");
   1401        goto fail;
   1402    }
   1403
   1404    bitmap_table_to_be(tb, tb_size);
   1405    ret = bdrv_pwrite(bs->file, tb_offset, tb, tb_size * sizeof(tb[0]));
   1406    if (ret < 0) {
   1407        error_setg_errno(errp, -ret, "Failed to write bitmap '%s' to file",
   1408                         bm_name);
   1409        goto fail;
   1410    }
   1411
   1412    g_free(tb);
   1413
   1414    bm->table.offset = tb_offset;
   1415    bm->table.size = tb_size;
   1416
   1417    return 0;
   1418
   1419fail:
   1420    clear_bitmap_table(bs, tb, tb_size);
   1421
   1422    if (tb_offset > 0) {
   1423        qcow2_free_clusters(bs, tb_offset, tb_size * sizeof(tb[0]),
   1424                            QCOW2_DISCARD_OTHER);
   1425    }
   1426
   1427    g_free(tb);
   1428
   1429    return ret;
   1430}
   1431
   1432static Qcow2Bitmap *find_bitmap_by_name(Qcow2BitmapList *bm_list,
   1433                                        const char *name)
   1434{
   1435    Qcow2Bitmap *bm;
   1436
   1437    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
   1438        if (strcmp(name, bm->name) == 0) {
   1439            return bm;
   1440        }
   1441    }
   1442
   1443    return NULL;
   1444}
   1445
   1446int coroutine_fn qcow2_co_remove_persistent_dirty_bitmap(BlockDriverState *bs,
   1447                                                         const char *name,
   1448                                                         Error **errp)
   1449{
   1450    int ret;
   1451    BDRVQcow2State *s = bs->opaque;
   1452    Qcow2Bitmap *bm = NULL;
   1453    Qcow2BitmapList *bm_list;
   1454
   1455    if (s->nb_bitmaps == 0) {
   1456        /*
   1457         * Absence of the bitmap is not an error: see explanation above
   1458         * bdrv_co_remove_persistent_dirty_bitmap() definition.
   1459         */
   1460        return 0;
   1461    }
   1462
   1463    qemu_co_mutex_lock(&s->lock);
   1464
   1465    bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
   1466                               s->bitmap_directory_size, errp);
   1467    if (bm_list == NULL) {
   1468        ret = -EIO;
   1469        goto out;
   1470    }
   1471
   1472    bm = find_bitmap_by_name(bm_list, name);
   1473    if (bm == NULL) {
   1474        /* Absence of the bitmap is not an error, see above. */
   1475        ret = 0;
   1476        goto out;
   1477    }
   1478
   1479    QSIMPLEQ_REMOVE(bm_list, bm, Qcow2Bitmap, entry);
   1480
   1481    ret = update_ext_header_and_dir(bs, bm_list);
   1482    if (ret < 0) {
   1483        error_setg_errno(errp, -ret, "Failed to update bitmap extension");
   1484        goto out;
   1485    }
   1486
   1487    free_bitmap_clusters(bs, &bm->table);
   1488
   1489out:
   1490    qemu_co_mutex_unlock(&s->lock);
   1491
   1492    bitmap_free(bm);
   1493    bitmap_list_free(bm_list);
   1494
   1495    return ret;
   1496}
   1497
   1498/*
   1499 * qcow2_store_persistent_dirty_bitmaps
   1500 *
   1501 * Stores persistent BdrvDirtyBitmap objects.
   1502 *
   1503 * @release_stored: if true, release BdrvDirtyBitmap's after storing to the
   1504 * image. This is used in two cases, both via qcow2_inactivate:
   1505 * 1. bdrv_close: It's correct to remove bitmaps on close.
   1506 * 2. migration: If bitmaps are migrated through migration channel via
   1507 *    'dirty-bitmaps' migration capability they are not handled by this code.
   1508 *    Otherwise, it's OK to drop BdrvDirtyBitmap's and reload them on
   1509 *    invalidation.
   1510 *
   1511 * Anyway, it's correct to remove BdrvDirtyBitmap's on inactivation, as
   1512 * inactivation means that we lose control on disk, and therefore on bitmaps,
   1513 * we should sync them and do not touch more.
   1514 *
   1515 * Contrariwise, we don't want to release any bitmaps on just reopen-to-ro,
   1516 * when we need to store them, as image is still under our control, and it's
   1517 * good to keep all the bitmaps in read-only mode. Moreover, keeping them
   1518 * read-only is correct because this is what would happen if we opened the node
   1519 * readonly to begin with, and whether we opened directly or reopened to that
   1520 * state shouldn't matter for the state we get afterward.
   1521 */
   1522bool qcow2_store_persistent_dirty_bitmaps(BlockDriverState *bs,
   1523                                          bool release_stored, Error **errp)
   1524{
   1525    ERRP_GUARD();
   1526    BdrvDirtyBitmap *bitmap;
   1527    BDRVQcow2State *s = bs->opaque;
   1528    uint32_t new_nb_bitmaps = s->nb_bitmaps;
   1529    uint64_t new_dir_size = s->bitmap_directory_size;
   1530    int ret;
   1531    Qcow2BitmapList *bm_list;
   1532    Qcow2Bitmap *bm;
   1533    QSIMPLEQ_HEAD(, Qcow2BitmapTable) drop_tables;
   1534    Qcow2BitmapTable *tb, *tb_next;
   1535    bool need_write = false;
   1536
   1537    QSIMPLEQ_INIT(&drop_tables);
   1538
   1539    if (s->nb_bitmaps == 0) {
   1540        bm_list = bitmap_list_new();
   1541    } else {
   1542        bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
   1543                                   s->bitmap_directory_size, errp);
   1544        if (bm_list == NULL) {
   1545            return false;
   1546        }
   1547    }
   1548
   1549    /* check constraints and names */
   1550    FOR_EACH_DIRTY_BITMAP(bs, bitmap) {
   1551        const char *name = bdrv_dirty_bitmap_name(bitmap);
   1552        uint32_t granularity = bdrv_dirty_bitmap_granularity(bitmap);
   1553        Qcow2Bitmap *bm;
   1554
   1555        if (!bdrv_dirty_bitmap_get_persistence(bitmap) ||
   1556            bdrv_dirty_bitmap_inconsistent(bitmap)) {
   1557            continue;
   1558        }
   1559
   1560        if (bdrv_dirty_bitmap_readonly(bitmap)) {
   1561            /*
   1562             * Store the bitmap in the associated Qcow2Bitmap so it
   1563             * can be released later
   1564             */
   1565            bm = find_bitmap_by_name(bm_list, name);
   1566            if (bm) {
   1567                bm->dirty_bitmap = bitmap;
   1568            }
   1569            continue;
   1570        }
   1571
   1572        need_write = true;
   1573
   1574        if (check_constraints_on_bitmap(bs, name, granularity, errp) < 0) {
   1575            error_prepend(errp, "Bitmap '%s' doesn't satisfy the constraints: ",
   1576                          name);
   1577            goto fail;
   1578        }
   1579
   1580        bm = find_bitmap_by_name(bm_list, name);
   1581        if (bm == NULL) {
   1582            if (++new_nb_bitmaps > QCOW2_MAX_BITMAPS) {
   1583                error_setg(errp, "Too many persistent bitmaps");
   1584                goto fail;
   1585            }
   1586
   1587            new_dir_size += calc_dir_entry_size(strlen(name), 0);
   1588            if (new_dir_size > QCOW2_MAX_BITMAP_DIRECTORY_SIZE) {
   1589                error_setg(errp, "Bitmap directory is too large");
   1590                goto fail;
   1591            }
   1592
   1593            bm = g_new0(Qcow2Bitmap, 1);
   1594            bm->name = g_strdup(name);
   1595            QSIMPLEQ_INSERT_TAIL(bm_list, bm, entry);
   1596        } else {
   1597            if (!(bm->flags & BME_FLAG_IN_USE)) {
   1598                error_setg(errp, "Bitmap '%s' already exists in the image",
   1599                           name);
   1600                goto fail;
   1601            }
   1602            tb = g_memdup(&bm->table, sizeof(bm->table));
   1603            bm->table.offset = 0;
   1604            bm->table.size = 0;
   1605            QSIMPLEQ_INSERT_TAIL(&drop_tables, tb, entry);
   1606        }
   1607        bm->flags = bdrv_dirty_bitmap_enabled(bitmap) ? BME_FLAG_AUTO : 0;
   1608        bm->granularity_bits = ctz32(bdrv_dirty_bitmap_granularity(bitmap));
   1609        bm->dirty_bitmap = bitmap;
   1610    }
   1611
   1612    if (!need_write) {
   1613        goto success;
   1614    }
   1615
   1616    if (!can_write(bs)) {
   1617        error_setg(errp, "No write access");
   1618        goto fail;
   1619    }
   1620
   1621    /* allocate clusters and store bitmaps */
   1622    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
   1623        BdrvDirtyBitmap *bitmap = bm->dirty_bitmap;
   1624
   1625        if (bitmap == NULL || bdrv_dirty_bitmap_readonly(bitmap)) {
   1626            continue;
   1627        }
   1628
   1629        ret = store_bitmap(bs, bm, errp);
   1630        if (ret < 0) {
   1631            goto fail;
   1632        }
   1633    }
   1634
   1635    ret = update_ext_header_and_dir(bs, bm_list);
   1636    if (ret < 0) {
   1637        error_setg_errno(errp, -ret, "Failed to update bitmap extension");
   1638        goto fail;
   1639    }
   1640
   1641    /* Bitmap directory was successfully updated, so, old data can be dropped.
   1642     * TODO it is better to reuse these clusters */
   1643    QSIMPLEQ_FOREACH_SAFE(tb, &drop_tables, entry, tb_next) {
   1644        free_bitmap_clusters(bs, tb);
   1645        g_free(tb);
   1646    }
   1647
   1648success:
   1649    if (release_stored) {
   1650        QSIMPLEQ_FOREACH(bm, bm_list, entry) {
   1651            if (bm->dirty_bitmap == NULL) {
   1652                continue;
   1653            }
   1654
   1655            bdrv_release_dirty_bitmap(bm->dirty_bitmap);
   1656        }
   1657    }
   1658
   1659    bitmap_list_free(bm_list);
   1660    return true;
   1661
   1662fail:
   1663    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
   1664        if (bm->dirty_bitmap == NULL || bm->table.offset == 0 ||
   1665            bdrv_dirty_bitmap_readonly(bm->dirty_bitmap))
   1666        {
   1667            continue;
   1668        }
   1669
   1670        free_bitmap_clusters(bs, &bm->table);
   1671    }
   1672
   1673    QSIMPLEQ_FOREACH_SAFE(tb, &drop_tables, entry, tb_next) {
   1674        g_free(tb);
   1675    }
   1676
   1677    bitmap_list_free(bm_list);
   1678    return false;
   1679}
   1680
   1681int qcow2_reopen_bitmaps_ro(BlockDriverState *bs, Error **errp)
   1682{
   1683    BdrvDirtyBitmap *bitmap;
   1684
   1685    if (!qcow2_store_persistent_dirty_bitmaps(bs, false, errp)) {
   1686        return -EINVAL;
   1687    }
   1688
   1689    FOR_EACH_DIRTY_BITMAP(bs, bitmap) {
   1690        if (bdrv_dirty_bitmap_get_persistence(bitmap)) {
   1691            bdrv_dirty_bitmap_set_readonly(bitmap, true);
   1692        }
   1693    }
   1694
   1695    return 0;
   1696}
   1697
   1698bool coroutine_fn qcow2_co_can_store_new_dirty_bitmap(BlockDriverState *bs,
   1699                                                      const char *name,
   1700                                                      uint32_t granularity,
   1701                                                      Error **errp)
   1702{
   1703    BDRVQcow2State *s = bs->opaque;
   1704    BdrvDirtyBitmap *bitmap;
   1705    uint64_t bitmap_directory_size = 0;
   1706    uint32_t nb_bitmaps = 0;
   1707
   1708    if (bdrv_find_dirty_bitmap(bs, name)) {
   1709        error_setg(errp, "Bitmap already exists: %s", name);
   1710        return false;
   1711    }
   1712
   1713    if (s->qcow_version < 3) {
   1714        /* Without autoclear_features, we would always have to assume
   1715         * that a program without persistent dirty bitmap support has
   1716         * accessed this qcow2 file when opening it, and would thus
   1717         * have to drop all dirty bitmaps (defeating their purpose).
   1718         */
   1719        error_setg(errp, "Cannot store dirty bitmaps in qcow2 v2 files");
   1720        goto fail;
   1721    }
   1722
   1723    if (check_constraints_on_bitmap(bs, name, granularity, errp) != 0) {
   1724        goto fail;
   1725    }
   1726
   1727    FOR_EACH_DIRTY_BITMAP(bs, bitmap) {
   1728        if (bdrv_dirty_bitmap_get_persistence(bitmap)) {
   1729            nb_bitmaps++;
   1730            bitmap_directory_size +=
   1731                calc_dir_entry_size(strlen(bdrv_dirty_bitmap_name(bitmap)), 0);
   1732        }
   1733    }
   1734    nb_bitmaps++;
   1735    bitmap_directory_size += calc_dir_entry_size(strlen(name), 0);
   1736
   1737    if (nb_bitmaps > QCOW2_MAX_BITMAPS) {
   1738        error_setg(errp,
   1739                   "Maximum number of persistent bitmaps is already reached");
   1740        goto fail;
   1741    }
   1742
   1743    if (bitmap_directory_size > QCOW2_MAX_BITMAP_DIRECTORY_SIZE) {
   1744        error_setg(errp, "Not enough space in the bitmap directory");
   1745        goto fail;
   1746    }
   1747
   1748    return true;
   1749
   1750fail:
   1751    error_prepend(errp, "Can't make bitmap '%s' persistent in '%s': ",
   1752                  name, bdrv_get_device_or_node_name(bs));
   1753    return false;
   1754}
   1755
   1756bool qcow2_supports_persistent_dirty_bitmap(BlockDriverState *bs)
   1757{
   1758    BDRVQcow2State *s = bs->opaque;
   1759
   1760    return s->qcow_version >= 3;
   1761}
   1762
   1763/*
   1764 * Compute the space required to copy bitmaps from @in_bs.
   1765 *
   1766 * The computation is based as if copying to a new image with the
   1767 * given @cluster_size, which may differ from the cluster size in
   1768 * @in_bs; in fact, @in_bs might be something other than qcow2.
   1769 */
   1770uint64_t qcow2_get_persistent_dirty_bitmap_size(BlockDriverState *in_bs,
   1771                                                uint32_t cluster_size)
   1772{
   1773    uint64_t bitmaps_size = 0;
   1774    BdrvDirtyBitmap *bm;
   1775    size_t bitmap_dir_size = 0;
   1776
   1777    FOR_EACH_DIRTY_BITMAP(in_bs, bm) {
   1778        if (bdrv_dirty_bitmap_get_persistence(bm)) {
   1779            const char *name = bdrv_dirty_bitmap_name(bm);
   1780            uint32_t granularity = bdrv_dirty_bitmap_granularity(bm);
   1781            uint64_t bmbytes =
   1782                get_bitmap_bytes_needed(bdrv_dirty_bitmap_size(bm),
   1783                                        granularity);
   1784            uint64_t bmclusters = DIV_ROUND_UP(bmbytes, cluster_size);
   1785
   1786            /* Assume the entire bitmap is allocated */
   1787            bitmaps_size += bmclusters * cluster_size;
   1788            /* Also reserve space for the bitmap table entries */
   1789            bitmaps_size += ROUND_UP(bmclusters * BME_TABLE_ENTRY_SIZE,
   1790                                     cluster_size);
   1791            /* And space for contribution to bitmap directory size */
   1792            bitmap_dir_size += calc_dir_entry_size(strlen(name), 0);
   1793        }
   1794    }
   1795    bitmaps_size += ROUND_UP(bitmap_dir_size, cluster_size);
   1796
   1797    return bitmaps_size;
   1798}