qemu/block/qcow2-bitmap.c
<<
>>
Prefs
   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 "block/block_int.h"
  33#include "qcow2.h"
  34
  35/* NOTICE: BME here means Bitmaps Extension and used as a namespace for
  36 * _internal_ constants. Please do not use this _internal_ abbreviation for
  37 * other needs and/or outside of this file. */
  38
  39/* Bitmap directory entry constraints */
  40#define BME_MAX_TABLE_SIZE 0x8000000
  41#define BME_MAX_PHYS_SIZE 0x20000000 /* restrict BdrvDirtyBitmap size in RAM */
  42#define BME_MAX_GRANULARITY_BITS 31
  43#define BME_MIN_GRANULARITY_BITS 9
  44#define BME_MAX_NAME_SIZE 1023
  45
  46#if BME_MAX_TABLE_SIZE * 8ULL > INT_MAX
  47#error In the code bitmap table physical size assumed to fit into int
  48#endif
  49
  50/* Bitmap directory entry flags */
  51#define BME_RESERVED_FLAGS 0xfffffffcU
  52#define BME_FLAG_IN_USE (1U << 0)
  53#define BME_FLAG_AUTO   (1U << 1)
  54
  55/* bits [1, 8] U [56, 63] are reserved */
  56#define BME_TABLE_ENTRY_RESERVED_MASK 0xff000000000001feULL
  57#define BME_TABLE_ENTRY_OFFSET_MASK 0x00fffffffffffe00ULL
  58#define BME_TABLE_ENTRY_FLAG_ALL_ONES (1ULL << 0)
  59
  60typedef struct QEMU_PACKED Qcow2BitmapDirEntry {
  61    /* header is 8 byte aligned */
  62    uint64_t bitmap_table_offset;
  63
  64    uint32_t bitmap_table_size;
  65    uint32_t flags;
  66
  67    uint8_t type;
  68    uint8_t granularity_bits;
  69    uint16_t name_size;
  70    uint32_t extra_data_size;
  71    /* extra data follows  */
  72    /* name follows  */
  73} Qcow2BitmapDirEntry;
  74
  75typedef struct Qcow2BitmapTable {
  76    uint64_t offset;
  77    uint32_t size; /* number of 64bit entries */
  78    QSIMPLEQ_ENTRY(Qcow2BitmapTable) entry;
  79} Qcow2BitmapTable;
  80
  81typedef struct Qcow2Bitmap {
  82    Qcow2BitmapTable table;
  83    uint32_t flags;
  84    uint8_t granularity_bits;
  85    char *name;
  86
  87    BdrvDirtyBitmap *dirty_bitmap;
  88
  89    QSIMPLEQ_ENTRY(Qcow2Bitmap) entry;
  90} Qcow2Bitmap;
  91typedef QSIMPLEQ_HEAD(Qcow2BitmapList, Qcow2Bitmap) Qcow2BitmapList;
  92
  93typedef enum BitmapType {
  94    BT_DIRTY_TRACKING_BITMAP = 1
  95} BitmapType;
  96
  97static inline bool can_write(BlockDriverState *bs)
  98{
  99    return !bdrv_is_read_only(bs) && !(bdrv_get_flags(bs) & BDRV_O_INACTIVE);
 100}
 101
 102static int update_header_sync(BlockDriverState *bs)
 103{
 104    int ret;
 105
 106    ret = qcow2_update_header(bs);
 107    if (ret < 0) {
 108        return ret;
 109    }
 110
 111    return bdrv_flush(bs->file->bs);
 112}
 113
 114static inline void bitmap_table_to_be(uint64_t *bitmap_table, size_t size)
 115{
 116    size_t i;
 117
 118    for (i = 0; i < size; ++i) {
 119        bitmap_table[i] = cpu_to_be64(bitmap_table[i]);
 120    }
 121}
 122
 123static int check_table_entry(uint64_t entry, int cluster_size)
 124{
 125    uint64_t offset;
 126
 127    if (entry & BME_TABLE_ENTRY_RESERVED_MASK) {
 128        return -EINVAL;
 129    }
 130
 131    offset = entry & BME_TABLE_ENTRY_OFFSET_MASK;
 132    if (offset != 0) {
 133        /* if offset specified, bit 0 is reserved */
 134        if (entry & BME_TABLE_ENTRY_FLAG_ALL_ONES) {
 135            return -EINVAL;
 136        }
 137
 138        if (offset % cluster_size != 0) {
 139            return -EINVAL;
 140        }
 141    }
 142
 143    return 0;
 144}
 145
 146static int check_constraints_on_bitmap(BlockDriverState *bs,
 147                                       const char *name,
 148                                       uint32_t granularity,
 149                                       Error **errp)
 150{
 151    BDRVQcow2State *s = bs->opaque;
 152    int granularity_bits = ctz32(granularity);
 153    int64_t len = bdrv_getlength(bs);
 154
 155    assert(granularity > 0);
 156    assert((granularity & (granularity - 1)) == 0);
 157
 158    if (len < 0) {
 159        error_setg_errno(errp, -len, "Failed to get size of '%s'",
 160                         bdrv_get_device_or_node_name(bs));
 161        return len;
 162    }
 163
 164    if (granularity_bits > BME_MAX_GRANULARITY_BITS) {
 165        error_setg(errp, "Granularity exceeds maximum (%llu bytes)",
 166                   1ULL << BME_MAX_GRANULARITY_BITS);
 167        return -EINVAL;
 168    }
 169    if (granularity_bits < BME_MIN_GRANULARITY_BITS) {
 170        error_setg(errp, "Granularity is under minimum (%llu bytes)",
 171                   1ULL << BME_MIN_GRANULARITY_BITS);
 172        return -EINVAL;
 173    }
 174
 175    if ((len > (uint64_t)BME_MAX_PHYS_SIZE << granularity_bits) ||
 176        (len > (uint64_t)BME_MAX_TABLE_SIZE * s->cluster_size <<
 177               granularity_bits))
 178    {
 179        error_setg(errp, "Too much space will be occupied by the bitmap. "
 180                   "Use larger granularity");
 181        return -EINVAL;
 182    }
 183
 184    if (strlen(name) > BME_MAX_NAME_SIZE) {
 185        error_setg(errp, "Name length exceeds maximum (%u characters)",
 186                   BME_MAX_NAME_SIZE);
 187        return -EINVAL;
 188    }
 189
 190    return 0;
 191}
 192
 193static void clear_bitmap_table(BlockDriverState *bs, uint64_t *bitmap_table,
 194                               uint32_t bitmap_table_size)
 195{
 196    BDRVQcow2State *s = bs->opaque;
 197    int i;
 198
 199    for (i = 0; i < bitmap_table_size; ++i) {
 200        uint64_t addr = bitmap_table[i] & BME_TABLE_ENTRY_OFFSET_MASK;
 201        if (!addr) {
 202            continue;
 203        }
 204
 205        qcow2_free_clusters(bs, addr, s->cluster_size, QCOW2_DISCARD_OTHER);
 206        bitmap_table[i] = 0;
 207    }
 208}
 209
 210static int bitmap_table_load(BlockDriverState *bs, Qcow2BitmapTable *tb,
 211                             uint64_t **bitmap_table)
 212{
 213    int ret;
 214    BDRVQcow2State *s = bs->opaque;
 215    uint32_t i;
 216    uint64_t *table;
 217
 218    assert(tb->size != 0);
 219    table = g_try_new(uint64_t, tb->size);
 220    if (table == NULL) {
 221        return -ENOMEM;
 222    }
 223
 224    assert(tb->size <= BME_MAX_TABLE_SIZE);
 225    ret = bdrv_pread(bs->file, tb->offset,
 226                     table, tb->size * sizeof(uint64_t));
 227    if (ret < 0) {
 228        goto fail;
 229    }
 230
 231    for (i = 0; i < tb->size; ++i) {
 232        table[i] = be64_to_cpu(table[i]);
 233        ret = check_table_entry(table[i], s->cluster_size);
 234        if (ret < 0) {
 235            goto fail;
 236        }
 237    }
 238
 239    *bitmap_table = table;
 240    return 0;
 241
 242fail:
 243    g_free(table);
 244
 245    return ret;
 246}
 247
 248static int free_bitmap_clusters(BlockDriverState *bs, Qcow2BitmapTable *tb)
 249{
 250    int ret;
 251    uint64_t *bitmap_table;
 252
 253    ret = bitmap_table_load(bs, tb, &bitmap_table);
 254    if (ret < 0) {
 255        return ret;
 256    }
 257
 258    clear_bitmap_table(bs, bitmap_table, tb->size);
 259    qcow2_free_clusters(bs, tb->offset, tb->size * sizeof(uint64_t),
 260                        QCOW2_DISCARD_OTHER);
 261    g_free(bitmap_table);
 262
 263    tb->offset = 0;
 264    tb->size = 0;
 265
 266    return 0;
 267}
 268
 269/* Return the disk size covered by a single qcow2 cluster of bitmap data. */
 270static uint64_t bytes_covered_by_bitmap_cluster(const BDRVQcow2State *s,
 271                                                const BdrvDirtyBitmap *bitmap)
 272{
 273    uint64_t granularity = bdrv_dirty_bitmap_granularity(bitmap);
 274    uint64_t limit = granularity * (s->cluster_size << 3);
 275
 276    assert(QEMU_IS_ALIGNED(limit,
 277                           bdrv_dirty_bitmap_serialization_align(bitmap)));
 278    return limit;
 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 = bytes_covered_by_bitmap_cluster(s, 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(bs, 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    ret = -EINVAL;
 642    error_setg(errp, "Broken bitmap directory");
 643
 644fail:
 645    g_free(dir);
 646    bitmap_list_free(bm_list);
 647
 648    return NULL;
 649}
 650
 651int qcow2_check_bitmaps_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
 652                                  void **refcount_table,
 653                                  int64_t *refcount_table_size)
 654{
 655    int ret;
 656    BDRVQcow2State *s = bs->opaque;
 657    Qcow2BitmapList *bm_list;
 658    Qcow2Bitmap *bm;
 659
 660    if (s->nb_bitmaps == 0) {
 661        return 0;
 662    }
 663
 664    ret = qcow2_inc_refcounts_imrt(bs, res, refcount_table, refcount_table_size,
 665                                   s->bitmap_directory_offset,
 666                                   s->bitmap_directory_size);
 667    if (ret < 0) {
 668        return ret;
 669    }
 670
 671    bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
 672                               s->bitmap_directory_size, NULL);
 673    if (bm_list == NULL) {
 674        res->corruptions++;
 675        return -EINVAL;
 676    }
 677
 678    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
 679        uint64_t *bitmap_table = NULL;
 680        int i;
 681
 682        ret = qcow2_inc_refcounts_imrt(bs, res,
 683                                       refcount_table, refcount_table_size,
 684                                       bm->table.offset,
 685                                       bm->table.size * sizeof(uint64_t));
 686        if (ret < 0) {
 687            goto out;
 688        }
 689
 690        ret = bitmap_table_load(bs, &bm->table, &bitmap_table);
 691        if (ret < 0) {
 692            res->corruptions++;
 693            goto out;
 694        }
 695
 696        for (i = 0; i < bm->table.size; ++i) {
 697            uint64_t entry = bitmap_table[i];
 698            uint64_t offset = entry & BME_TABLE_ENTRY_OFFSET_MASK;
 699
 700            if (check_table_entry(entry, s->cluster_size) < 0) {
 701                res->corruptions++;
 702                continue;
 703            }
 704
 705            if (offset == 0) {
 706                continue;
 707            }
 708
 709            ret = qcow2_inc_refcounts_imrt(bs, res,
 710                                           refcount_table, refcount_table_size,
 711                                           offset, s->cluster_size);
 712            if (ret < 0) {
 713                g_free(bitmap_table);
 714                goto out;
 715            }
 716        }
 717
 718        g_free(bitmap_table);
 719    }
 720
 721out:
 722    bitmap_list_free(bm_list);
 723
 724    return ret;
 725}
 726
 727/* bitmap_list_store
 728 * Store bitmap list to qcow2 image as a bitmap directory.
 729 * Everything is checked.
 730 */
 731static int bitmap_list_store(BlockDriverState *bs, Qcow2BitmapList *bm_list,
 732                             uint64_t *offset, uint64_t *size, bool in_place)
 733{
 734    int ret;
 735    uint8_t *dir;
 736    int64_t dir_offset = 0;
 737    uint64_t dir_size = 0;
 738    Qcow2Bitmap *bm;
 739    Qcow2BitmapDirEntry *e;
 740
 741    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
 742        dir_size += calc_dir_entry_size(strlen(bm->name), 0);
 743    }
 744
 745    if (dir_size == 0 || dir_size > QCOW2_MAX_BITMAP_DIRECTORY_SIZE) {
 746        return -EINVAL;
 747    }
 748
 749    if (in_place) {
 750        if (*size != dir_size || *offset == 0) {
 751            return -EINVAL;
 752        }
 753
 754        dir_offset = *offset;
 755    }
 756
 757    dir = g_try_malloc(dir_size);
 758    if (dir == NULL) {
 759        return -ENOMEM;
 760    }
 761
 762    e = (Qcow2BitmapDirEntry *)dir;
 763    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
 764        e->bitmap_table_offset = bm->table.offset;
 765        e->bitmap_table_size = bm->table.size;
 766        e->flags = bm->flags;
 767        e->type = BT_DIRTY_TRACKING_BITMAP;
 768        e->granularity_bits = bm->granularity_bits;
 769        e->name_size = strlen(bm->name);
 770        e->extra_data_size = 0;
 771        memcpy(e + 1, bm->name, e->name_size);
 772
 773        if (check_dir_entry(bs, e) < 0) {
 774            ret = -EINVAL;
 775            goto fail;
 776        }
 777
 778        e = next_dir_entry(e);
 779    }
 780
 781    bitmap_directory_to_be(dir, dir_size);
 782
 783    if (!in_place) {
 784        dir_offset = qcow2_alloc_clusters(bs, dir_size);
 785        if (dir_offset < 0) {
 786            ret = dir_offset;
 787            goto fail;
 788        }
 789    }
 790
 791    /* Actually, even in in-place case ignoring QCOW2_OL_BITMAP_DIRECTORY is not
 792     * necessary, because we drop QCOW2_AUTOCLEAR_BITMAPS when updating bitmap
 793     * directory in-place (actually, turn-off the extension), which is checked
 794     * in qcow2_check_metadata_overlap() */
 795    ret = qcow2_pre_write_overlap_check(
 796            bs, in_place ? QCOW2_OL_BITMAP_DIRECTORY : 0, dir_offset, dir_size,
 797            false);
 798    if (ret < 0) {
 799        goto fail;
 800    }
 801
 802    ret = bdrv_pwrite(bs->file, dir_offset, dir, dir_size);
 803    if (ret < 0) {
 804        goto fail;
 805    }
 806
 807    g_free(dir);
 808
 809    if (!in_place) {
 810        *size = dir_size;
 811        *offset = dir_offset;
 812    }
 813
 814    return 0;
 815
 816fail:
 817    g_free(dir);
 818
 819    if (!in_place && dir_offset > 0) {
 820        qcow2_free_clusters(bs, dir_offset, dir_size, QCOW2_DISCARD_OTHER);
 821    }
 822
 823    return ret;
 824}
 825
 826/*
 827 * Bitmap List end
 828 */
 829
 830static int update_ext_header_and_dir_in_place(BlockDriverState *bs,
 831                                              Qcow2BitmapList *bm_list)
 832{
 833    BDRVQcow2State *s = bs->opaque;
 834    int ret;
 835
 836    if (!(s->autoclear_features & QCOW2_AUTOCLEAR_BITMAPS) ||
 837        bm_list == NULL || QSIMPLEQ_EMPTY(bm_list) ||
 838        bitmap_list_count(bm_list) != s->nb_bitmaps)
 839    {
 840        return -EINVAL;
 841    }
 842
 843    s->autoclear_features &= ~(uint64_t)QCOW2_AUTOCLEAR_BITMAPS;
 844    ret = update_header_sync(bs);
 845    if (ret < 0) {
 846        /* Two variants are possible here:
 847         * 1. Autoclear flag is dropped, all bitmaps will be lost.
 848         * 2. Autoclear flag is not dropped, old state is left.
 849         */
 850        return ret;
 851    }
 852
 853    /* autoclear bit is not set, so we can safely update bitmap directory */
 854
 855    ret = bitmap_list_store(bs, bm_list, &s->bitmap_directory_offset,
 856                            &s->bitmap_directory_size, true);
 857    if (ret < 0) {
 858        /* autoclear bit is cleared, so all leaked clusters would be removed on
 859         * qemu-img check */
 860        return ret;
 861    }
 862
 863    ret = update_header_sync(bs);
 864    if (ret < 0) {
 865        /* autoclear bit is cleared, so all leaked clusters would be removed on
 866         * qemu-img check */
 867        return ret;
 868    }
 869
 870    s->autoclear_features |= QCOW2_AUTOCLEAR_BITMAPS;
 871    return update_header_sync(bs);
 872    /* If final update_header_sync() fails, two variants are possible:
 873     * 1. Autoclear flag is not set, all bitmaps will be lost.
 874     * 2. Autoclear flag is set, header and directory are successfully updated.
 875     */
 876}
 877
 878static int update_ext_header_and_dir(BlockDriverState *bs,
 879                                     Qcow2BitmapList *bm_list)
 880{
 881    BDRVQcow2State *s = bs->opaque;
 882    int ret;
 883    uint64_t new_offset = 0;
 884    uint64_t new_size = 0;
 885    uint32_t new_nb_bitmaps = 0;
 886    uint64_t old_offset = s->bitmap_directory_offset;
 887    uint64_t old_size = s->bitmap_directory_size;
 888    uint32_t old_nb_bitmaps = s->nb_bitmaps;
 889    uint64_t old_autocl = s->autoclear_features;
 890
 891    if (bm_list != NULL && !QSIMPLEQ_EMPTY(bm_list)) {
 892        new_nb_bitmaps = bitmap_list_count(bm_list);
 893
 894        if (new_nb_bitmaps > QCOW2_MAX_BITMAPS) {
 895            return -EINVAL;
 896        }
 897
 898        ret = bitmap_list_store(bs, bm_list, &new_offset, &new_size, false);
 899        if (ret < 0) {
 900            return ret;
 901        }
 902
 903        ret = qcow2_flush_caches(bs);
 904        if (ret < 0) {
 905            goto fail;
 906        }
 907
 908        s->autoclear_features |= QCOW2_AUTOCLEAR_BITMAPS;
 909    } else {
 910        s->autoclear_features &= ~(uint64_t)QCOW2_AUTOCLEAR_BITMAPS;
 911    }
 912
 913    s->bitmap_directory_offset = new_offset;
 914    s->bitmap_directory_size = new_size;
 915    s->nb_bitmaps = new_nb_bitmaps;
 916
 917    ret = update_header_sync(bs);
 918    if (ret < 0) {
 919        goto fail;
 920    }
 921
 922    if (old_size > 0) {
 923        qcow2_free_clusters(bs, old_offset, old_size, QCOW2_DISCARD_OTHER);
 924    }
 925
 926    return 0;
 927
 928fail:
 929    if (new_offset > 0) {
 930        qcow2_free_clusters(bs, new_offset, new_size, QCOW2_DISCARD_OTHER);
 931    }
 932
 933    s->bitmap_directory_offset = old_offset;
 934    s->bitmap_directory_size = old_size;
 935    s->nb_bitmaps = old_nb_bitmaps;
 936    s->autoclear_features = old_autocl;
 937
 938    return ret;
 939}
 940
 941/* for g_slist_foreach for GSList of BdrvDirtyBitmap* elements */
 942static void release_dirty_bitmap_helper(gpointer bitmap,
 943                                        gpointer bs)
 944{
 945    bdrv_release_dirty_bitmap(bs, bitmap);
 946}
 947
 948/* for g_slist_foreach for GSList of BdrvDirtyBitmap* elements */
 949static void set_readonly_helper(gpointer bitmap, gpointer value)
 950{
 951    bdrv_dirty_bitmap_set_readonly(bitmap, (bool)value);
 952}
 953
 954/* qcow2_load_dirty_bitmaps()
 955 * Return value is a hint for caller: true means that the Qcow2 header was
 956 * updated. (false doesn't mean that the header should be updated by the
 957 * caller, it just means that updating was not needed or the image cannot be
 958 * written to).
 959 * On failure the function returns false.
 960 */
 961bool qcow2_load_dirty_bitmaps(BlockDriverState *bs, Error **errp)
 962{
 963    BDRVQcow2State *s = bs->opaque;
 964    Qcow2BitmapList *bm_list;
 965    Qcow2Bitmap *bm;
 966    GSList *created_dirty_bitmaps = NULL;
 967    bool header_updated = false;
 968    bool needs_update = false;
 969
 970    if (s->nb_bitmaps == 0) {
 971        /* No bitmaps - nothing to do */
 972        return false;
 973    }
 974
 975    bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
 976                               s->bitmap_directory_size, errp);
 977    if (bm_list == NULL) {
 978        return false;
 979    }
 980
 981    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
 982        BdrvDirtyBitmap *bitmap = load_bitmap(bs, bm, errp);
 983        if (bitmap == NULL) {
 984            goto fail;
 985        }
 986
 987        bdrv_dirty_bitmap_set_persistence(bitmap, true);
 988        if (bm->flags & BME_FLAG_IN_USE) {
 989            bdrv_dirty_bitmap_set_inconsistent(bitmap);
 990        } else {
 991            /* NB: updated flags only get written if can_write(bs) is true. */
 992            bm->flags |= BME_FLAG_IN_USE;
 993            needs_update = true;
 994        }
 995        if (!(bm->flags & BME_FLAG_AUTO)) {
 996            bdrv_disable_dirty_bitmap(bitmap);
 997        }
 998        created_dirty_bitmaps =
 999            g_slist_append(created_dirty_bitmaps, bitmap);
