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