block/dirty-bitmaps: unify qmp_locked and user_locked calls
[qemu/ar7.git] / block / dirty-bitmap.c
blob89c9665041536b0120e4c5584a7ad4c202a2f2ae
1 /*
2 * Block Dirty Bitmap
4 * Copyright (c) 2016-2017 Red Hat. Inc
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:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
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.
24 #include "qemu/osdep.h"
25 #include "qapi/error.h"
26 #include "qemu-common.h"
27 #include "trace.h"
28 #include "block/block_int.h"
29 #include "block/blockjob.h"
31 /**
32 * A BdrvDirtyBitmap can be in four possible user-visible states:
33 * (1) Active: successor is NULL, and disabled is false: full r/w mode
34 * (2) Disabled: successor is NULL, and disabled is true: qualified r/w mode,
35 * guest writes are dropped, but monitor writes are possible,
36 * through commands like merge and clear.
37 * (3) Frozen: successor is not NULL.
38 * A frozen bitmap cannot be renamed, deleted, cleared, set,
39 * enabled, merged to, etc. A frozen bitmap can only abdicate()
40 * or reclaim().
41 * In this state, the anonymous successor bitmap may be either
42 * Active and recording writes from the guest (e.g. backup jobs),
43 * but it can be Disabled and not recording writes.
44 * (4) Locked: Whether Active or Disabled, the user cannot modify this bitmap
45 * in any way from the monitor.
47 struct BdrvDirtyBitmap {
48 QemuMutex *mutex;
49 HBitmap *bitmap; /* Dirty bitmap implementation */
50 HBitmap *meta; /* Meta dirty bitmap */
51 bool busy; /* Bitmap is busy, it can't be used via QMP */
52 BdrvDirtyBitmap *successor; /* Anonymous child, if any. */
53 char *name; /* Optional non-empty unique ID */
54 int64_t size; /* Size of the bitmap, in bytes */
55 bool disabled; /* Bitmap is disabled. It ignores all writes to
56 the device */
57 int active_iterators; /* How many iterators are active */
58 bool readonly; /* Bitmap is read-only. This field also
59 prevents the respective image from being
60 modified (i.e. blocks writes and discards).
61 Such operations must fail and both the image
62 and this bitmap must remain unchanged while
63 this flag is set. */
64 bool persistent; /* bitmap must be saved to owner disk image */
65 bool migration; /* Bitmap is selected for migration, it should
66 not be stored on the next inactivation
67 (persistent flag doesn't matter until next
68 invalidation).*/
69 QLIST_ENTRY(BdrvDirtyBitmap) list;
72 struct BdrvDirtyBitmapIter {
73 HBitmapIter hbi;
74 BdrvDirtyBitmap *bitmap;
77 static inline void bdrv_dirty_bitmaps_lock(BlockDriverState *bs)
79 qemu_mutex_lock(&bs->dirty_bitmap_mutex);
82 static inline void bdrv_dirty_bitmaps_unlock(BlockDriverState *bs)
84 qemu_mutex_unlock(&bs->dirty_bitmap_mutex);
87 void bdrv_dirty_bitmap_lock(BdrvDirtyBitmap *bitmap)
89 qemu_mutex_lock(bitmap->mutex);
92 void bdrv_dirty_bitmap_unlock(BdrvDirtyBitmap *bitmap)
94 qemu_mutex_unlock(bitmap->mutex);
97 /* Called with BQL or dirty_bitmap lock taken. */
98 BdrvDirtyBitmap *bdrv_find_dirty_bitmap(BlockDriverState *bs, const char *name)
100 BdrvDirtyBitmap *bm;
102 assert(name);
103 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
104 if (bm->name && !strcmp(name, bm->name)) {
105 return bm;
108 return NULL;
111 /* Called with BQL taken. */
112 BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs,
113 uint32_t granularity,
114 const char *name,
115 Error **errp)
117 int64_t bitmap_size;
118 BdrvDirtyBitmap *bitmap;
120 assert(is_power_of_2(granularity) && granularity >= BDRV_SECTOR_SIZE);
122 if (name && bdrv_find_dirty_bitmap(bs, name)) {
123 error_setg(errp, "Bitmap already exists: %s", name);
124 return NULL;
126 bitmap_size = bdrv_getlength(bs);
127 if (bitmap_size < 0) {
128 error_setg_errno(errp, -bitmap_size, "could not get length of device");
129 errno = -bitmap_size;
130 return NULL;
132 bitmap = g_new0(BdrvDirtyBitmap, 1);
133 bitmap->mutex = &bs->dirty_bitmap_mutex;
134 bitmap->bitmap = hbitmap_alloc(bitmap_size, ctz32(granularity));
135 bitmap->size = bitmap_size;
136 bitmap->name = g_strdup(name);
137 bitmap->disabled = false;
138 bdrv_dirty_bitmaps_lock(bs);
139 QLIST_INSERT_HEAD(&bs->dirty_bitmaps, bitmap, list);
140 bdrv_dirty_bitmaps_unlock(bs);
141 return bitmap;
144 /* bdrv_create_meta_dirty_bitmap
146 * Create a meta dirty bitmap that tracks the changes of bits in @bitmap. I.e.
147 * when a dirty status bit in @bitmap is changed (either from reset to set or
148 * the other way around), its respective meta dirty bitmap bit will be marked
149 * dirty as well.
151 * @bitmap: the block dirty bitmap for which to create a meta dirty bitmap.
152 * @chunk_size: how many bytes of bitmap data does each bit in the meta bitmap
153 * track.
155 void bdrv_create_meta_dirty_bitmap(BdrvDirtyBitmap *bitmap,
156 int chunk_size)
158 assert(!bitmap->meta);
159 qemu_mutex_lock(bitmap->mutex);
160 bitmap->meta = hbitmap_create_meta(bitmap->bitmap,
161 chunk_size * BITS_PER_BYTE);
162 qemu_mutex_unlock(bitmap->mutex);
165 void bdrv_release_meta_dirty_bitmap(BdrvDirtyBitmap *bitmap)
167 assert(bitmap->meta);
168 qemu_mutex_lock(bitmap->mutex);
169 hbitmap_free_meta(bitmap->bitmap);
170 bitmap->meta = NULL;
171 qemu_mutex_unlock(bitmap->mutex);
174 int64_t bdrv_dirty_bitmap_size(const BdrvDirtyBitmap *bitmap)
176 return bitmap->size;
179 const char *bdrv_dirty_bitmap_name(const BdrvDirtyBitmap *bitmap)
181 return bitmap->name;
184 /* Called with BQL taken. */
185 bool bdrv_dirty_bitmap_has_successor(BdrvDirtyBitmap *bitmap)
187 return bitmap->successor;
190 bool bdrv_dirty_bitmap_busy(BdrvDirtyBitmap *bitmap)
192 return bitmap->busy;
195 void bdrv_dirty_bitmap_set_busy(BdrvDirtyBitmap *bitmap, bool busy)
197 qemu_mutex_lock(bitmap->mutex);
198 bitmap->busy = busy;
199 qemu_mutex_unlock(bitmap->mutex);
202 /* Called with BQL taken. */
203 bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap)
205 return !bitmap->disabled;
208 /* Called with BQL taken. */
209 DirtyBitmapStatus bdrv_dirty_bitmap_status(BdrvDirtyBitmap *bitmap)
211 if (bdrv_dirty_bitmap_has_successor(bitmap)) {
212 return DIRTY_BITMAP_STATUS_FROZEN;
213 } else if (bdrv_dirty_bitmap_busy(bitmap)) {
214 return DIRTY_BITMAP_STATUS_LOCKED;
215 } else if (!bdrv_dirty_bitmap_enabled(bitmap)) {
216 return DIRTY_BITMAP_STATUS_DISABLED;
217 } else {
218 return DIRTY_BITMAP_STATUS_ACTIVE;
222 /* Called with BQL taken. */
223 static bool bdrv_dirty_bitmap_recording(BdrvDirtyBitmap *bitmap)
225 return !bitmap->disabled || (bitmap->successor &&
226 !bitmap->successor->disabled);
230 * Create a successor bitmap destined to replace this bitmap after an operation.
231 * Requires that the bitmap is not marked busy and has no successor.
232 * The successor will be enabled if the parent bitmap was.
233 * Called with BQL taken.
235 int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
236 BdrvDirtyBitmap *bitmap, Error **errp)
238 uint64_t granularity;
239 BdrvDirtyBitmap *child;
241 if (bdrv_dirty_bitmap_busy(bitmap)) {
242 error_setg(errp, "Cannot create a successor for a bitmap that is "
243 "in-use by an operation");
244 return -1;
246 if (bdrv_dirty_bitmap_has_successor(bitmap)) {
247 error_setg(errp, "Cannot create a successor for a bitmap that already "
248 "has one");
249 return -1;
252 /* Create an anonymous successor */
253 granularity = bdrv_dirty_bitmap_granularity(bitmap);
254 child = bdrv_create_dirty_bitmap(bs, granularity, NULL, errp);
255 if (!child) {
256 return -1;
259 /* Successor will be on or off based on our current state. */
260 child->disabled = bitmap->disabled;
261 bitmap->disabled = true;
263 /* Install the successor and mark the parent as busy */
264 bitmap->successor = child;
265 bitmap->busy = true;
266 return 0;
269 void bdrv_enable_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap)
271 bitmap->disabled = false;
274 /* Called with BQL taken. */
275 void bdrv_dirty_bitmap_enable_successor(BdrvDirtyBitmap *bitmap)
277 assert(bitmap->mutex == bitmap->successor->mutex);
278 qemu_mutex_lock(bitmap->mutex);
279 bdrv_enable_dirty_bitmap_locked(bitmap->successor);
280 qemu_mutex_unlock(bitmap->mutex);
283 /* Called within bdrv_dirty_bitmap_lock..unlock and with BQL taken. */
284 static void bdrv_release_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap)
286 assert(!bitmap->active_iterators);
287 assert(!bdrv_dirty_bitmap_busy(bitmap));
288 assert(!bdrv_dirty_bitmap_has_successor(bitmap));
289 assert(!bitmap->meta);
290 QLIST_REMOVE(bitmap, list);
291 hbitmap_free(bitmap->bitmap);
292 g_free(bitmap->name);
293 g_free(bitmap);
297 * For a bitmap with a successor, yield our name to the successor,
298 * delete the old bitmap, and return a handle to the new bitmap.
299 * Called with BQL taken.
301 BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
302 BdrvDirtyBitmap *bitmap,
303 Error **errp)
305 char *name;
306 BdrvDirtyBitmap *successor = bitmap->successor;
308 if (successor == NULL) {
309 error_setg(errp, "Cannot relinquish control if "
310 "there's no successor present");
311 return NULL;
314 name = bitmap->name;
315 bitmap->name = NULL;
316 successor->name = name;
317 bitmap->successor = NULL;
318 successor->persistent = bitmap->persistent;
319 bitmap->persistent = false;
320 bitmap->busy = false;
321 bdrv_release_dirty_bitmap(bs, bitmap);
323 return successor;
327 * In cases of failure where we can no longer safely delete the parent,
328 * we may wish to re-join the parent and child/successor.
329 * The merged parent will be marked as not busy.
330 * The marged parent will be enabled if and only if the successor was enabled.
331 * Called within bdrv_dirty_bitmap_lock..unlock and with BQL taken.
333 BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap_locked(BlockDriverState *bs,
334 BdrvDirtyBitmap *parent,
335 Error **errp)
337 BdrvDirtyBitmap *successor = parent->successor;
339 if (!successor) {
340 error_setg(errp, "Cannot reclaim a successor when none is present");
341 return NULL;
344 if (!hbitmap_merge(parent->bitmap, successor->bitmap, parent->bitmap)) {
345 error_setg(errp, "Merging of parent and successor bitmap failed");
346 return NULL;
349 parent->disabled = successor->disabled;
350 parent->busy = false;
351 bdrv_release_dirty_bitmap_locked(successor);
352 parent->successor = NULL;
354 return parent;
357 /* Called with BQL taken. */
358 BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs,
359 BdrvDirtyBitmap *parent,
360 Error **errp)
362 BdrvDirtyBitmap *ret;
364 qemu_mutex_lock(parent->mutex);
365 ret = bdrv_reclaim_dirty_bitmap_locked(bs, parent, errp);
366 qemu_mutex_unlock(parent->mutex);
368 return ret;
372 * Truncates _all_ bitmaps attached to a BDS.
373 * Called with BQL taken.
375 void bdrv_dirty_bitmap_truncate(BlockDriverState *bs, int64_t bytes)
377 BdrvDirtyBitmap *bitmap;
379 bdrv_dirty_bitmaps_lock(bs);
380 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
381 assert(!bdrv_dirty_bitmap_busy(bitmap));
382 assert(!bdrv_dirty_bitmap_has_successor(bitmap));
383 assert(!bitmap->active_iterators);
384 hbitmap_truncate(bitmap->bitmap, bytes);
385 bitmap->size = bytes;
387 bdrv_dirty_bitmaps_unlock(bs);
390 /* Called with BQL taken. */
391 void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap)
393 bdrv_dirty_bitmaps_lock(bs);
394 bdrv_release_dirty_bitmap_locked(bitmap);
395 bdrv_dirty_bitmaps_unlock(bs);
399 * Release all named dirty bitmaps attached to a BDS (for use in bdrv_close()).
400 * There must not be any busy bitmaps attached.
401 * This function does not remove persistent bitmaps from the storage.
402 * Called with BQL taken.
404 void bdrv_release_named_dirty_bitmaps(BlockDriverState *bs)
406 BdrvDirtyBitmap *bm, *next;
408 bdrv_dirty_bitmaps_lock(bs);
409 QLIST_FOREACH_SAFE(bm, &bs->dirty_bitmaps, list, next) {
410 if (bdrv_dirty_bitmap_name(bm)) {
411 bdrv_release_dirty_bitmap_locked(bm);
414 bdrv_dirty_bitmaps_unlock(bs);
418 * Remove persistent dirty bitmap from the storage if it exists.
419 * Absence of bitmap is not an error, because we have the following scenario:
420 * BdrvDirtyBitmap can have .persistent = true but not yet saved and have no
421 * stored version. For such bitmap bdrv_remove_persistent_dirty_bitmap() should
422 * not fail.
423 * This function doesn't release corresponding BdrvDirtyBitmap.
425 void bdrv_remove_persistent_dirty_bitmap(BlockDriverState *bs,
426 const char *name,
427 Error **errp)
429 if (bs->drv && bs->drv->bdrv_remove_persistent_dirty_bitmap) {
430 bs->drv->bdrv_remove_persistent_dirty_bitmap(bs, name, errp);
434 void bdrv_disable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
436 bdrv_dirty_bitmap_lock(bitmap);
437 bitmap->disabled = true;
438 bdrv_dirty_bitmap_unlock(bitmap);
441 void bdrv_enable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
443 bdrv_dirty_bitmap_lock(bitmap);
444 bdrv_enable_dirty_bitmap_locked(bitmap);
445 bdrv_dirty_bitmap_unlock(bitmap);
448 BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs)
450 BdrvDirtyBitmap *bm;
451 BlockDirtyInfoList *list = NULL;
452 BlockDirtyInfoList **plist = &list;
454 bdrv_dirty_bitmaps_lock(bs);
455 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
456 BlockDirtyInfo *info = g_new0(BlockDirtyInfo, 1);
457 BlockDirtyInfoList *entry = g_new0(BlockDirtyInfoList, 1);
458 info->count = bdrv_get_dirty_count(bm);
459 info->granularity = bdrv_dirty_bitmap_granularity(bm);
460 info->has_name = !!bm->name;
461 info->name = g_strdup(bm->name);
462 info->status = bdrv_dirty_bitmap_status(bm);
463 info->recording = bdrv_dirty_bitmap_recording(bm);
464 info->busy = bdrv_dirty_bitmap_busy(bm);
465 info->persistent = bm->persistent;
466 entry->value = info;
467 *plist = entry;
468 plist = &entry->next;
470 bdrv_dirty_bitmaps_unlock(bs);
472 return list;
475 /* Called within bdrv_dirty_bitmap_lock..unlock */
476 bool bdrv_get_dirty_locked(BlockDriverState *bs, BdrvDirtyBitmap *bitmap,
477 int64_t offset)
479 if (bitmap) {
480 return hbitmap_get(bitmap->bitmap, offset);
481 } else {
482 return false;
487 * Chooses a default granularity based on the existing cluster size,
488 * but clamped between [4K, 64K]. Defaults to 64K in the case that there
489 * is no cluster size information available.
491 uint32_t bdrv_get_default_bitmap_granularity(BlockDriverState *bs)
493 BlockDriverInfo bdi;
494 uint32_t granularity;
496 if (bdrv_get_info(bs, &bdi) >= 0 && bdi.cluster_size > 0) {
497 granularity = MAX(4096, bdi.cluster_size);
498 granularity = MIN(65536, granularity);
499 } else {
500 granularity = 65536;
503 return granularity;
506 uint32_t bdrv_dirty_bitmap_granularity(const BdrvDirtyBitmap *bitmap)
508 return 1U << hbitmap_granularity(bitmap->bitmap);
511 BdrvDirtyBitmapIter *bdrv_dirty_iter_new(BdrvDirtyBitmap *bitmap)
513 BdrvDirtyBitmapIter *iter = g_new(BdrvDirtyBitmapIter, 1);
514 hbitmap_iter_init(&iter->hbi, bitmap->bitmap, 0);
515 iter->bitmap = bitmap;
516 bitmap->active_iterators++;
517 return iter;
520 BdrvDirtyBitmapIter *bdrv_dirty_meta_iter_new(BdrvDirtyBitmap *bitmap)
522 BdrvDirtyBitmapIter *iter = g_new(BdrvDirtyBitmapIter, 1);
523 hbitmap_iter_init(&iter->hbi, bitmap->meta, 0);
524 iter->bitmap = bitmap;
525 bitmap->active_iterators++;
526 return iter;
529 void bdrv_dirty_iter_free(BdrvDirtyBitmapIter *iter)
531 if (!iter) {
532 return;
534 assert(iter->bitmap->active_iterators > 0);
535 iter->bitmap->active_iterators--;
536 g_free(iter);
539 int64_t bdrv_dirty_iter_next(BdrvDirtyBitmapIter *iter)
541 return hbitmap_iter_next(&iter->hbi);
544 /* Called within bdrv_dirty_bitmap_lock..unlock */
545 void bdrv_set_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap,
546 int64_t offset, int64_t bytes)
548 assert(!bdrv_dirty_bitmap_readonly(bitmap));
549 hbitmap_set(bitmap->bitmap, offset, bytes);
552 void bdrv_set_dirty_bitmap(BdrvDirtyBitmap *bitmap,
553 int64_t offset, int64_t bytes)
555 bdrv_dirty_bitmap_lock(bitmap);
556 bdrv_set_dirty_bitmap_locked(bitmap, offset, bytes);
557 bdrv_dirty_bitmap_unlock(bitmap);
560 /* Called within bdrv_dirty_bitmap_lock..unlock */
561 void bdrv_reset_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap,
562 int64_t offset, int64_t bytes)
564 assert(!bdrv_dirty_bitmap_readonly(bitmap));
565 hbitmap_reset(bitmap->bitmap, offset, bytes);
568 void bdrv_reset_dirty_bitmap(BdrvDirtyBitmap *bitmap,
569 int64_t offset, int64_t bytes)
571 bdrv_dirty_bitmap_lock(bitmap);
572 bdrv_reset_dirty_bitmap_locked(bitmap, offset, bytes);
573 bdrv_dirty_bitmap_unlock(bitmap);
576 void bdrv_clear_dirty_bitmap(BdrvDirtyBitmap *bitmap, HBitmap **out)
578 assert(!bdrv_dirty_bitmap_readonly(bitmap));
579 bdrv_dirty_bitmap_lock(bitmap);
580 if (!out) {
581 hbitmap_reset_all(bitmap->bitmap);
582 } else {
583 HBitmap *backup = bitmap->bitmap;
584 bitmap->bitmap = hbitmap_alloc(bitmap->size,
585 hbitmap_granularity(backup));
586 *out = backup;
588 bdrv_dirty_bitmap_unlock(bitmap);
591 void bdrv_restore_dirty_bitmap(BdrvDirtyBitmap *bitmap, HBitmap *backup)
593 HBitmap *tmp = bitmap->bitmap;
594 assert(!bdrv_dirty_bitmap_readonly(bitmap));
595 bitmap->bitmap = backup;
596 hbitmap_free(tmp);
599 uint64_t bdrv_dirty_bitmap_serialization_size(const BdrvDirtyBitmap *bitmap,
600 uint64_t offset, uint64_t bytes)
602 return hbitmap_serialization_size(bitmap->bitmap, offset, bytes);
605 uint64_t bdrv_dirty_bitmap_serialization_align(const BdrvDirtyBitmap *bitmap)
607 return hbitmap_serialization_align(bitmap->bitmap);
610 void bdrv_dirty_bitmap_serialize_part(const BdrvDirtyBitmap *bitmap,
611 uint8_t *buf, uint64_t offset,
612 uint64_t bytes)
614 hbitmap_serialize_part(bitmap->bitmap, buf, offset, bytes);
617 void bdrv_dirty_bitmap_deserialize_part(BdrvDirtyBitmap *bitmap,
618 uint8_t *buf, uint64_t offset,
619 uint64_t bytes, bool finish)
621 hbitmap_deserialize_part(bitmap->bitmap, buf, offset, bytes, finish);
624 void bdrv_dirty_bitmap_deserialize_zeroes(BdrvDirtyBitmap *bitmap,
625 uint64_t offset, uint64_t bytes,
626 bool finish)
628 hbitmap_deserialize_zeroes(bitmap->bitmap, offset, bytes, finish);
631 void bdrv_dirty_bitmap_deserialize_ones(BdrvDirtyBitmap *bitmap,
632 uint64_t offset, uint64_t bytes,
633 bool finish)
635 hbitmap_deserialize_ones(bitmap->bitmap, offset, bytes, finish);
638 void bdrv_dirty_bitmap_deserialize_finish(BdrvDirtyBitmap *bitmap)
640 hbitmap_deserialize_finish(bitmap->bitmap);
643 void bdrv_set_dirty(BlockDriverState *bs, int64_t offset, int64_t bytes)
645 BdrvDirtyBitmap *bitmap;
647 if (QLIST_EMPTY(&bs->dirty_bitmaps)) {
648 return;
651 bdrv_dirty_bitmaps_lock(bs);
652 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
653 if (!bdrv_dirty_bitmap_enabled(bitmap)) {
654 continue;
656 assert(!bdrv_dirty_bitmap_readonly(bitmap));
657 hbitmap_set(bitmap->bitmap, offset, bytes);
659 bdrv_dirty_bitmaps_unlock(bs);
663 * Advance a BdrvDirtyBitmapIter to an arbitrary offset.
665 void bdrv_set_dirty_iter(BdrvDirtyBitmapIter *iter, int64_t offset)
667 hbitmap_iter_init(&iter->hbi, iter->hbi.hb, offset);
670 int64_t bdrv_get_dirty_count(BdrvDirtyBitmap *bitmap)
672 return hbitmap_count(bitmap->bitmap);
675 int64_t bdrv_get_meta_dirty_count(BdrvDirtyBitmap *bitmap)
677 return hbitmap_count(bitmap->meta);
680 bool bdrv_dirty_bitmap_readonly(const BdrvDirtyBitmap *bitmap)
682 return bitmap->readonly;
685 /* Called with BQL taken. */
686 void bdrv_dirty_bitmap_set_readonly(BdrvDirtyBitmap *bitmap, bool value)
688 qemu_mutex_lock(bitmap->mutex);
689 bitmap->readonly = value;
690 qemu_mutex_unlock(bitmap->mutex);
693 bool bdrv_has_readonly_bitmaps(BlockDriverState *bs)
695 BdrvDirtyBitmap *bm;
696 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
697 if (bm->readonly) {
698 return true;
702 return false;
705 /* Called with BQL taken. */
706 void bdrv_dirty_bitmap_set_persistance(BdrvDirtyBitmap *bitmap, bool persistent)
708 qemu_mutex_lock(bitmap->mutex);
709 bitmap->persistent = persistent;
710 qemu_mutex_unlock(bitmap->mutex);
713 /* Called with BQL taken. */
714 void bdrv_dirty_bitmap_set_migration(BdrvDirtyBitmap *bitmap, bool migration)
716 qemu_mutex_lock(bitmap->mutex);
717 bitmap->migration = migration;
718 qemu_mutex_unlock(bitmap->mutex);
721 bool bdrv_dirty_bitmap_get_persistance(BdrvDirtyBitmap *bitmap)
723 return bitmap->persistent && !bitmap->migration;
726 bool bdrv_has_changed_persistent_bitmaps(BlockDriverState *bs)
728 BdrvDirtyBitmap *bm;
729 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
730 if (bm->persistent && !bm->readonly && !bm->migration) {
731 return true;
735 return false;
738 BdrvDirtyBitmap *bdrv_dirty_bitmap_next(BlockDriverState *bs,
739 BdrvDirtyBitmap *bitmap)
741 return bitmap == NULL ? QLIST_FIRST(&bs->dirty_bitmaps) :
742 QLIST_NEXT(bitmap, list);
745 char *bdrv_dirty_bitmap_sha256(const BdrvDirtyBitmap *bitmap, Error **errp)
747 return hbitmap_sha256(bitmap->bitmap, errp);
750 int64_t bdrv_dirty_bitmap_next_zero(BdrvDirtyBitmap *bitmap, uint64_t offset,
751 uint64_t bytes)
753 return hbitmap_next_zero(bitmap->bitmap, offset, bytes);
756 bool bdrv_dirty_bitmap_next_dirty_area(BdrvDirtyBitmap *bitmap,
757 uint64_t *offset, uint64_t *bytes)
759 return hbitmap_next_dirty_area(bitmap->bitmap, offset, bytes);
762 void bdrv_merge_dirty_bitmap(BdrvDirtyBitmap *dest, const BdrvDirtyBitmap *src,
763 HBitmap **backup, Error **errp)
765 bool ret;
767 /* only bitmaps from one bds are supported */
768 assert(dest->mutex == src->mutex);
770 qemu_mutex_lock(dest->mutex);
772 if (bdrv_dirty_bitmap_busy(dest)) {
773 error_setg(errp, "Bitmap '%s' is currently in use by another"
774 " operation and cannot be modified", dest->name);
775 goto out;
778 if (bdrv_dirty_bitmap_readonly(dest)) {
779 error_setg(errp, "Bitmap '%s' is readonly and cannot be modified",
780 dest->name);
781 goto out;
784 if (!hbitmap_can_merge(dest->bitmap, src->bitmap)) {
785 error_setg(errp, "Bitmaps are incompatible and can't be merged");
786 goto out;
789 if (backup) {
790 *backup = dest->bitmap;
791 dest->bitmap = hbitmap_alloc(dest->size, hbitmap_granularity(*backup));
792 ret = hbitmap_merge(*backup, src->bitmap, dest->bitmap);
793 } else {
794 ret = hbitmap_merge(dest->bitmap, src->bitmap, dest->bitmap);
796 assert(ret);
798 out:
799 qemu_mutex_unlock(dest->mutex);