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

dirty-bitmap.c (29099B)


      1/*
      2 * Block Dirty Bitmap
      3 *
      4 * Copyright (c) 2016-2017 Red Hat. Inc
      5 *
      6 * Permission is hereby granted, free of charge, to any person obtaining a copy
      7 * of this software and associated documentation files (the "Software"), to deal
      8 * in the Software without restriction, including without limitation the rights
      9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     10 * copies of the Software, and to permit persons to whom the Software is
     11 * furnished to do so, subject to the following conditions:
     12 *
     13 * The above copyright notice and this permission notice shall be included in
     14 * all copies or substantial portions of the Software.
     15 *
     16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     22 * THE SOFTWARE.
     23 */
     24#include "qemu/osdep.h"
     25#include "qapi/error.h"
     26#include "trace.h"
     27#include "block/block_int.h"
     28#include "block/blockjob.h"
     29#include "qemu/main-loop.h"
     30
     31struct BdrvDirtyBitmap {
     32    BlockDriverState *bs;
     33    HBitmap *bitmap;            /* Dirty bitmap implementation */
     34    bool busy;                  /* Bitmap is busy, it can't be used via QMP */
     35    BdrvDirtyBitmap *successor; /* Anonymous child, if any. */
     36    char *name;                 /* Optional non-empty unique ID */
     37    int64_t size;               /* Size of the bitmap, in bytes */
     38    bool disabled;              /* Bitmap is disabled. It ignores all writes to
     39                                   the device */
     40    int active_iterators;       /* How many iterators are active */
     41    bool readonly;              /* Bitmap is read-only. This field also
     42                                   prevents the respective image from being
     43                                   modified (i.e. blocks writes and discards).
     44                                   Such operations must fail and both the image
     45                                   and this bitmap must remain unchanged while
     46                                   this flag is set. */
     47    bool persistent;            /* bitmap must be saved to owner disk image */
     48    bool inconsistent;          /* bitmap is persistent, but inconsistent.
     49                                   It cannot be used at all in any way, except
     50                                   a QMP user can remove it. */
     51    bool skip_store;            /* We are either migrating or deleting this
     52                                 * bitmap; it should not be stored on the next
     53                                 * inactivation. */
     54    QLIST_ENTRY(BdrvDirtyBitmap) list;
     55};
     56
     57struct BdrvDirtyBitmapIter {
     58    HBitmapIter hbi;
     59    BdrvDirtyBitmap *bitmap;
     60};
     61
     62static inline void bdrv_dirty_bitmaps_lock(BlockDriverState *bs)
     63{
     64    qemu_mutex_lock(&bs->dirty_bitmap_mutex);
     65}
     66
     67static inline void bdrv_dirty_bitmaps_unlock(BlockDriverState *bs)
     68{
     69    qemu_mutex_unlock(&bs->dirty_bitmap_mutex);
     70}
     71
     72void bdrv_dirty_bitmap_lock(BdrvDirtyBitmap *bitmap)
     73{
     74    bdrv_dirty_bitmaps_lock(bitmap->bs);
     75}
     76
     77void bdrv_dirty_bitmap_unlock(BdrvDirtyBitmap *bitmap)
     78{
     79    bdrv_dirty_bitmaps_unlock(bitmap->bs);
     80}
     81
     82/* Called with BQL or dirty_bitmap lock taken.  */
     83BdrvDirtyBitmap *bdrv_find_dirty_bitmap(BlockDriverState *bs, const char *name)
     84{
     85    BdrvDirtyBitmap *bm;
     86
     87    assert(name);
     88    QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
     89        if (bm->name && !strcmp(name, bm->name)) {
     90            return bm;
     91        }
     92    }
     93    return NULL;
     94}
     95
     96/* Called with BQL taken.  */
     97BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs,
     98                                          uint32_t granularity,
     99                                          const char *name,
    100                                          Error **errp)
    101{
    102    int64_t bitmap_size;
    103    BdrvDirtyBitmap *bitmap;
    104
    105    assert(is_power_of_2(granularity) && granularity >= BDRV_SECTOR_SIZE);
    106
    107    if (name) {
    108        if (bdrv_find_dirty_bitmap(bs, name)) {
    109            error_setg(errp, "Bitmap already exists: %s", name);
    110            return NULL;
    111        }
    112        if (strlen(name) > BDRV_BITMAP_MAX_NAME_SIZE) {
    113            error_setg(errp, "Bitmap name too long: %s", name);
    114            return NULL;
    115        }
    116    }
    117    bitmap_size = bdrv_getlength(bs);
    118    if (bitmap_size < 0) {
    119        error_setg_errno(errp, -bitmap_size, "could not get length of device");
    120        errno = -bitmap_size;
    121        return NULL;
    122    }
    123    bitmap = g_new0(BdrvDirtyBitmap, 1);
    124    bitmap->bs = bs;
    125    bitmap->bitmap = hbitmap_alloc(bitmap_size, ctz32(granularity));
    126    bitmap->size = bitmap_size;
    127    bitmap->name = g_strdup(name);
    128    bitmap->disabled = false;
    129    bdrv_dirty_bitmaps_lock(bs);
    130    QLIST_INSERT_HEAD(&bs->dirty_bitmaps, bitmap, list);
    131    bdrv_dirty_bitmaps_unlock(bs);
    132    return bitmap;
    133}
    134
    135int64_t bdrv_dirty_bitmap_size(const BdrvDirtyBitmap *bitmap)
    136{
    137    return bitmap->size;
    138}
    139
    140const char *bdrv_dirty_bitmap_name(const BdrvDirtyBitmap *bitmap)
    141{
    142    return bitmap->name;
    143}
    144
    145/* Called with BQL taken.  */
    146bool bdrv_dirty_bitmap_has_successor(BdrvDirtyBitmap *bitmap)
    147{
    148    return bitmap->successor;
    149}
    150
    151static bool bdrv_dirty_bitmap_busy(const BdrvDirtyBitmap *bitmap)
    152{
    153    return bitmap->busy;
    154}
    155
    156void bdrv_dirty_bitmap_set_busy(BdrvDirtyBitmap *bitmap, bool busy)
    157{
    158    bdrv_dirty_bitmaps_lock(bitmap->bs);
    159    bitmap->busy = busy;
    160    bdrv_dirty_bitmaps_unlock(bitmap->bs);
    161}
    162
    163/* Called with BQL taken.  */
    164bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap)
    165{
    166    return !bitmap->disabled;
    167}
    168
    169/* Called with BQL taken.  */
    170static bool bdrv_dirty_bitmap_recording(BdrvDirtyBitmap *bitmap)
    171{
    172    return !bitmap->disabled || (bitmap->successor &&
    173                                 !bitmap->successor->disabled);
    174}
    175
    176int bdrv_dirty_bitmap_check(const BdrvDirtyBitmap *bitmap, uint32_t flags,
    177                            Error **errp)
    178{
    179    if ((flags & BDRV_BITMAP_BUSY) && bdrv_dirty_bitmap_busy(bitmap)) {
    180        error_setg(errp, "Bitmap '%s' is currently in use by another"
    181                   " operation and cannot be used", bitmap->name);
    182        return -1;
    183    }
    184
    185    if ((flags & BDRV_BITMAP_RO) && bdrv_dirty_bitmap_readonly(bitmap)) {
    186        error_setg(errp, "Bitmap '%s' is readonly and cannot be modified",
    187                   bitmap->name);
    188        return -1;
    189    }
    190
    191    if ((flags & BDRV_BITMAP_INCONSISTENT) &&
    192        bdrv_dirty_bitmap_inconsistent(bitmap)) {
    193        error_setg(errp, "Bitmap '%s' is inconsistent and cannot be used",
    194                   bitmap->name);
    195        error_append_hint(errp, "Try block-dirty-bitmap-remove to delete"
    196                          " this bitmap from disk\n");
    197        return -1;
    198    }
    199
    200    return 0;
    201}
    202
    203/**
    204 * Create a successor bitmap destined to replace this bitmap after an operation.
    205 * Requires that the bitmap is not marked busy and has no successor.
    206 * The successor will be enabled if the parent bitmap was.
    207 * Called with BQL taken.
    208 */
    209int bdrv_dirty_bitmap_create_successor(BdrvDirtyBitmap *bitmap, Error **errp)
    210{
    211    uint64_t granularity;
    212    BdrvDirtyBitmap *child;
    213
    214    if (bdrv_dirty_bitmap_check(bitmap, BDRV_BITMAP_BUSY, errp)) {
    215        return -1;
    216    }
    217    if (bdrv_dirty_bitmap_has_successor(bitmap)) {
    218        error_setg(errp, "Cannot create a successor for a bitmap that already "
    219                   "has one");
    220        return -1;
    221    }
    222
    223    /* Create an anonymous successor */
    224    granularity = bdrv_dirty_bitmap_granularity(bitmap);
    225    child = bdrv_create_dirty_bitmap(bitmap->bs, granularity, NULL, errp);
    226    if (!child) {
    227        return -1;
    228    }
    229
    230    /* Successor will be on or off based on our current state. */
    231    child->disabled = bitmap->disabled;
    232    bitmap->disabled = true;
    233
    234    /* Install the successor and mark the parent as busy */
    235    bitmap->successor = child;
    236    bitmap->busy = true;
    237    return 0;
    238}
    239
    240void bdrv_enable_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap)
    241{
    242    bitmap->disabled = false;
    243}
    244
    245/* Called with BQL taken. */
    246void bdrv_dirty_bitmap_enable_successor(BdrvDirtyBitmap *bitmap)
    247{
    248    assert(bitmap->bs == bitmap->successor->bs);
    249    bdrv_dirty_bitmaps_lock(bitmap->bs);
    250    bdrv_enable_dirty_bitmap_locked(bitmap->successor);
    251    bdrv_dirty_bitmaps_unlock(bitmap->bs);
    252}
    253
    254/* Called within bdrv_dirty_bitmap_lock..unlock and with BQL taken.  */
    255static void bdrv_release_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap)
    256{
    257    assert(!bitmap->active_iterators);
    258    assert(!bdrv_dirty_bitmap_busy(bitmap));
    259    assert(!bdrv_dirty_bitmap_has_successor(bitmap));
    260    QLIST_REMOVE(bitmap, list);
    261    hbitmap_free(bitmap->bitmap);
    262    g_free(bitmap->name);
    263    g_free(bitmap);
    264}
    265
    266/**
    267 * For a bitmap with a successor, yield our name to the successor,
    268 * delete the old bitmap, and return a handle to the new bitmap.
    269 * Called with BQL taken.
    270 */
    271BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BdrvDirtyBitmap *bitmap,
    272                                            Error **errp)
    273{
    274    char *name;
    275    BdrvDirtyBitmap *successor = bitmap->successor;
    276
    277    if (successor == NULL) {
    278        error_setg(errp, "Cannot relinquish control if "
    279                   "there's no successor present");
    280        return NULL;
    281    }
    282
    283    name = bitmap->name;
    284    bitmap->name = NULL;
    285    successor->name = name;
    286    bitmap->successor = NULL;
    287    successor->persistent = bitmap->persistent;
    288    bitmap->persistent = false;
    289    bitmap->busy = false;
    290    bdrv_release_dirty_bitmap(bitmap);
    291
    292    return successor;
    293}
    294
    295/**
    296 * In cases of failure where we can no longer safely delete the parent,
    297 * we may wish to re-join the parent and child/successor.
    298 * The merged parent will be marked as not busy.
    299 * The marged parent will be enabled if and only if the successor was enabled.
    300 * Called within bdrv_dirty_bitmap_lock..unlock and with BQL taken.
    301 */
    302BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap_locked(BdrvDirtyBitmap *parent,
    303                                                  Error **errp)
    304{
    305    BdrvDirtyBitmap *successor = parent->successor;
    306
    307    if (!successor) {
    308        error_setg(errp, "Cannot reclaim a successor when none is present");
    309        return NULL;
    310    }
    311
    312    if (!hbitmap_merge(parent->bitmap, successor->bitmap, parent->bitmap)) {
    313        error_setg(errp, "Merging of parent and successor bitmap failed");
    314        return NULL;
    315    }
    316
    317    parent->disabled = successor->disabled;
    318    parent->busy = false;
    319    bdrv_release_dirty_bitmap_locked(successor);
    320    parent->successor = NULL;
    321
    322    return parent;
    323}
    324
    325/* Called with BQL taken. */
    326BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BdrvDirtyBitmap *parent,
    327                                           Error **errp)
    328{
    329    BdrvDirtyBitmap *ret;
    330
    331    bdrv_dirty_bitmaps_lock(parent->bs);
    332    ret = bdrv_reclaim_dirty_bitmap_locked(parent, errp);
    333    bdrv_dirty_bitmaps_unlock(parent->bs);
    334
    335    return ret;
    336}
    337
    338/**
    339 * Truncates _all_ bitmaps attached to a BDS.
    340 * Called with BQL taken.
    341 */
    342void bdrv_dirty_bitmap_truncate(BlockDriverState *bs, int64_t bytes)
    343{
    344    BdrvDirtyBitmap *bitmap;
    345
    346    bdrv_dirty_bitmaps_lock(bs);
    347    QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
    348        assert(!bdrv_dirty_bitmap_busy(bitmap));
    349        assert(!bdrv_dirty_bitmap_has_successor(bitmap));
    350        assert(!bitmap->active_iterators);
    351        hbitmap_truncate(bitmap->bitmap, bytes);
    352        bitmap->size = bytes;
    353    }
    354    bdrv_dirty_bitmaps_unlock(bs);
    355}
    356
    357/* Called with BQL taken.  */
    358void bdrv_release_dirty_bitmap(BdrvDirtyBitmap *bitmap)
    359{
    360    BlockDriverState *bs = bitmap->bs;
    361
    362    bdrv_dirty_bitmaps_lock(bs);
    363    bdrv_release_dirty_bitmap_locked(bitmap);
    364    bdrv_dirty_bitmaps_unlock(bs);
    365}
    366
    367/**
    368 * Release all named dirty bitmaps attached to a BDS (for use in bdrv_close()).
    369 * There must not be any busy bitmaps attached.
    370 * This function does not remove persistent bitmaps from the storage.
    371 * Called with BQL taken.
    372 */
    373void bdrv_release_named_dirty_bitmaps(BlockDriverState *bs)
    374{
    375    BdrvDirtyBitmap *bm, *next;
    376
    377    bdrv_dirty_bitmaps_lock(bs);
    378    QLIST_FOREACH_SAFE(bm, &bs->dirty_bitmaps, list, next) {
    379        if (bdrv_dirty_bitmap_name(bm)) {
    380            bdrv_release_dirty_bitmap_locked(bm);
    381        }
    382    }
    383    bdrv_dirty_bitmaps_unlock(bs);
    384}
    385
    386/**
    387 * Remove persistent dirty bitmap from the storage if it exists.
    388 * Absence of bitmap is not an error, because we have the following scenario:
    389 * BdrvDirtyBitmap can have .persistent = true but not yet saved and have no
    390 * stored version. For such bitmap bdrv_remove_persistent_dirty_bitmap() should
    391 * not fail.
    392 * This function doesn't release corresponding BdrvDirtyBitmap.
    393 */
    394static int coroutine_fn
    395bdrv_co_remove_persistent_dirty_bitmap(BlockDriverState *bs, const char *name,
    396                                       Error **errp)
    397{
    398    if (bs->drv && bs->drv->bdrv_co_remove_persistent_dirty_bitmap) {
    399        return bs->drv->bdrv_co_remove_persistent_dirty_bitmap(bs, name, errp);
    400    }
    401
    402    return 0;
    403}
    404
    405typedef struct BdrvRemovePersistentDirtyBitmapCo {
    406    BlockDriverState *bs;
    407    const char *name;
    408    Error **errp;
    409    int ret;
    410} BdrvRemovePersistentDirtyBitmapCo;
    411
    412static void coroutine_fn
    413bdrv_co_remove_persistent_dirty_bitmap_entry(void *opaque)
    414{
    415    BdrvRemovePersistentDirtyBitmapCo *s = opaque;
    416
    417    s->ret = bdrv_co_remove_persistent_dirty_bitmap(s->bs, s->name, s->errp);
    418    aio_wait_kick();
    419}
    420
    421int bdrv_remove_persistent_dirty_bitmap(BlockDriverState *bs, const char *name,
    422                                        Error **errp)
    423{
    424    if (qemu_in_coroutine()) {
    425        return bdrv_co_remove_persistent_dirty_bitmap(bs, name, errp);
    426    } else {
    427        Coroutine *co;
    428        BdrvRemovePersistentDirtyBitmapCo s = {
    429            .bs = bs,
    430            .name = name,
    431            .errp = errp,
    432            .ret = -EINPROGRESS,
    433        };
    434
    435        co = qemu_coroutine_create(bdrv_co_remove_persistent_dirty_bitmap_entry,
    436                                   &s);
    437        bdrv_coroutine_enter(bs, co);
    438        BDRV_POLL_WHILE(bs, s.ret == -EINPROGRESS);
    439
    440        return s.ret;
    441    }
    442}
    443
    444bool
    445bdrv_supports_persistent_dirty_bitmap(BlockDriverState *bs)
    446{
    447    if (bs->drv && bs->drv->bdrv_supports_persistent_dirty_bitmap) {
    448        return bs->drv->bdrv_supports_persistent_dirty_bitmap(bs);
    449    }
    450    return false;
    451}
    452
    453static bool coroutine_fn
    454bdrv_co_can_store_new_dirty_bitmap(BlockDriverState *bs, const char *name,
    455                                   uint32_t granularity, Error **errp)
    456{
    457    BlockDriver *drv = bs->drv;
    458
    459    if (!drv) {
    460        error_setg_errno(errp, ENOMEDIUM,
    461                         "Can't store persistent bitmaps to %s",
    462                         bdrv_get_device_or_node_name(bs));
    463        return false;
    464    }
    465
    466    if (!drv->bdrv_co_can_store_new_dirty_bitmap) {
    467        error_setg_errno(errp, ENOTSUP,
    468                         "Can't store persistent bitmaps to %s",
    469                         bdrv_get_device_or_node_name(bs));
    470        return false;
    471    }
    472
    473    return drv->bdrv_co_can_store_new_dirty_bitmap(bs, name, granularity, errp);
    474}
    475
    476typedef struct BdrvCanStoreNewDirtyBitmapCo {
    477    BlockDriverState *bs;
    478    const char *name;
    479    uint32_t granularity;
    480    Error **errp;
    481    bool ret;
    482
    483    bool in_progress;
    484} BdrvCanStoreNewDirtyBitmapCo;
    485
    486static void coroutine_fn bdrv_co_can_store_new_dirty_bitmap_entry(void *opaque)
    487{
    488    BdrvCanStoreNewDirtyBitmapCo *s = opaque;
    489
    490    s->ret = bdrv_co_can_store_new_dirty_bitmap(s->bs, s->name, s->granularity,
    491                                                s->errp);
    492    s->in_progress = false;
    493    aio_wait_kick();
    494}
    495
    496bool bdrv_can_store_new_dirty_bitmap(BlockDriverState *bs, const char *name,
    497                                     uint32_t granularity, Error **errp)
    498{
    499    if (qemu_in_coroutine()) {
    500        return bdrv_co_can_store_new_dirty_bitmap(bs, name, granularity, errp);
    501    } else {
    502        Coroutine *co;
    503        BdrvCanStoreNewDirtyBitmapCo s = {
    504            .bs = bs,
    505            .name = name,
    506            .granularity = granularity,
    507            .errp = errp,
    508            .in_progress = true,
    509        };
    510
    511        co = qemu_coroutine_create(bdrv_co_can_store_new_dirty_bitmap_entry,
    512                                   &s);
    513        bdrv_coroutine_enter(bs, co);
    514        BDRV_POLL_WHILE(bs, s.in_progress);
    515
    516        return s.ret;
    517    }
    518}
    519
    520void bdrv_disable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
    521{
    522    bdrv_dirty_bitmaps_lock(bitmap->bs);
    523    bitmap->disabled = true;
    524    bdrv_dirty_bitmaps_unlock(bitmap->bs);
    525}
    526
    527void bdrv_enable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
    528{
    529    bdrv_dirty_bitmaps_lock(bitmap->bs);
    530    bdrv_enable_dirty_bitmap_locked(bitmap);
    531    bdrv_dirty_bitmaps_unlock(bitmap->bs);
    532}
    533
    534BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs)
    535{
    536    BdrvDirtyBitmap *bm;
    537    BlockDirtyInfoList *list = NULL;
    538    BlockDirtyInfoList **tail = &list;
    539
    540    bdrv_dirty_bitmaps_lock(bs);
    541    QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
    542        BlockDirtyInfo *info = g_new0(BlockDirtyInfo, 1);
    543
    544        info->count = bdrv_get_dirty_count(bm);
    545        info->granularity = bdrv_dirty_bitmap_granularity(bm);
    546        info->has_name = !!bm->name;
    547        info->name = g_strdup(bm->name);
    548        info->recording = bdrv_dirty_bitmap_recording(bm);
    549        info->busy = bdrv_dirty_bitmap_busy(bm);
    550        info->persistent = bm->persistent;
    551        info->has_inconsistent = bm->inconsistent;
    552        info->inconsistent = bm->inconsistent;
    553        QAPI_LIST_APPEND(tail, info);
    554    }
    555    bdrv_dirty_bitmaps_unlock(bs);
    556
    557    return list;
    558}
    559
    560/* Called within bdrv_dirty_bitmap_lock..unlock */
    561bool bdrv_dirty_bitmap_get_locked(BdrvDirtyBitmap *bitmap, int64_t offset)
    562{
    563    return hbitmap_get(bitmap->bitmap, offset);
    564}
    565
    566bool bdrv_dirty_bitmap_get(BdrvDirtyBitmap *bitmap, int64_t offset)
    567{
    568    bool ret;
    569    bdrv_dirty_bitmaps_lock(bitmap->bs);
    570    ret = bdrv_dirty_bitmap_get_locked(bitmap, offset);
    571    bdrv_dirty_bitmaps_unlock(bitmap->bs);
    572
    573    return ret;
    574}
    575
    576/**
    577 * Chooses a default granularity based on the existing cluster size,
    578 * but clamped between [4K, 64K]. Defaults to 64K in the case that there
    579 * is no cluster size information available.
    580 */
    581uint32_t bdrv_get_default_bitmap_granularity(BlockDriverState *bs)
    582{
    583    BlockDriverInfo bdi;
    584    uint32_t granularity;
    585
    586    if (bdrv_get_info(bs, &bdi) >= 0 && bdi.cluster_size > 0) {
    587        granularity = MAX(4096, bdi.cluster_size);
    588        granularity = MIN(65536, granularity);
    589    } else {
    590        granularity = 65536;
    591    }
    592
    593    return granularity;
    594}
    595
    596uint32_t bdrv_dirty_bitmap_granularity(const BdrvDirtyBitmap *bitmap)
    597{
    598    return 1U << hbitmap_granularity(bitmap->bitmap);
    599}
    600
    601BdrvDirtyBitmapIter *bdrv_dirty_iter_new(BdrvDirtyBitmap *bitmap)
    602{
    603    BdrvDirtyBitmapIter *iter = g_new(BdrvDirtyBitmapIter, 1);
    604    hbitmap_iter_init(&iter->hbi, bitmap->bitmap, 0);
    605    iter->bitmap = bitmap;
    606    bitmap->active_iterators++;
    607    return iter;
    608}
    609
    610void bdrv_dirty_iter_free(BdrvDirtyBitmapIter *iter)
    611{
    612    if (!iter) {
    613        return;
    614    }
    615    assert(iter->bitmap->active_iterators > 0);
    616    iter->bitmap->active_iterators--;
    617    g_free(iter);
    618}
    619
    620int64_t bdrv_dirty_iter_next(BdrvDirtyBitmapIter *iter)
    621{
    622    return hbitmap_iter_next(&iter->hbi);
    623}
    624
    625/* Called within bdrv_dirty_bitmap_lock..unlock */
    626void bdrv_set_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap,
    627                                  int64_t offset, int64_t bytes)
    628{
    629    assert(!bdrv_dirty_bitmap_readonly(bitmap));
    630    hbitmap_set(bitmap->bitmap, offset, bytes);
    631}
    632
    633void bdrv_set_dirty_bitmap(BdrvDirtyBitmap *bitmap,
    634                           int64_t offset, int64_t bytes)
    635{
    636    bdrv_dirty_bitmaps_lock(bitmap->bs);
    637    bdrv_set_dirty_bitmap_locked(bitmap, offset, bytes);
    638    bdrv_dirty_bitmaps_unlock(bitmap->bs);
    639}
    640
    641/* Called within bdrv_dirty_bitmap_lock..unlock */
    642void bdrv_reset_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap,
    643                                    int64_t offset, int64_t bytes)
    644{
    645    assert(!bdrv_dirty_bitmap_readonly(bitmap));
    646    hbitmap_reset(bitmap->bitmap, offset, bytes);
    647}
    648
    649void bdrv_reset_dirty_bitmap(BdrvDirtyBitmap *bitmap,
    650                             int64_t offset, int64_t bytes)
    651{
    652    bdrv_dirty_bitmaps_lock(bitmap->bs);
    653    bdrv_reset_dirty_bitmap_locked(bitmap, offset, bytes);
    654    bdrv_dirty_bitmaps_unlock(bitmap->bs);
    655}
    656
    657void bdrv_clear_dirty_bitmap(BdrvDirtyBitmap *bitmap, HBitmap **out)
    658{
    659    assert(!bdrv_dirty_bitmap_readonly(bitmap));
    660    bdrv_dirty_bitmaps_lock(bitmap->bs);
    661    if (!out) {
    662        hbitmap_reset_all(bitmap->bitmap);
    663    } else {
    664        HBitmap *backup = bitmap->bitmap;
    665        bitmap->bitmap = hbitmap_alloc(bitmap->size,
    666                                       hbitmap_granularity(backup));
    667        *out = backup;
    668    }
    669    bdrv_dirty_bitmaps_unlock(bitmap->bs);
    670}
    671
    672void bdrv_restore_dirty_bitmap(BdrvDirtyBitmap *bitmap, HBitmap *backup)
    673{
    674    HBitmap *tmp = bitmap->bitmap;
    675    assert(!bdrv_dirty_bitmap_readonly(bitmap));
    676    bitmap->bitmap = backup;
    677    hbitmap_free(tmp);
    678}
    679
    680uint64_t bdrv_dirty_bitmap_serialization_size(const BdrvDirtyBitmap *bitmap,
    681                                              uint64_t offset, uint64_t bytes)
    682{
    683    return hbitmap_serialization_size(bitmap->bitmap, offset, bytes);
    684}
    685
    686uint64_t bdrv_dirty_bitmap_serialization_align(const BdrvDirtyBitmap *bitmap)
    687{
    688    return hbitmap_serialization_align(bitmap->bitmap);
    689}
    690
    691/* Return the disk size covered by a chunk of serialized bitmap data. */
    692uint64_t bdrv_dirty_bitmap_serialization_coverage(int serialized_chunk_size,
    693                                                  const BdrvDirtyBitmap *bitmap)
    694{
    695    uint64_t granularity = bdrv_dirty_bitmap_granularity(bitmap);
    696    uint64_t limit = granularity * (serialized_chunk_size << 3);
    697
    698    assert(QEMU_IS_ALIGNED(limit,
    699                           bdrv_dirty_bitmap_serialization_align(bitmap)));
    700    return limit;
    701}
    702
    703
    704void bdrv_dirty_bitmap_serialize_part(const BdrvDirtyBitmap *bitmap,
    705                                      uint8_t *buf, uint64_t offset,
    706                                      uint64_t bytes)
    707{
    708    hbitmap_serialize_part(bitmap->bitmap, buf, offset, bytes);
    709}
    710
    711void bdrv_dirty_bitmap_deserialize_part(BdrvDirtyBitmap *bitmap,
    712                                        uint8_t *buf, uint64_t offset,
    713                                        uint64_t bytes, bool finish)
    714{
    715    hbitmap_deserialize_part(bitmap->bitmap, buf, offset, bytes, finish);
    716}
    717
    718void bdrv_dirty_bitmap_deserialize_zeroes(BdrvDirtyBitmap *bitmap,
    719                                          uint64_t offset, uint64_t bytes,
    720                                          bool finish)
    721{
    722    hbitmap_deserialize_zeroes(bitmap->bitmap, offset, bytes, finish);
    723}
    724
    725void bdrv_dirty_bitmap_deserialize_ones(BdrvDirtyBitmap *bitmap,
    726                                        uint64_t offset, uint64_t bytes,
    727                                        bool finish)
    728{
    729    hbitmap_deserialize_ones(bitmap->bitmap, offset, bytes, finish);
    730}
    731
    732void bdrv_dirty_bitmap_deserialize_finish(BdrvDirtyBitmap *bitmap)
    733{
    734    hbitmap_deserialize_finish(bitmap->bitmap);
    735}
    736
    737void bdrv_set_dirty(BlockDriverState *bs, int64_t offset, int64_t bytes)
    738{
    739    BdrvDirtyBitmap *bitmap;
    740
    741    if (QLIST_EMPTY(&bs->dirty_bitmaps)) {
    742        return;
    743    }
    744
    745    bdrv_dirty_bitmaps_lock(bs);
    746    QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
    747        if (!bdrv_dirty_bitmap_enabled(bitmap)) {
    748            continue;
    749        }
    750        assert(!bdrv_dirty_bitmap_readonly(bitmap));
    751        hbitmap_set(bitmap->bitmap, offset, bytes);
    752    }
    753    bdrv_dirty_bitmaps_unlock(bs);
    754}
    755
    756/**
    757 * Advance a BdrvDirtyBitmapIter to an arbitrary offset.
    758 */
    759void bdrv_set_dirty_iter(BdrvDirtyBitmapIter *iter, int64_t offset)
    760{
    761    hbitmap_iter_init(&iter->hbi, iter->hbi.hb, offset);
    762}
    763
    764int64_t bdrv_get_dirty_count(BdrvDirtyBitmap *bitmap)
    765{
    766    return hbitmap_count(bitmap->bitmap);
    767}
    768
    769bool bdrv_dirty_bitmap_readonly(const BdrvDirtyBitmap *bitmap)
    770{
    771    return bitmap->readonly;
    772}
    773
    774/* Called with BQL taken. */
    775void bdrv_dirty_bitmap_set_readonly(BdrvDirtyBitmap *bitmap, bool value)
    776{
    777    bdrv_dirty_bitmaps_lock(bitmap->bs);
    778    bitmap->readonly = value;
    779    bdrv_dirty_bitmaps_unlock(bitmap->bs);
    780}
    781
    782bool bdrv_has_readonly_bitmaps(BlockDriverState *bs)
    783{
    784    BdrvDirtyBitmap *bm;
    785    QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
    786        if (bm->readonly) {
    787            return true;
    788        }
    789    }
    790
    791    return false;
    792}
    793
    794bool bdrv_has_named_bitmaps(BlockDriverState *bs)
    795{
    796    BdrvDirtyBitmap *bm;
    797
    798    QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
    799        if (bdrv_dirty_bitmap_name(bm)) {
    800            return true;
    801        }
    802    }
    803
    804    return false;
    805}
    806
    807/* Called with BQL taken. */
    808void bdrv_dirty_bitmap_set_persistence(BdrvDirtyBitmap *bitmap, bool persistent)
    809{
    810    bdrv_dirty_bitmaps_lock(bitmap->bs);
    811    bitmap->persistent = persistent;
    812    bdrv_dirty_bitmaps_unlock(bitmap->bs);
    813}
    814
    815/* Called with BQL taken. */
    816void bdrv_dirty_bitmap_set_inconsistent(BdrvDirtyBitmap *bitmap)
    817{
    818    bdrv_dirty_bitmaps_lock(bitmap->bs);
    819    assert(bitmap->persistent == true);
    820    bitmap->inconsistent = true;
    821    bitmap->disabled = true;
    822    bdrv_dirty_bitmaps_unlock(bitmap->bs);
    823}
    824
    825/* Called with BQL taken. */
    826void bdrv_dirty_bitmap_skip_store(BdrvDirtyBitmap *bitmap, bool skip)
    827{
    828    bdrv_dirty_bitmaps_lock(bitmap->bs);
    829    bitmap->skip_store = skip;
    830    bdrv_dirty_bitmaps_unlock(bitmap->bs);
    831}
    832
    833bool bdrv_dirty_bitmap_get_persistence(BdrvDirtyBitmap *bitmap)
    834{
    835    return bitmap->persistent && !bitmap->skip_store;
    836}
    837
    838bool bdrv_dirty_bitmap_inconsistent(const BdrvDirtyBitmap *bitmap)
    839{
    840    return bitmap->inconsistent;
    841}
    842
    843BdrvDirtyBitmap *bdrv_dirty_bitmap_first(BlockDriverState *bs)
    844{
    845    return QLIST_FIRST(&bs->dirty_bitmaps);
    846}
    847
    848BdrvDirtyBitmap *bdrv_dirty_bitmap_next(BdrvDirtyBitmap *bitmap)
    849{
    850    return QLIST_NEXT(bitmap, list);
    851}
    852
    853char *bdrv_dirty_bitmap_sha256(const BdrvDirtyBitmap *bitmap, Error **errp)
    854{
    855    return hbitmap_sha256(bitmap->bitmap, errp);
    856}
    857
    858int64_t bdrv_dirty_bitmap_next_dirty(BdrvDirtyBitmap *bitmap, int64_t offset,
    859                                     int64_t bytes)
    860{
    861    return hbitmap_next_dirty(bitmap->bitmap, offset, bytes);
    862}
    863
    864int64_t bdrv_dirty_bitmap_next_zero(BdrvDirtyBitmap *bitmap, int64_t offset,
    865                                    int64_t bytes)
    866{
    867    return hbitmap_next_zero(bitmap->bitmap, offset, bytes);
    868}
    869
    870bool bdrv_dirty_bitmap_next_dirty_area(BdrvDirtyBitmap *bitmap,
    871        int64_t start, int64_t end, int64_t max_dirty_count,
    872        int64_t *dirty_start, int64_t *dirty_count)
    873{
    874    return hbitmap_next_dirty_area(bitmap->bitmap, start, end, max_dirty_count,
    875                                   dirty_start, dirty_count);
    876}
    877
    878/**
    879 * bdrv_merge_dirty_bitmap: merge src into dest.
    880 * Ensures permissions on bitmaps are reasonable; use for public API.
    881 *
    882 * @backup: If provided, make a copy of dest here prior to merge.
    883 */
    884void bdrv_merge_dirty_bitmap(BdrvDirtyBitmap *dest, const BdrvDirtyBitmap *src,
    885                             HBitmap **backup, Error **errp)
    886{
    887    bool ret;
    888
    889    bdrv_dirty_bitmaps_lock(dest->bs);
    890    if (src->bs != dest->bs) {
    891        bdrv_dirty_bitmaps_lock(src->bs);
    892    }
    893
    894    if (bdrv_dirty_bitmap_check(dest, BDRV_BITMAP_DEFAULT, errp)) {
    895        goto out;
    896    }
    897
    898    if (bdrv_dirty_bitmap_check(src, BDRV_BITMAP_ALLOW_RO, errp)) {
    899        goto out;
    900    }
    901
    902    if (!hbitmap_can_merge(dest->bitmap, src->bitmap)) {
    903        error_setg(errp, "Bitmaps are incompatible and can't be merged");
    904        goto out;
    905    }
    906
    907    ret = bdrv_dirty_bitmap_merge_internal(dest, src, backup, false);
    908    assert(ret);
    909
    910out:
    911    bdrv_dirty_bitmaps_unlock(dest->bs);
    912    if (src->bs != dest->bs) {
    913        bdrv_dirty_bitmaps_unlock(src->bs);
    914    }
    915}
    916
    917/**
    918 * bdrv_dirty_bitmap_merge_internal: merge src into dest.
    919 * Does NOT check bitmap permissions; not suitable for use as public API.
    920 *
    921 * @backup: If provided, make a copy of dest here prior to merge.
    922 * @lock: If true, lock and unlock bitmaps on the way in/out.
    923 * returns true if the merge succeeded; false if unattempted.
    924 */
    925bool bdrv_dirty_bitmap_merge_internal(BdrvDirtyBitmap *dest,
    926                                      const BdrvDirtyBitmap *src,
    927                                      HBitmap **backup,
    928                                      bool lock)
    929{
    930    bool ret;
    931
    932    assert(!bdrv_dirty_bitmap_readonly(dest));
    933    assert(!bdrv_dirty_bitmap_inconsistent(dest));
    934    assert(!bdrv_dirty_bitmap_inconsistent(src));
    935
    936    if (lock) {
    937        bdrv_dirty_bitmaps_lock(dest->bs);
    938        if (src->bs != dest->bs) {
    939            bdrv_dirty_bitmaps_lock(src->bs);
    940        }
    941    }
    942
    943    if (backup) {
    944        *backup = dest->bitmap;
    945        dest->bitmap = hbitmap_alloc(dest->size, hbitmap_granularity(*backup));
    946        ret = hbitmap_merge(*backup, src->bitmap, dest->bitmap);
    947    } else {
    948        ret = hbitmap_merge(dest->bitmap, src->bitmap, dest->bitmap);
    949    }
    950
    951    if (lock) {
    952        bdrv_dirty_bitmaps_unlock(dest->bs);
    953        if (src->bs != dest->bs) {
    954            bdrv_dirty_bitmaps_unlock(src->bs);
    955        }
    956    }
    957
    958    return ret;
    959}