1000    }
1001
1002    if (needs_update && can_write(bs)) {
1003        /* in_use flags must be updated */
1004        int ret = update_ext_header_and_dir_in_place(bs, bm_list);
1005        if (ret < 0) {
1006            error_setg_errno(errp, -ret, "Can't update bitmap directory");
1007            goto fail;
1008        }
1009        header_updated = true;
1010    }
1011
1012    if (!can_write(bs)) {
1013        g_slist_foreach(created_dirty_bitmaps, set_readonly_helper,
1014                        (gpointer)true);
1015    }
1016
1017    g_slist_free(created_dirty_bitmaps);
1018    bitmap_list_free(bm_list);
1019
1020    return header_updated;
1021
1022fail:
1023    g_slist_foreach(created_dirty_bitmaps, release_dirty_bitmap_helper, bs);
1024    g_slist_free(created_dirty_bitmaps);
1025    bitmap_list_free(bm_list);
1026
1027    return false;
1028}
1029
1030
1031static Qcow2BitmapInfoFlagsList *get_bitmap_info_flags(uint32_t flags)
1032{
1033    Qcow2BitmapInfoFlagsList *list = NULL;
1034    Qcow2BitmapInfoFlagsList **plist = &list;
1035    int i;
1036
1037    static const struct {
1038        int bme;  /* Bitmap directory entry flags */
1039        int info; /* The flags to report to the user */
1040    } map[] = {
1041        { BME_FLAG_IN_USE, QCOW2_BITMAP_INFO_FLAGS_IN_USE },
1042        { BME_FLAG_AUTO,   QCOW2_BITMAP_INFO_FLAGS_AUTO },
1043    };
1044
1045    int map_size = ARRAY_SIZE(map);
1046
1047    for (i = 0; i < map_size; ++i) {
1048        if (flags & map[i].bme) {
1049            Qcow2BitmapInfoFlagsList *entry =
1050                g_new0(Qcow2BitmapInfoFlagsList, 1);
1051            entry->value = map[i].info;
1052            *plist = entry;
1053            plist = &entry->next;
1054            flags &= ~map[i].bme;
1055        }
1056    }
1057    /* Check if the BME_* mapping above is complete */
1058    assert(!flags);
1059
1060    return list;
1061}
1062
1063/*
1064 * qcow2_get_bitmap_info_list()
1065 * Returns a list of QCOW2 bitmap details.
1066 * In case of no bitmaps, the function returns NULL and
1067 * the @errp parameter is not set.
1068 * When bitmap information can not be obtained, the function returns
1069 * NULL and the @errp parameter is set.
1070 */
1071Qcow2BitmapInfoList *qcow2_get_bitmap_info_list(BlockDriverState *bs,
1072                                                Error **errp)
1073{
1074    BDRVQcow2State *s = bs->opaque;
1075    Qcow2BitmapList *bm_list;
1076    Qcow2Bitmap *bm;
1077    Qcow2BitmapInfoList *list = NULL;
1078    Qcow2BitmapInfoList **plist = &list;
1079
1080    if (s->nb_bitmaps == 0) {
1081        return NULL;
1082    }
1083
1084    bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
1085                               s->bitmap_directory_size, errp);
1086    if (bm_list == NULL) {
1087        return NULL;
1088    }
1089
1090    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
1091        Qcow2BitmapInfo *info = g_new0(Qcow2BitmapInfo, 1);
1092        Qcow2BitmapInfoList *obj = g_new0(Qcow2BitmapInfoList, 1);
1093        info->granularity = 1U << bm->granularity_bits;
1094        info->name = g_strdup(bm->name);
1095        info->flags = get_bitmap_info_flags(bm->flags & ~BME_RESERVED_FLAGS);
1096        obj->value = info;
1097        *plist = obj;
1098        plist = &obj->next;
1099    }
1100
1101    bitmap_list_free(bm_list);
1102
1103    return list;
1104}
1105
1106int qcow2_reopen_bitmaps_rw_hint(BlockDriverState *bs, bool *header_updated,
1107                                 Error **errp)
1108{
1109    BDRVQcow2State *s = bs->opaque;
1110    Qcow2BitmapList *bm_list;
1111    Qcow2Bitmap *bm;
1112    GSList *ro_dirty_bitmaps = NULL;
1113    int ret = 0;
1114
1115    if (header_updated != NULL) {
1116        *header_updated = false;
1117    }
1118
1119    if (s->nb_bitmaps == 0) {
1120        /* No bitmaps - nothing to do */
1121        return 0;
1122    }
1123
1124    if (!can_write(bs)) {
1125        error_setg(errp, "Can't write to the image on reopening bitmaps rw");
1126        return -EINVAL;
1127    }
1128
1129    bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
1130                               s->bitmap_directory_size, errp);
1131    if (bm_list == NULL) {
1132        return -EINVAL;
1133    }
1134
1135    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
1136        BdrvDirtyBitmap *bitmap = bdrv_find_dirty_bitmap(bs, bm->name);
1137        if (bitmap == NULL) {
1138            continue;
1139        }
1140
1141        if (!bdrv_dirty_bitmap_readonly(bitmap)) {
1142            error_setg(errp, "Bitmap %s was loaded prior to rw-reopen, but was "
1143                       "not marked as readonly. This is a bug, something went "
1144                       "wrong. All of the bitmaps may be corrupted", bm->name);
1145            ret = -EINVAL;
1146            goto out;
1147        }
1148
1149        bm->flags |= BME_FLAG_IN_USE;
1150        ro_dirty_bitmaps = g_slist_append(ro_dirty_bitmaps, bitmap);
1151    }
1152
1153    if (ro_dirty_bitmaps != NULL) {
1154        /* in_use flags must be updated */
1155        ret = update_ext_header_and_dir_in_place(bs, bm_list);
1156        if (ret < 0) {
1157            error_setg_errno(errp, -ret, "Can't update bitmap directory");
1158            goto out;
1159        }
1160        if (header_updated != NULL) {
1161            *header_updated = true;
1162        }
1163        g_slist_foreach(ro_dirty_bitmaps, set_readonly_helper, false);
1164    }
1165
1166out:
1167    g_slist_free(ro_dirty_bitmaps);
1168    bitmap_list_free(bm_list);
1169
1170    return ret;
1171}
1172
1173int qcow2_reopen_bitmaps_rw(BlockDriverState *bs, Error **errp)
1174{
1175    return qcow2_reopen_bitmaps_rw_hint(bs, NULL, errp);
1176}
1177
1178/* Checks to see if it's safe to resize bitmaps */
1179int qcow2_truncate_bitmaps_check(BlockDriverState *bs, Error **errp)
1180{
1181    BDRVQcow2State *s = bs->opaque;
1182    Qcow2BitmapList *bm_list;
1183    Qcow2Bitmap *bm;
1184    int ret = 0;
1185
1186    if (s->nb_bitmaps == 0) {
1187        return 0;
1188    }
1189
1190    bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
1191                               s->bitmap_directory_size, errp);
1192    if (bm_list == NULL) {
1193        return -EINVAL;
1194    }
1195
1196    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
1197        BdrvDirtyBitmap *bitmap = bdrv_find_dirty_bitmap(bs, bm->name);
1198        if (bitmap == NULL) {
1199            /*
1200             * We rely on all bitmaps being in-memory to be able to resize them,
1201             * Otherwise, we'd need to resize them on disk explicitly
1202             */
1203            error_setg(errp, "Cannot resize qcow2 with persistent bitmaps that "
1204                       "were not loaded into memory");
1205            ret = -ENOTSUP;
1206            goto out;
1207        }
1208
1209        /*
1210         * The checks against readonly and busy are redundant, but certainly
1211         * do no harm. checks against inconsistent are crucial:
1212         */
1213        if (bdrv_dirty_bitmap_check(bitmap, BDRV_BITMAP_DEFAULT, errp)) {
1214            ret = -ENOTSUP;
1215            goto out;
1216        }
1217    }
1218
1219out:
1220    bitmap_list_free(bm_list);
1221    return ret;
1222}
1223
1224/* store_bitmap_data()
1225 * Store bitmap to image, filling bitmap table accordingly.
1226 */
1227static uint64_t *store_bitmap_data(BlockDriverState *bs,
1228                                   BdrvDirtyBitmap *bitmap,
1229                                   uint32_t *bitmap_table_size, Error **errp)
1230{
1231    int ret;
1232    BDRVQcow2State *s = bs->opaque;
1233    int64_t offset;
1234    uint64_t limit;
1235    uint64_t bm_size = bdrv_dirty_bitmap_size(bitmap);
1236    const char *bm_name = bdrv_dirty_bitmap_name(bitmap);
1237    uint8_t *buf = NULL;
1238    BdrvDirtyBitmapIter *dbi;
1239    uint64_t *tb;
1240    uint64_t tb_size =
1241            size_to_clusters(s,
1242                bdrv_dirty_bitmap_serialization_size(bitmap, 0, bm_size));
1243
1244    if (tb_size > BME_MAX_TABLE_SIZE ||
1245        tb_size * s->cluster_size > BME_MAX_PHYS_SIZE)
1246    {
1247        error_setg(errp, "Bitmap '%s' is too big", bm_name);
1248        return NULL;
1249    }
1250
1251    tb = g_try_new0(uint64_t, tb_size);
1252    if (tb == NULL) {
1253        error_setg(errp, "No memory");
1254        return NULL;
1255    }
1256
1257    dbi = bdrv_dirty_iter_new(bitmap);
1258    buf = g_malloc(s->cluster_size);
1259    limit = bytes_covered_by_bitmap_cluster(s, bitmap);
1260    assert(DIV_ROUND_UP(bm_size, limit) == tb_size);
1261
1262    while ((offset = bdrv_dirty_iter_next(dbi)) >= 0) {
1263        uint64_t cluster = offset / limit;
1264        uint64_t end, write_size;
1265        int64_t off;
1266
1267        /*
1268         * We found the first dirty offset, but want to write out the
1269         * entire cluster of the bitmap that includes that offset,
1270         * including any leading zero bits.
1271         */
1272        offset = QEMU_ALIGN_DOWN(offset, limit);
1273        end = MIN(bm_size, offset + limit);
1274        write_size = bdrv_dirty_bitmap_serialization_size(bitmap, offset,
1275                                                          end - offset);
1276        assert(write_size <= s->cluster_size);
1277
1278        off = qcow2_alloc_clusters(bs, s->cluster_size);
1279        if (off < 0) {
1280            error_setg_errno(errp, -off,
1281                             "Failed to allocate clusters for bitmap '%s'",
1282                             bm_name);
1283            goto fail;
1284        }
1285        tb[cluster] = off;
1286
1287        bdrv_dirty_bitmap_serialize_part(bitmap, buf, offset, end - offset);
1288        if (write_size < s->cluster_size) {
1289            memset(buf + write_size, 0, s->cluster_size - write_size);
1290        }
1291
1292        ret = qcow2_pre_write_overlap_check(bs, 0, off, s->cluster_size, false);
1293        if (ret < 0) {
1294            error_setg_errno(errp, -ret, "Qcow2 overlap check failed");
1295            goto fail;
1296        }
1297
1298        ret = bdrv_pwrite(bs->file, off, buf, s->cluster_size);
1299        if (ret < 0) {
1300            error_setg_errno(errp, -ret, "Failed to write bitmap '%s' to file",
1301                             bm_name);
1302            goto fail;
1303        }
1304
1305        if (end >= bm_size) {
1306            break;
1307        }
1308
1309        bdrv_set_dirty_iter(dbi, end);
1310    }
1311
1312    *bitmap_table_size = tb_size;
1313    g_free(buf);
1314    bdrv_dirty_iter_free(dbi);
1315
1316    return tb;
1317
1318fail:
1319    clear_bitmap_table(bs, tb, tb_size);
1320    g_free(buf);
1321    bdrv_dirty_iter_free(dbi);
1322    g_free(tb);
1323
1324    return NULL;
1325}
1326
1327/* store_bitmap()
1328 * Store bm->dirty_bitmap to qcow2.
1329 * Set bm->table_offset and bm->table_size accordingly.
1330 */
1331static int store_bitmap(BlockDriverState *bs, Qcow2Bitmap *bm, Error **errp)
1332{
1333    int ret;
1334    uint64_t *tb;
1335    int64_t tb_offset;
1336    uint32_t tb_size;
1337    BdrvDirtyBitmap *bitmap = bm->dirty_bitmap;
1338    const char *bm_name;
1339
1340    assert(bitmap != NULL);
1341
1342    bm_name = bdrv_dirty_bitmap_name(bitmap);
1343
1344    tb = store_bitmap_data(bs, bitmap, &tb_size, errp);
1345    if (tb == NULL) {
1346        return -EINVAL;
1347    }
1348
1349    assert(tb_size <= BME_MAX_TABLE_SIZE);
1350    tb_offset = qcow2_alloc_clusters(bs, tb_size * sizeof(tb[0]));
1351    if (tb_offset < 0) {
1352        error_setg_errno(errp, -tb_offset,
1353                         "Failed to allocate clusters for bitmap '%s'",
1354                         bm_name);
1355        ret = tb_offset;
1356        goto fail;
1357    }
1358
1359    ret = qcow2_pre_write_overlap_check(bs, 0, tb_offset,
1360                                        tb_size * sizeof(tb[0]), false);
1361    if (ret < 0) {
1362        error_setg_errno(errp, -ret, "Qcow2 overlap check failed");
1363        goto fail;
1364    }
1365
1366    bitmap_table_to_be(tb, tb_size);
1367    ret = bdrv_pwrite(bs->file, tb_offset, tb, tb_size * sizeof(tb[0]));
1368    if (ret < 0) {
1369        error_setg_errno(errp, -ret, "Failed to write bitmap '%s' to file",
1370                         bm_name);
1371        goto fail;
1372    }
1373
1374    g_free(tb);
1375
1376    bm->table.offset = tb_offset;
1377    bm->table.size = tb_size;
1378
1379    return 0;
1380
1381fail:
1382    clear_bitmap_table(bs, tb, tb_size);
1383
1384    if (tb_offset > 0) {
1385        qcow2_free_clusters(bs, tb_offset, tb_size * sizeof(tb[0]),
1386                            QCOW2_DISCARD_OTHER);
1387    }
1388
1389    g_free(tb);
1390
1391    return ret;
1392}
1393
1394static Qcow2Bitmap *find_bitmap_by_name(Qcow2BitmapList *bm_list,
1395                                        const char *name)
1396{
1397    Qcow2Bitmap *bm;
1398
1399    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
1400        if (strcmp(name, bm->name) == 0) {
1401            return bm;
1402        }
1403    }
1404
1405    return NULL;
1406}
1407
1408void qcow2_remove_persistent_dirty_bitmap(BlockDriverState *bs,
1409                                          const char *name,
1410                                          Error **errp)
1411{
1412    int ret;
1413    BDRVQcow2State *s = bs->opaque;
1414    Qcow2Bitmap *bm;
1415    Qcow2BitmapList *bm_list;
1416
1417    if (s->nb_bitmaps == 0) {
1418        /* Absence of the bitmap is not an error: see explanation above
1419         * bdrv_remove_persistent_dirty_bitmap() definition. */
1420        return;
1421    }
1422
1423    bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
1424                               s->bitmap_directory_size, errp);
1425    if (bm_list == NULL) {
1426        return;
1427    }
1428
1429    bm = find_bitmap_by_name(bm_list, name);
1430    if (bm == NULL) {
1431        goto fail;
1432    }
1433
1434    QSIMPLEQ_REMOVE(bm_list, bm, Qcow2Bitmap, entry);
1435
1436    ret = update_ext_header_and_dir(bs, bm_list);
1437    if (ret < 0) {
1438        error_setg_errno(errp, -ret, "Failed to update bitmap extension");
1439        goto fail;
1440    }
1441
1442    free_bitmap_clusters(bs, &bm->table);
1443
1444fail:
1445    bitmap_free(bm);
1446    bitmap_list_free(bm_list);
1447}
1448
1449void qcow2_store_persistent_dirty_bitmaps(BlockDriverState *bs, Error **errp)
1450{
1451    BdrvDirtyBitmap *bitmap;
1452    BDRVQcow2State *s = bs->opaque;
1453    uint32_t new_nb_bitmaps = s->nb_bitmaps;
1454    uint64_t new_dir_size = s->bitmap_directory_size;
1455    int ret;
1456    Qcow2BitmapList *bm_list;
1457    Qcow2Bitmap *bm;
1458    QSIMPLEQ_HEAD(, Qcow2BitmapTable) drop_tables;
1459    Qcow2BitmapTable *tb, *tb_next;
1460
1461    if (!bdrv_has_changed_persistent_bitmaps(bs)) {
1462        /* nothing to do */
1463        return;
1464    }
1465
1466    if (!can_write(bs)) {
1467        error_setg(errp, "No write access");
1468        return;
1469    }
1470
1471    QSIMPLEQ_INIT(&drop_tables);
1472
1473    if (s->nb_bitmaps == 0) {
1474        bm_list = bitmap_list_new();
1475    } else {
1476        bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
1477                                   s->bitmap_directory_size, errp);
1478        if (bm_list == NULL) {
1479            return;
1480        }
1481    }
1482
1483    /* check constraints and names */
1484    for (bitmap = bdrv_dirty_bitmap_next(bs, NULL); bitmap != NULL;
1485         bitmap = bdrv_dirty_bitmap_next(bs, bitmap))
1486    {
1487        const char *name = bdrv_dirty_bitmap_name(bitmap);
1488        uint32_t granularity = bdrv_dirty_bitmap_granularity(bitmap);
1489        Qcow2Bitmap *bm;
1490
1491        if (!bdrv_dirty_bitmap_get_persistence(bitmap) ||
1492            bdrv_dirty_bitmap_readonly(bitmap) ||
1493            bdrv_dirty_bitmap_inconsistent(bitmap)) {
1494            continue;
1495        }
1496
1497        if (check_constraints_on_bitmap(bs, name, granularity, errp) < 0) {
1498            error_prepend(errp, "Bitmap '%s' doesn't satisfy the constraints: ",
1499                          name);
1500            goto fail;
1501        }
1502
1503        bm = find_bitmap_by_name(bm_list, name);
1504        if (bm == NULL) {
1505            if (++new_nb_bitmaps > QCOW2_MAX_BITMAPS) {
1506                error_setg(errp, "Too many persistent bitmaps");
1507                goto fail;
1508            }
1509
1510            new_dir_size += calc_dir_entry_size(strlen(name), 0);
1511            if (new_dir_size > QCOW2_MAX_BITMAP_DIRECTORY_SIZE) {
1512                error_setg(errp, "Bitmap directory is too large");
1513                goto fail;
1514            }
1515
1516            bm = g_new0(Qcow2Bitmap, 1);
1517            bm->name = g_strdup(name);
1518            QSIMPLEQ_INSERT_TAIL(bm_list, bm, entry);
1519        } else {
1520            if (!(bm->flags & BME_FLAG_IN_USE)) {
1521                error_setg(errp, "Bitmap '%s' already exists in the image",
1522                           name);
1523                goto fail;
1524            }
1525            tb = g_memdup(&bm->table, sizeof(bm->table));
1526            bm->table.offset = 0;
1527            bm->table.size = 0;
1528            QSIMPLEQ_INSERT_TAIL(&drop_tables, tb, entry);
1529        }
1530        bm->flags = bdrv_dirty_bitmap_enabled(bitmap) ? BME_FLAG_AUTO : 0;
1531        bm->granularity_bits = ctz32(bdrv_dirty_bitmap_granularity(bitmap));
1532        bm->dirty_bitmap = bitmap;
1533    }
1534
1535    /* allocate clusters and store bitmaps */
1536    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
1537        if (bm->dirty_bitmap == NULL) {
1538            continue;
1539        }
1540
1541        ret = store_bitmap(bs, bm, errp);
1542        if (ret < 0) {
1543            goto fail;
1544        }
1545    }
1546
1547    ret = update_ext_header_and_dir(bs, bm_list);
1548    if (ret < 0) {
1549        error_setg_errno(errp, -ret, "Failed to update bitmap extension");
1550        goto fail;
1551    }
1552
1553    /* Bitmap directory was successfully updated, so, old data can be dropped.
1554     * TODO it is better to reuse these clusters */
1555    QSIMPLEQ_FOREACH_SAFE(tb, &drop_tables, entry, tb_next) {
1556        free_bitmap_clusters(bs, tb);
1557        g_free(tb);
1558    }
1559
1560    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
1561        /* For safety, we remove bitmap after storing.
1562         * We may be here in two cases:
1563         * 1. bdrv_close. It's ok to drop bitmap.
1564         * 2. inactivation. It means migration without 'dirty-bitmaps'
1565         *    capability, so bitmaps are not marked with
1566         *    BdrvDirtyBitmap.migration flags. It's not bad to drop them too,
1567         *    and reload on invalidation.
1568         */
1569        if (bm->dirty_bitmap == NULL) {
1570            continue;
1571        }
1572
1573        bdrv_release_dirty_bitmap(bs, bm->dirty_bitmap);
1574    }
1575
1576    bitmap_list_free(bm_list);
1577    return;
1578
1579fail:
1580    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
1581        if (bm->dirty_bitmap == NULL || bm->table.offset == 0) {
1582            continue;
1583        }
1584
1585        free_bitmap_clusters(bs, &bm->table);
1586    }
1587
1588    QSIMPLEQ_FOREACH_SAFE(tb, &drop_tables, entry, tb_next) {
1589        g_free(tb);
1590    }
1591
1592    bitmap_list_free(bm_list);
1593}
1594
1595int qcow2_reopen_bitmaps_ro(BlockDriverState *bs, Error **errp)
1596{
1597    BdrvDirtyBitmap *bitmap;
1598    Error *local_err = NULL;
1599
1600    qcow2_store_persistent_dirty_bitmaps(bs, &local_err);
1601    if (local_err != NULL) {
1602        error_propagate(errp, local_err);
1603        return -EINVAL;
1604    }
1605
1606    for (bitmap = bdrv_dirty_bitmap_next(bs, NULL); bitmap != NULL;
1607         bitmap = bdrv_dirty_bitmap_next(bs, bitmap))
1608    {
1609        if (bdrv_dirty_bitmap_get_persistence(bitmap)) {
1610            bdrv_dirty_bitmap_set_readonly(bitmap, true);
1611        }
1612    }
1613
1614    return 0;
1615}
1616
1617bool qcow2_can_store_new_dirty_bitmap(BlockDriverState *bs,
1618                                      const char *name,
1619                                      uint32_t granularity,
1620                                      Error **errp)
1621{
1622    BDRVQcow2State *s = bs->opaque;
1623    bool found;
1624    Qcow2BitmapList *bm_list;
1625
1626    if (s->qcow_version < 3) {
1627        /* Without autoclear_features, we would always have to assume
1628         * that a program without persistent dirty bitmap support has
1629         * accessed this qcow2 file when opening it, and would thus
1630         * have to drop all dirty bitmaps (defeating their purpose).
1631         */
1632        error_setg(errp, "Cannot store dirty bitmaps in qcow2 v2 files");
1633        goto fail;
1634    }
1635
1636    if (check_constraints_on_bitmap(bs, name, granularity, errp) != 0) {
1637        goto fail;
1638    }
1639
1640    if (s->nb_bitmaps == 0) {
1641        return true;
1642    }
1643
1644    if (s->nb_bitmaps >= QCOW2_MAX_BITMAPS) {
1645        error_setg(errp,
1646                   "Maximum number of persistent bitmaps is already reached");
1647        goto fail;
1648    }
1649
1650    if (s->bitmap_directory_size + calc_dir_entry_size(strlen(name), 0) >
1651        QCOW2_MAX_BITMAP_DIRECTORY_SIZE)
1652    {
1653        error_setg(errp, "Not enough space in the bitmap directory");
1654        goto fail;
1655    }
1656
1657    bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
1658                               s->bitmap_directory_size, errp);
1659    if (bm_list == NULL) {
1660        goto fail;
1661    }
1662
1663    found = find_bitmap_by_name(bm_list, name);
1664    bitmap_list_free(bm_list);
1665    if (found) {
1666        error_setg(errp, "Bitmap with the same name is already stored");
1667        goto fail;
1668    }
1669
1670    return true;
1671
1672fail:
1673    error_prepend(errp, "Can't make bitmap '%s' persistent in '%s': ",
1674                  name, bdrv_get_device_or_node_name(bs));
1675    return false;
1676}
1677