]> git.proxmox.com Git - mirror_qemu.git/blame - block/dirty-bitmap.c
util: remove the obsolete non-blocking connect
[mirror_qemu.git] / block / dirty-bitmap.c
CommitLineData
ebab2259
FZ
1/*
2 * Block Dirty Bitmap
3 *
4 * Copyright (c) 2016 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"
da34e65c 25#include "qapi/error.h"
ebab2259
FZ
26#include "qemu-common.h"
27#include "trace.h"
28#include "block/block_int.h"
29#include "block/blockjob.h"
30
31/**
32 * A BdrvDirtyBitmap can be in three possible states:
33 * (1) successor is NULL and disabled is false: full r/w mode
34 * (2) successor is NULL and disabled is true: read only mode ("disabled")
35 * (3) successor is set: frozen mode.
36 * A frozen bitmap cannot be renamed, deleted, anonymized, cleared, set,
37 * or enabled. A frozen bitmap can only abdicate() or reclaim().
38 */
39struct BdrvDirtyBitmap {
b64bd51e 40 QemuMutex *mutex;
ebab2259 41 HBitmap *bitmap; /* Dirty sector bitmap implementation */
fb933437 42 HBitmap *meta; /* Meta dirty bitmap */
ebab2259
FZ
43 BdrvDirtyBitmap *successor; /* Anonymous child; implies frozen status */
44 char *name; /* Optional non-empty unique ID */
45 int64_t size; /* Size of the bitmap (Number of sectors) */
8bfc932e
VSO
46 bool disabled; /* Bitmap is disabled. It ignores all writes to
47 the device */
dc162c8e 48 int active_iterators; /* How many iterators are active */
d6883bc9
VSO
49 bool readonly; /* Bitmap is read-only. This field also
50 prevents the respective image from being
51 modified (i.e. blocks writes and discards).
52 Such operations must fail and both the image
53 and this bitmap must remain unchanged while
54 this flag is set. */
a0319aac
VSO
55 bool autoload; /* For persistent bitmaps: bitmap must be
56 autoloaded on image opening */
a88b179f 57 bool persistent; /* bitmap must be saved to owner disk image */
ebab2259
FZ
58 QLIST_ENTRY(BdrvDirtyBitmap) list;
59};
60
dc162c8e
FZ
61struct BdrvDirtyBitmapIter {
62 HBitmapIter hbi;
63 BdrvDirtyBitmap *bitmap;
64};
65
2119882c
PB
66static inline void bdrv_dirty_bitmaps_lock(BlockDriverState *bs)
67{
68 qemu_mutex_lock(&bs->dirty_bitmap_mutex);
69}
70
71static inline void bdrv_dirty_bitmaps_unlock(BlockDriverState *bs)
72{
73 qemu_mutex_unlock(&bs->dirty_bitmap_mutex);
74}
75
b64bd51e
PB
76void bdrv_dirty_bitmap_lock(BdrvDirtyBitmap *bitmap)
77{
78 qemu_mutex_lock(bitmap->mutex);
79}
80
81void bdrv_dirty_bitmap_unlock(BdrvDirtyBitmap *bitmap)
82{
83 qemu_mutex_unlock(bitmap->mutex);
84}
85
2119882c 86/* Called with BQL or dirty_bitmap lock taken. */
ebab2259
FZ
87BdrvDirtyBitmap *bdrv_find_dirty_bitmap(BlockDriverState *bs, const char *name)
88{
89 BdrvDirtyBitmap *bm;
90
91 assert(name);
92 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
93 if (bm->name && !strcmp(name, bm->name)) {
94 return bm;
95 }
96 }
97 return NULL;
98}
99
2119882c 100/* Called with BQL taken. */
ebab2259
FZ
101void bdrv_dirty_bitmap_make_anon(BdrvDirtyBitmap *bitmap)
102{
103 assert(!bdrv_dirty_bitmap_frozen(bitmap));
104 g_free(bitmap->name);
105 bitmap->name = NULL;
a88b179f 106 bitmap->persistent = false;
a0319aac 107 bitmap->autoload = false;
ebab2259
FZ
108}
109
2119882c 110/* Called with BQL taken. */
ebab2259
FZ
111BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs,
112 uint32_t granularity,
113 const char *name,
114 Error **errp)
115{
116 int64_t bitmap_size;
117 BdrvDirtyBitmap *bitmap;
118 uint32_t sector_granularity;
119
120 assert((granularity & (granularity - 1)) == 0);
121
122 if (name && bdrv_find_dirty_bitmap(bs, name)) {
123 error_setg(errp, "Bitmap already exists: %s", name);
124 return NULL;
125 }
126 sector_granularity = granularity >> BDRV_SECTOR_BITS;
127 assert(sector_granularity);
128 bitmap_size = bdrv_nb_sectors(bs);
129 if (bitmap_size < 0) {
130 error_setg_errno(errp, -bitmap_size, "could not get length of device");
131 errno = -bitmap_size;
132 return NULL;
133 }
134 bitmap = g_new0(BdrvDirtyBitmap, 1);
b64bd51e 135 bitmap->mutex = &bs->dirty_bitmap_mutex;
ebab2259
FZ
136 bitmap->bitmap = hbitmap_alloc(bitmap_size, ctz32(sector_granularity));
137 bitmap->size = bitmap_size;
138 bitmap->name = g_strdup(name);
139 bitmap->disabled = false;
2119882c 140 bdrv_dirty_bitmaps_lock(bs);
ebab2259 141 QLIST_INSERT_HEAD(&bs->dirty_bitmaps, bitmap, list);
2119882c 142 bdrv_dirty_bitmaps_unlock(bs);
ebab2259
FZ
143 return bitmap;
144}
145
fb933437
FZ
146/* bdrv_create_meta_dirty_bitmap
147 *
148 * Create a meta dirty bitmap that tracks the changes of bits in @bitmap. I.e.
149 * when a dirty status bit in @bitmap is changed (either from reset to set or
150 * the other way around), its respective meta dirty bitmap bit will be marked
151 * dirty as well.
152 *
153 * @bitmap: the block dirty bitmap for which to create a meta dirty bitmap.
154 * @chunk_size: how many bytes of bitmap data does each bit in the meta bitmap
155 * track.
156 */
157void bdrv_create_meta_dirty_bitmap(BdrvDirtyBitmap *bitmap,
158 int chunk_size)
159{
160 assert(!bitmap->meta);
b64bd51e 161 qemu_mutex_lock(bitmap->mutex);
fb933437
FZ
162 bitmap->meta = hbitmap_create_meta(bitmap->bitmap,
163 chunk_size * BITS_PER_BYTE);
b64bd51e 164 qemu_mutex_unlock(bitmap->mutex);
fb933437
FZ
165}
166
167void bdrv_release_meta_dirty_bitmap(BdrvDirtyBitmap *bitmap)
168{
169 assert(bitmap->meta);
b64bd51e 170 qemu_mutex_lock(bitmap->mutex);
fb933437
FZ
171 hbitmap_free_meta(bitmap->bitmap);
172 bitmap->meta = NULL;
b64bd51e 173 qemu_mutex_unlock(bitmap->mutex);
fb933437
FZ
174}
175
b64bd51e
PB
176int bdrv_dirty_bitmap_get_meta_locked(BlockDriverState *bs,
177 BdrvDirtyBitmap *bitmap, int64_t sector,
178 int nb_sectors)
fb933437
FZ
179{
180 uint64_t i;
181 int sectors_per_bit = 1 << hbitmap_granularity(bitmap->meta);
182
183 /* To optimize: we can make hbitmap to internally check the range in a
184 * coarse level, or at least do it word by word. */
185 for (i = sector; i < sector + nb_sectors; i += sectors_per_bit) {
186 if (hbitmap_get(bitmap->meta, i)) {
187 return true;
188 }
189 }
190 return false;
191}
192
b64bd51e
PB
193int bdrv_dirty_bitmap_get_meta(BlockDriverState *bs,
194 BdrvDirtyBitmap *bitmap, int64_t sector,
195 int nb_sectors)
196{
197 bool dirty;
198
199 qemu_mutex_lock(bitmap->mutex);
200 dirty = bdrv_dirty_bitmap_get_meta_locked(bs, bitmap, sector, nb_sectors);
201 qemu_mutex_unlock(bitmap->mutex);
202
203 return dirty;
204}
205
fb933437
FZ
206void bdrv_dirty_bitmap_reset_meta(BlockDriverState *bs,
207 BdrvDirtyBitmap *bitmap, int64_t sector,
208 int nb_sectors)
209{
b64bd51e 210 qemu_mutex_lock(bitmap->mutex);
fb933437 211 hbitmap_reset(bitmap->meta, sector, nb_sectors);
b64bd51e 212 qemu_mutex_unlock(bitmap->mutex);
fb933437
FZ
213}
214
15891fac
FZ
215int64_t bdrv_dirty_bitmap_size(const BdrvDirtyBitmap *bitmap)
216{
217 return bitmap->size;
218}
219
220const char *bdrv_dirty_bitmap_name(const BdrvDirtyBitmap *bitmap)
221{
222 return bitmap->name;
223}
224
2119882c 225/* Called with BQL taken. */
ebab2259
FZ
226bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap)
227{
228 return bitmap->successor;
229}
230
2119882c 231/* Called with BQL taken. */
ebab2259
FZ
232bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap)
233{
234 return !(bitmap->disabled || bitmap->successor);
235}
236
2119882c 237/* Called with BQL taken. */
ebab2259
FZ
238DirtyBitmapStatus bdrv_dirty_bitmap_status(BdrvDirtyBitmap *bitmap)
239{
240 if (bdrv_dirty_bitmap_frozen(bitmap)) {
241 return DIRTY_BITMAP_STATUS_FROZEN;
242 } else if (!bdrv_dirty_bitmap_enabled(bitmap)) {
243 return DIRTY_BITMAP_STATUS_DISABLED;
244 } else {
245 return DIRTY_BITMAP_STATUS_ACTIVE;
246 }
247}
248
249/**
250 * Create a successor bitmap destined to replace this bitmap after an operation.
251 * Requires that the bitmap is not frozen and has no successor.
2119882c 252 * Called with BQL taken.
ebab2259
FZ
253 */
254int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
255 BdrvDirtyBitmap *bitmap, Error **errp)
256{
257 uint64_t granularity;
258 BdrvDirtyBitmap *child;
259
260 if (bdrv_dirty_bitmap_frozen(bitmap)) {
261 error_setg(errp, "Cannot create a successor for a bitmap that is "
262 "currently frozen");
263 return -1;
264 }
265 assert(!bitmap->successor);
266
267 /* Create an anonymous successor */
268 granularity = bdrv_dirty_bitmap_granularity(bitmap);
269 child = bdrv_create_dirty_bitmap(bs, granularity, NULL, errp);
270 if (!child) {
271 return -1;
272 }
273
274 /* Successor will be on or off based on our current state. */
275 child->disabled = bitmap->disabled;
276
277 /* Install the successor and freeze the parent */
278 bitmap->successor = child;
279 return 0;
280}
281
282/**
283 * For a bitmap with a successor, yield our name to the successor,
284 * delete the old bitmap, and return a handle to the new bitmap.
2119882c 285 * Called with BQL taken.
ebab2259
FZ
286 */
287BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
288 BdrvDirtyBitmap *bitmap,
289 Error **errp)
290{
291 char *name;
292 BdrvDirtyBitmap *successor = bitmap->successor;
293
294 if (successor == NULL) {
295 error_setg(errp, "Cannot relinquish control if "
296 "there's no successor present");
297 return NULL;
298 }
299
300 name = bitmap->name;
301 bitmap->name = NULL;
302 successor->name = name;
303 bitmap->successor = NULL;
a88b179f
VSO
304 successor->persistent = bitmap->persistent;
305 bitmap->persistent = false;
a0319aac
VSO
306 successor->autoload = bitmap->autoload;
307 bitmap->autoload = false;
ebab2259
FZ
308 bdrv_release_dirty_bitmap(bs, bitmap);
309
310 return successor;
311}
312
313/**
314 * In cases of failure where we can no longer safely delete the parent,
315 * we may wish to re-join the parent and child/successor.
316 * The merged parent will be un-frozen, but not explicitly re-enabled.
2119882c 317 * Called with BQL taken.
ebab2259
FZ
318 */
319BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs,
320 BdrvDirtyBitmap *parent,
321 Error **errp)
322{
323 BdrvDirtyBitmap *successor = parent->successor;
324
325 if (!successor) {
326 error_setg(errp, "Cannot reclaim a successor when none is present");
327 return NULL;
328 }
329
330 if (!hbitmap_merge(parent->bitmap, successor->bitmap)) {
331 error_setg(errp, "Merging of parent and successor bitmap failed");
332 return NULL;
333 }
334 bdrv_release_dirty_bitmap(bs, successor);
335 parent->successor = NULL;
336
337 return parent;
338}
339
340/**
341 * Truncates _all_ bitmaps attached to a BDS.
2119882c 342 * Called with BQL taken.
ebab2259
FZ
343 */
344void bdrv_dirty_bitmap_truncate(BlockDriverState *bs)
345{
346 BdrvDirtyBitmap *bitmap;
347 uint64_t size = bdrv_nb_sectors(bs);
348
2119882c 349 bdrv_dirty_bitmaps_lock(bs);
ebab2259
FZ
350 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
351 assert(!bdrv_dirty_bitmap_frozen(bitmap));
dc162c8e 352 assert(!bitmap->active_iterators);
ebab2259
FZ
353 hbitmap_truncate(bitmap->bitmap, size);
354 bitmap->size = size;
355 }
2119882c 356 bdrv_dirty_bitmaps_unlock(bs);
ebab2259
FZ
357}
358
615b5dcf
VSO
359static bool bdrv_dirty_bitmap_has_name(BdrvDirtyBitmap *bitmap)
360{
361 return !!bdrv_dirty_bitmap_name(bitmap);
362}
363
2119882c 364/* Called with BQL taken. */
615b5dcf
VSO
365static void bdrv_do_release_matching_dirty_bitmap(
366 BlockDriverState *bs, BdrvDirtyBitmap *bitmap,
367 bool (*cond)(BdrvDirtyBitmap *bitmap))
ebab2259
FZ
368{
369 BdrvDirtyBitmap *bm, *next;
2119882c 370 bdrv_dirty_bitmaps_lock(bs);
ebab2259 371 QLIST_FOREACH_SAFE(bm, &bs->dirty_bitmaps, list, next) {
615b5dcf 372 if ((!bitmap || bm == bitmap) && (!cond || cond(bm))) {
dc162c8e 373 assert(!bm->active_iterators);
ebab2259 374 assert(!bdrv_dirty_bitmap_frozen(bm));
fb933437 375 assert(!bm->meta);
ebab2259
FZ
376 QLIST_REMOVE(bm, list);
377 hbitmap_free(bm->bitmap);
378 g_free(bm->name);
379 g_free(bm);
380
381 if (bitmap) {
2119882c 382 goto out;
ebab2259
FZ
383 }
384 }
385 }
7105007a
FZ
386 if (bitmap) {
387 abort();
388 }
2119882c
PB
389
390out:
391 bdrv_dirty_bitmaps_unlock(bs);
ebab2259
FZ
392}
393
2119882c 394/* Called with BQL taken. */
ebab2259
FZ
395void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap)
396{
615b5dcf 397 bdrv_do_release_matching_dirty_bitmap(bs, bitmap, NULL);
ebab2259
FZ
398}
399
400/**
401 * Release all named dirty bitmaps attached to a BDS (for use in bdrv_close()).
402 * There must not be any frozen bitmaps attached.
56f364e6 403 * This function does not remove persistent bitmaps from the storage.
2119882c 404 * Called with BQL taken.
ebab2259
FZ
405 */
406void bdrv_release_named_dirty_bitmaps(BlockDriverState *bs)
407{
615b5dcf
VSO
408 bdrv_do_release_matching_dirty_bitmap(bs, NULL, bdrv_dirty_bitmap_has_name);
409}
410
411/**
412 * Release all persistent dirty bitmaps attached to a BDS (for use in
413 * bdrv_inactivate_recurse()).
414 * There must not be any frozen bitmaps attached.
415 * This function does not remove persistent bitmaps from the storage.
416 */
417void bdrv_release_persistent_dirty_bitmaps(BlockDriverState *bs)
418{
419 bdrv_do_release_matching_dirty_bitmap(bs, NULL,
420 bdrv_dirty_bitmap_get_persistance);
ebab2259
FZ
421}
422
56f364e6
VSO
423/**
424 * Remove persistent dirty bitmap from the storage if it exists.
425 * Absence of bitmap is not an error, because we have the following scenario:
426 * BdrvDirtyBitmap can have .persistent = true but not yet saved and have no
427 * stored version. For such bitmap bdrv_remove_persistent_dirty_bitmap() should
428 * not fail.
429 * This function doesn't release corresponding BdrvDirtyBitmap.
430 */
431void bdrv_remove_persistent_dirty_bitmap(BlockDriverState *bs,
432 const char *name,
433 Error **errp)
434{
435 if (bs->drv && bs->drv->bdrv_remove_persistent_dirty_bitmap) {
436 bs->drv->bdrv_remove_persistent_dirty_bitmap(bs, name, errp);
437 }
438}
439
2119882c 440/* Called with BQL taken. */
ebab2259
FZ
441void bdrv_disable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
442{
443 assert(!bdrv_dirty_bitmap_frozen(bitmap));
444 bitmap->disabled = true;
445}
446
2119882c 447/* Called with BQL taken. */
ebab2259
FZ
448void bdrv_enable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
449{
450 assert(!bdrv_dirty_bitmap_frozen(bitmap));
451 bitmap->disabled = false;
452}
453
454BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs)
455{
456 BdrvDirtyBitmap *bm;
457 BlockDirtyInfoList *list = NULL;
458 BlockDirtyInfoList **plist = &list;
459
2119882c 460 bdrv_dirty_bitmaps_lock(bs);
ebab2259
FZ
461 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
462 BlockDirtyInfo *info = g_new0(BlockDirtyInfo, 1);
463 BlockDirtyInfoList *entry = g_new0(BlockDirtyInfoList, 1);
6c98c57a 464 info->count = bdrv_get_dirty_count(bm) << BDRV_SECTOR_BITS;
ebab2259
FZ
465 info->granularity = bdrv_dirty_bitmap_granularity(bm);
466 info->has_name = !!bm->name;
467 info->name = g_strdup(bm->name);
468 info->status = bdrv_dirty_bitmap_status(bm);
469 entry->value = info;
470 *plist = entry;
471 plist = &entry->next;
472 }
2119882c 473 bdrv_dirty_bitmaps_unlock(bs);
ebab2259
FZ
474
475 return list;
476}
477
b64bd51e
PB
478/* Called within bdrv_dirty_bitmap_lock..unlock */
479int bdrv_get_dirty_locked(BlockDriverState *bs, BdrvDirtyBitmap *bitmap,
480 int64_t sector)
ebab2259
FZ
481{
482 if (bitmap) {
483 return hbitmap_get(bitmap->bitmap, sector);
484 } else {
485 return 0;
486 }
487}
488
489/**
490 * Chooses a default granularity based on the existing cluster size,
491 * but clamped between [4K, 64K]. Defaults to 64K in the case that there
492 * is no cluster size information available.
493 */
494uint32_t bdrv_get_default_bitmap_granularity(BlockDriverState *bs)
495{
496 BlockDriverInfo bdi;
497 uint32_t granularity;
498
499 if (bdrv_get_info(bs, &bdi) >= 0 && bdi.cluster_size > 0) {
500 granularity = MAX(4096, bdi.cluster_size);
501 granularity = MIN(65536, granularity);
502 } else {
503 granularity = 65536;
504 }
505
506 return granularity;
507}
508
ba06ff1a 509uint32_t bdrv_dirty_bitmap_granularity(const BdrvDirtyBitmap *bitmap)
ebab2259
FZ
510{
511 return BDRV_SECTOR_SIZE << hbitmap_granularity(bitmap->bitmap);
512}
513
6d3f4049
FZ
514uint32_t bdrv_dirty_bitmap_meta_granularity(BdrvDirtyBitmap *bitmap)
515{
516 return BDRV_SECTOR_SIZE << hbitmap_granularity(bitmap->meta);
517}
518
dc162c8e
FZ
519BdrvDirtyBitmapIter *bdrv_dirty_iter_new(BdrvDirtyBitmap *bitmap,
520 uint64_t first_sector)
521{
522 BdrvDirtyBitmapIter *iter = g_new(BdrvDirtyBitmapIter, 1);
523 hbitmap_iter_init(&iter->hbi, bitmap->bitmap, first_sector);
524 iter->bitmap = bitmap;
525 bitmap->active_iterators++;
526 return iter;
527}
528
6d3f4049
FZ
529BdrvDirtyBitmapIter *bdrv_dirty_meta_iter_new(BdrvDirtyBitmap *bitmap)
530{
531 BdrvDirtyBitmapIter *iter = g_new(BdrvDirtyBitmapIter, 1);
532 hbitmap_iter_init(&iter->hbi, bitmap->meta, 0);
533 iter->bitmap = bitmap;
534 bitmap->active_iterators++;
535 return iter;
536}
537
dc162c8e
FZ
538void bdrv_dirty_iter_free(BdrvDirtyBitmapIter *iter)
539{
540 if (!iter) {
541 return;
542 }
543 assert(iter->bitmap->active_iterators > 0);
544 iter->bitmap->active_iterators--;
545 g_free(iter);
546}
547
548int64_t bdrv_dirty_iter_next(BdrvDirtyBitmapIter *iter)
ebab2259 549{
dc162c8e 550 return hbitmap_iter_next(&iter->hbi);
ebab2259
FZ
551}
552
b64bd51e
PB
553/* Called within bdrv_dirty_bitmap_lock..unlock */
554void bdrv_set_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap,
555 int64_t cur_sector, int64_t nr_sectors)
556{
557 assert(bdrv_dirty_bitmap_enabled(bitmap));
d6883bc9 558 assert(!bdrv_dirty_bitmap_readonly(bitmap));
b64bd51e
PB
559 hbitmap_set(bitmap->bitmap, cur_sector, nr_sectors);
560}
561
ebab2259 562void bdrv_set_dirty_bitmap(BdrvDirtyBitmap *bitmap,
6d078599 563 int64_t cur_sector, int64_t nr_sectors)
b64bd51e
PB
564{
565 bdrv_dirty_bitmap_lock(bitmap);
566 bdrv_set_dirty_bitmap_locked(bitmap, cur_sector, nr_sectors);
567 bdrv_dirty_bitmap_unlock(bitmap);
568}
569
570/* Called within bdrv_dirty_bitmap_lock..unlock */
571void bdrv_reset_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap,
572 int64_t cur_sector, int64_t nr_sectors)
ebab2259
FZ
573{
574 assert(bdrv_dirty_bitmap_enabled(bitmap));
d6883bc9 575 assert(!bdrv_dirty_bitmap_readonly(bitmap));
b64bd51e 576 hbitmap_reset(bitmap->bitmap, cur_sector, nr_sectors);
ebab2259
FZ
577}
578
579void bdrv_reset_dirty_bitmap(BdrvDirtyBitmap *bitmap,
6d078599 580 int64_t cur_sector, int64_t nr_sectors)
ebab2259 581{
b64bd51e
PB
582 bdrv_dirty_bitmap_lock(bitmap);
583 bdrv_reset_dirty_bitmap_locked(bitmap, cur_sector, nr_sectors);
584 bdrv_dirty_bitmap_unlock(bitmap);
ebab2259
FZ
585}
586
587void bdrv_clear_dirty_bitmap(BdrvDirtyBitmap *bitmap, HBitmap **out)
588{
589 assert(bdrv_dirty_bitmap_enabled(bitmap));
d6883bc9 590 assert(!bdrv_dirty_bitmap_readonly(bitmap));
b64bd51e 591 bdrv_dirty_bitmap_lock(bitmap);
ebab2259
FZ
592 if (!out) {
593 hbitmap_reset_all(bitmap->bitmap);
594 } else {
595 HBitmap *backup = bitmap->bitmap;
596 bitmap->bitmap = hbitmap_alloc(bitmap->size,
597 hbitmap_granularity(backup));
598 *out = backup;
599 }
b64bd51e 600 bdrv_dirty_bitmap_unlock(bitmap);
ebab2259
FZ
601}
602
603void bdrv_undo_clear_dirty_bitmap(BdrvDirtyBitmap *bitmap, HBitmap *in)
604{
605 HBitmap *tmp = bitmap->bitmap;
606 assert(bdrv_dirty_bitmap_enabled(bitmap));
d6883bc9 607 assert(!bdrv_dirty_bitmap_readonly(bitmap));
ebab2259
FZ
608 bitmap->bitmap = in;
609 hbitmap_free(tmp);
610}
611
882c36f5
VSO
612uint64_t bdrv_dirty_bitmap_serialization_size(const BdrvDirtyBitmap *bitmap,
613 uint64_t start, uint64_t count)
614{
615 return hbitmap_serialization_size(bitmap->bitmap, start, count);
616}
617
618uint64_t bdrv_dirty_bitmap_serialization_align(const BdrvDirtyBitmap *bitmap)
619{
620 return hbitmap_serialization_granularity(bitmap->bitmap);
621}
622
623void bdrv_dirty_bitmap_serialize_part(const BdrvDirtyBitmap *bitmap,
624 uint8_t *buf, uint64_t start,
625 uint64_t count)
626{
627 hbitmap_serialize_part(bitmap->bitmap, buf, start, count);
628}
629
630void bdrv_dirty_bitmap_deserialize_part(BdrvDirtyBitmap *bitmap,
631 uint8_t *buf, uint64_t start,
632 uint64_t count, bool finish)
633{
634 hbitmap_deserialize_part(bitmap->bitmap, buf, start, count, finish);
635}
636
637void bdrv_dirty_bitmap_deserialize_zeroes(BdrvDirtyBitmap *bitmap,
638 uint64_t start, uint64_t count,
639 bool finish)
640{
641 hbitmap_deserialize_zeroes(bitmap->bitmap, start, count, finish);
6bdc8b71
VSO
642}
643
644void bdrv_dirty_bitmap_deserialize_ones(BdrvDirtyBitmap *bitmap,
645 uint64_t start, uint64_t count,
646 bool finish)
647{
648 hbitmap_deserialize_ones(bitmap->bitmap, start, count, finish);
882c36f5
VSO
649}
650
651void bdrv_dirty_bitmap_deserialize_finish(BdrvDirtyBitmap *bitmap)
652{
653 hbitmap_deserialize_finish(bitmap->bitmap);
654}
655
ebab2259 656void bdrv_set_dirty(BlockDriverState *bs, int64_t cur_sector,
6d078599 657 int64_t nr_sectors)
ebab2259
FZ
658{
659 BdrvDirtyBitmap *bitmap;
2119882c
PB
660
661 if (QLIST_EMPTY(&bs->dirty_bitmaps)) {
662 return;
663 }
664
665 bdrv_dirty_bitmaps_lock(bs);
ebab2259
FZ
666 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
667 if (!bdrv_dirty_bitmap_enabled(bitmap)) {
668 continue;
669 }
d6883bc9 670 assert(!bdrv_dirty_bitmap_readonly(bitmap));
ebab2259
FZ
671 hbitmap_set(bitmap->bitmap, cur_sector, nr_sectors);
672 }
2119882c 673 bdrv_dirty_bitmaps_unlock(bs);
ebab2259
FZ
674}
675
676/**
dc162c8e 677 * Advance a BdrvDirtyBitmapIter to an arbitrary offset.
ebab2259 678 */
dc162c8e 679void bdrv_set_dirty_iter(BdrvDirtyBitmapIter *iter, int64_t sector_num)
ebab2259 680{
dc162c8e 681 hbitmap_iter_init(&iter->hbi, iter->hbi.hb, sector_num);
ebab2259
FZ
682}
683
684int64_t bdrv_get_dirty_count(BdrvDirtyBitmap *bitmap)
685{
686 return hbitmap_count(bitmap->bitmap);
687}
6d3f4049
FZ
688
689int64_t bdrv_get_meta_dirty_count(BdrvDirtyBitmap *bitmap)
690{
691 return hbitmap_count(bitmap->meta);
692}
d6883bc9
VSO
693
694bool bdrv_dirty_bitmap_readonly(const BdrvDirtyBitmap *bitmap)
695{
696 return bitmap->readonly;
697}
698
699/* Called with BQL taken. */
700void bdrv_dirty_bitmap_set_readonly(BdrvDirtyBitmap *bitmap, bool value)
701{
702 qemu_mutex_lock(bitmap->mutex);
703 bitmap->readonly = value;
704 qemu_mutex_unlock(bitmap->mutex);
705}
706
707bool bdrv_has_readonly_bitmaps(BlockDriverState *bs)
708{
709 BdrvDirtyBitmap *bm;
710 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
711 if (bm->readonly) {
712 return true;
713 }
714 }
715
716 return false;
717}
a0319aac
VSO
718
719/* Called with BQL taken. */
720void bdrv_dirty_bitmap_set_autoload(BdrvDirtyBitmap *bitmap, bool autoload)
721{
722 qemu_mutex_lock(bitmap->mutex);
723 bitmap->autoload = autoload;
724 qemu_mutex_unlock(bitmap->mutex);
725}
726
727bool bdrv_dirty_bitmap_get_autoload(const BdrvDirtyBitmap *bitmap)
728{
729 return bitmap->autoload;
730}
a88b179f
VSO
731
732/* Called with BQL taken. */
733void bdrv_dirty_bitmap_set_persistance(BdrvDirtyBitmap *bitmap, bool persistent)
734{
735 qemu_mutex_lock(bitmap->mutex);
736 bitmap->persistent = persistent;
737 qemu_mutex_unlock(bitmap->mutex);
738}
739
740bool bdrv_dirty_bitmap_get_persistance(BdrvDirtyBitmap *bitmap)
741{
742 return bitmap->persistent;
743}
744
745bool bdrv_has_changed_persistent_bitmaps(BlockDriverState *bs)
746{
747 BdrvDirtyBitmap *bm;
748 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
749 if (bm->persistent && !bm->readonly) {
750 return true;
751 }
752 }
753
754 return false;
755}
3dd10a06
VSO
756
757BdrvDirtyBitmap *bdrv_dirty_bitmap_next(BlockDriverState *bs,
758 BdrvDirtyBitmap *bitmap)
759{
760 return bitmap == NULL ? QLIST_FIRST(&bs->dirty_bitmaps) :
761 QLIST_NEXT(bitmap, list);
762}
a3b52535
VSO
763
764char *bdrv_dirty_bitmap_sha256(const BdrvDirtyBitmap *bitmap, Error **errp)
765{
766 return hbitmap_sha256(bitmap->bitmap, errp);
767}