]> git.proxmox.com Git - mirror_qemu.git/blob - block/dirty-bitmap.c
block/dirty-bitmap: change semantics of enabled predicate
[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;
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 * The successor will be enabled if the parent bitmap was.
240 * Called with BQL taken.
241 */
242 int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
243 BdrvDirtyBitmap *bitmap, Error **errp)
244 {
245 uint64_t granularity;
246 BdrvDirtyBitmap *child;
247
248 if (bdrv_dirty_bitmap_user_locked(bitmap)) {
249 error_setg(errp, "Cannot create a successor for a bitmap that is "
250 "in-use by an operation");
251 return -1;
252 }
253 if (bdrv_dirty_bitmap_has_successor(bitmap)) {
254 error_setg(errp, "Cannot create a successor for a bitmap that already "
255 "has one");
256 return -1;
257 }
258
259 /* Create an anonymous successor */
260 granularity = bdrv_dirty_bitmap_granularity(bitmap);
261 child = bdrv_create_dirty_bitmap(bs, granularity, NULL, errp);
262 if (!child) {
263 return -1;
264 }
265
266 /* Successor will be on or off based on our current state. */
267 child->disabled = bitmap->disabled;
268 bitmap->disabled = true;
269
270 /* Install the successor and freeze the parent */
271 bitmap->successor = child;
272 return 0;
273 }
274
275 void bdrv_enable_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap)
276 {
277 bitmap->disabled = false;
278 }
279
280 /* Called with BQL taken. */
281 void bdrv_dirty_bitmap_enable_successor(BdrvDirtyBitmap *bitmap)
282 {
283 assert(bitmap->mutex == bitmap->successor->mutex);
284 qemu_mutex_lock(bitmap->mutex);
285 bdrv_enable_dirty_bitmap_locked(bitmap->successor);
286 qemu_mutex_unlock(bitmap->mutex);
287 }
288
289 /* Called within bdrv_dirty_bitmap_lock..unlock and with BQL taken. */
290 static void bdrv_release_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap)
291 {
292 assert(!bitmap->active_iterators);
293 assert(!bdrv_dirty_bitmap_user_locked(bitmap));
294 assert(!bdrv_dirty_bitmap_has_successor(bitmap));
295 assert(!bitmap->meta);
296 QLIST_REMOVE(bitmap, list);
297 hbitmap_free(bitmap->bitmap);
298 g_free(bitmap->name);
299 g_free(bitmap);
300 }
301
302 /**
303 * For a bitmap with a successor, yield our name to the successor,
304 * delete the old bitmap, and return a handle to the new bitmap.
305 * Called with BQL taken.
306 */
307 BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
308 BdrvDirtyBitmap *bitmap,
309 Error **errp)
310 {
311 char *name;
312 BdrvDirtyBitmap *successor = bitmap->successor;
313
314 if (successor == NULL) {
315 error_setg(errp, "Cannot relinquish control if "
316 "there's no successor present");
317 return NULL;
318 }
319
320 name = bitmap->name;
321 bitmap->name = NULL;
322 successor->name = name;
323 bitmap->successor = NULL;
324 successor->persistent = bitmap->persistent;
325 bitmap->persistent = false;
326 bdrv_release_dirty_bitmap(bs, bitmap);
327
328 return successor;
329 }
330
331 /**
332 * In cases of failure where we can no longer safely delete the parent,
333 * we may wish to re-join the parent and child/successor.
334 * The merged parent will not be user_locked.
335 * The marged parent will be enabled if and only if the successor was enabled.
336 * Called within bdrv_dirty_bitmap_lock..unlock and with BQL taken.
337 */
338 BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap_locked(BlockDriverState *bs,
339 BdrvDirtyBitmap *parent,
340 Error **errp)
341 {
342 BdrvDirtyBitmap *successor = parent->successor;
343
344 if (!successor) {
345 error_setg(errp, "Cannot reclaim a successor when none is present");
346 return NULL;
347 }
348
349 if (!hbitmap_merge(parent->bitmap, successor->bitmap, parent->bitmap)) {
350 error_setg(errp, "Merging of parent and successor bitmap failed");
351 return NULL;
352 }
353
354 parent->disabled = successor->disabled;
355 bdrv_release_dirty_bitmap_locked(successor);
356 parent->successor = NULL;
357
358 return parent;
359 }
360
361 /* Called with BQL taken. */
362 BdrvDirtyBitmap *bdrv_reclaim_dirty_bitmap(BlockDriverState *bs,
363 BdrvDirtyBitmap *parent,
364 Error **errp)
365 {
366 BdrvDirtyBitmap *ret;
367
368 qemu_mutex_lock(parent->mutex);
369 ret = bdrv_reclaim_dirty_bitmap_locked(bs, parent, errp);
370 qemu_mutex_unlock(parent->mutex);
371
372 return ret;
373 }
374
375 /**
376 * Truncates _all_ bitmaps attached to a BDS.
377 * Called with BQL taken.
378 */
379 void bdrv_dirty_bitmap_truncate(BlockDriverState *bs, int64_t bytes)
380 {
381 BdrvDirtyBitmap *bitmap;
382
383 bdrv_dirty_bitmaps_lock(bs);
384 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
385 assert(!bdrv_dirty_bitmap_user_locked(bitmap));
386 assert(!bdrv_dirty_bitmap_has_successor(bitmap));
387 assert(!bitmap->active_iterators);
388 hbitmap_truncate(bitmap->bitmap, bytes);
389 bitmap->size = bytes;
390 }
391 bdrv_dirty_bitmaps_unlock(bs);
392 }
393
394 /* Called with BQL taken. */
395 void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap)
396 {
397 bdrv_dirty_bitmaps_lock(bs);
398 bdrv_release_dirty_bitmap_locked(bitmap);
399 bdrv_dirty_bitmaps_unlock(bs);
400 }
401
402 /**
403 * Release all named dirty bitmaps attached to a BDS (for use in bdrv_close()).
404 * There must not be any user_locked bitmaps attached.
405 * This function does not remove persistent bitmaps from the storage.
406 * Called with BQL taken.
407 */
408 void bdrv_release_named_dirty_bitmaps(BlockDriverState *bs)
409 {
410 BdrvDirtyBitmap *bm, *next;
411
412 bdrv_dirty_bitmaps_lock(bs);
413 QLIST_FOREACH_SAFE(bm, &bs->dirty_bitmaps, list, next) {
414 if (bdrv_dirty_bitmap_name(bm)) {
415 bdrv_release_dirty_bitmap_locked(bm);
416 }
417 }
418 bdrv_dirty_bitmaps_unlock(bs);
419 }
420
421 /**
422 * Remove persistent dirty bitmap from the storage if it exists.
423 * Absence of bitmap is not an error, because we have the following scenario:
424 * BdrvDirtyBitmap can have .persistent = true but not yet saved and have no
425 * stored version. For such bitmap bdrv_remove_persistent_dirty_bitmap() should
426 * not fail.
427 * This function doesn't release corresponding BdrvDirtyBitmap.
428 */
429 void bdrv_remove_persistent_dirty_bitmap(BlockDriverState *bs,
430 const char *name,
431 Error **errp)
432 {
433 if (bs->drv && bs->drv->bdrv_remove_persistent_dirty_bitmap) {
434 bs->drv->bdrv_remove_persistent_dirty_bitmap(bs, name, errp);
435 }
436 }
437
438 void bdrv_disable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
439 {
440 bdrv_dirty_bitmap_lock(bitmap);
441 bitmap->disabled = true;
442 bdrv_dirty_bitmap_unlock(bitmap);
443 }
444
445 void bdrv_enable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
446 {
447 bdrv_dirty_bitmap_lock(bitmap);
448 bdrv_enable_dirty_bitmap_locked(bitmap);
449 bdrv_dirty_bitmap_unlock(bitmap);
450 }
451
452 BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs)
453 {
454 BdrvDirtyBitmap *bm;
455 BlockDirtyInfoList *list = NULL;
456 BlockDirtyInfoList **plist = &list;
457
458 bdrv_dirty_bitmaps_lock(bs);
459 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
460 BlockDirtyInfo *info = g_new0(BlockDirtyInfo, 1);
461 BlockDirtyInfoList *entry = g_new0(BlockDirtyInfoList, 1);
462 info->count = bdrv_get_dirty_count(bm);
463 info->granularity = bdrv_dirty_bitmap_granularity(bm);
464 info->has_name = !!bm->name;
465 info->name = g_strdup(bm->name);
466 info->status = bdrv_dirty_bitmap_status(bm);
467 info->recording = bdrv_dirty_bitmap_recording(bm);
468 info->busy = bdrv_dirty_bitmap_user_locked(bm);
469 info->persistent = bm->persistent;
470 entry->value = info;
471 *plist = entry;
472 plist = &entry->next;
473 }
474 bdrv_dirty_bitmaps_unlock(bs);
475
476 return list;
477 }
478
479 /* Called within bdrv_dirty_bitmap_lock..unlock */
480 bool bdrv_get_dirty_locked(BlockDriverState *bs, BdrvDirtyBitmap *bitmap,
481 int64_t offset)
482 {
483 if (bitmap) {
484 return hbitmap_get(bitmap->bitmap, offset);
485 } else {
486 return false;
487 }
488 }
489
490 /**
491 * Chooses a default granularity based on the existing cluster size,
492 * but clamped between [4K, 64K]. Defaults to 64K in the case that there
493 * is no cluster size information available.
494 */
495 uint32_t bdrv_get_default_bitmap_granularity(BlockDriverState *bs)
496 {
497 BlockDriverInfo bdi;
498 uint32_t granularity;
499
500 if (bdrv_get_info(bs, &bdi) >= 0 && bdi.cluster_size > 0) {
501 granularity = MAX(4096, bdi.cluster_size);
502 granularity = MIN(65536, granularity);
503 } else {
504 granularity = 65536;
505 }
506
507 return granularity;
508 }
509
510 uint32_t bdrv_dirty_bitmap_granularity(const BdrvDirtyBitmap *bitmap)
511 {
512 return 1U << hbitmap_granularity(bitmap->bitmap);
513 }
514
515 BdrvDirtyBitmapIter *bdrv_dirty_iter_new(BdrvDirtyBitmap *bitmap)
516 {
517 BdrvDirtyBitmapIter *iter = g_new(BdrvDirtyBitmapIter, 1);
518 hbitmap_iter_init(&iter->hbi, bitmap->bitmap, 0);
519 iter->bitmap = bitmap;
520 bitmap->active_iterators++;
521 return iter;
522 }
523
524 BdrvDirtyBitmapIter *bdrv_dirty_meta_iter_new(BdrvDirtyBitmap *bitmap)
525 {
526 BdrvDirtyBitmapIter *iter = g_new(BdrvDirtyBitmapIter, 1);
527 hbitmap_iter_init(&iter->hbi, bitmap->meta, 0);
528 iter->bitmap = bitmap;
529 bitmap->active_iterators++;
530 return iter;
531 }
532
533 void bdrv_dirty_iter_free(BdrvDirtyBitmapIter *iter)
534 {
535 if (!iter) {
536 return;
537 }
538 assert(iter->bitmap->active_iterators > 0);
539 iter->bitmap->active_iterators--;
540 g_free(iter);
541 }
542
543 int64_t bdrv_dirty_iter_next(BdrvDirtyBitmapIter *iter)
544 {
545 return hbitmap_iter_next(&iter->hbi);
546 }
547
548 /* Called within bdrv_dirty_bitmap_lock..unlock */
549 void bdrv_set_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap,
550 int64_t offset, int64_t bytes)
551 {
552 assert(!bdrv_dirty_bitmap_readonly(bitmap));
553 hbitmap_set(bitmap->bitmap, offset, bytes);
554 }
555
556 void bdrv_set_dirty_bitmap(BdrvDirtyBitmap *bitmap,
557 int64_t offset, int64_t bytes)
558 {
559 bdrv_dirty_bitmap_lock(bitmap);
560 bdrv_set_dirty_bitmap_locked(bitmap, offset, bytes);
561 bdrv_dirty_bitmap_unlock(bitmap);
562 }
563
564 /* Called within bdrv_dirty_bitmap_lock..unlock */
565 void bdrv_reset_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap,
566 int64_t offset, int64_t bytes)
567 {
568 assert(!bdrv_dirty_bitmap_readonly(bitmap));
569 hbitmap_reset(bitmap->bitmap, offset, bytes);
570 }
571
572 void bdrv_reset_dirty_bitmap(BdrvDirtyBitmap *bitmap,
573 int64_t offset, int64_t bytes)
574 {
575 bdrv_dirty_bitmap_lock(bitmap);
576 bdrv_reset_dirty_bitmap_locked(bitmap, offset, bytes);
577 bdrv_dirty_bitmap_unlock(bitmap);
578 }
579
580 void bdrv_clear_dirty_bitmap(BdrvDirtyBitmap *bitmap, HBitmap **out)
581 {
582 assert(!bdrv_dirty_bitmap_readonly(bitmap));
583 bdrv_dirty_bitmap_lock(bitmap);
584 if (!out) {
585 hbitmap_reset_all(bitmap->bitmap);
586 } else {
587 HBitmap *backup = bitmap->bitmap;
588 bitmap->bitmap = hbitmap_alloc(bitmap->size,
589 hbitmap_granularity(backup));
590 *out = backup;
591 }
592 bdrv_dirty_bitmap_unlock(bitmap);
593 }
594
595 void bdrv_restore_dirty_bitmap(BdrvDirtyBitmap *bitmap, HBitmap *backup)
596 {
597 HBitmap *tmp = bitmap->bitmap;
598 assert(!bdrv_dirty_bitmap_readonly(bitmap));
599 bitmap->bitmap = backup;
600 hbitmap_free(tmp);
601 }
602
603 uint64_t bdrv_dirty_bitmap_serialization_size(const BdrvDirtyBitmap *bitmap,
604 uint64_t offset, uint64_t bytes)
605 {
606 return hbitmap_serialization_size(bitmap->bitmap, offset, bytes);
607 }
608
609 uint64_t bdrv_dirty_bitmap_serialization_align(const BdrvDirtyBitmap *bitmap)
610 {
611 return hbitmap_serialization_align(bitmap->bitmap);
612 }
613
614 void bdrv_dirty_bitmap_serialize_part(const BdrvDirtyBitmap *bitmap,
615 uint8_t *buf, uint64_t offset,
616 uint64_t bytes)
617 {
618 hbitmap_serialize_part(bitmap->bitmap, buf, offset, bytes);
619 }
620
621 void bdrv_dirty_bitmap_deserialize_part(BdrvDirtyBitmap *bitmap,
622 uint8_t *buf, uint64_t offset,
623 uint64_t bytes, bool finish)
624 {
625 hbitmap_deserialize_part(bitmap->bitmap, buf, offset, bytes, finish);
626 }
627
628 void bdrv_dirty_bitmap_deserialize_zeroes(BdrvDirtyBitmap *bitmap,
629 uint64_t offset, uint64_t bytes,
630 bool finish)
631 {
632 hbitmap_deserialize_zeroes(bitmap->bitmap, offset, bytes, finish);
633 }
634
635 void bdrv_dirty_bitmap_deserialize_ones(BdrvDirtyBitmap *bitmap,
636 uint64_t offset, uint64_t bytes,
637 bool finish)
638 {
639 hbitmap_deserialize_ones(bitmap->bitmap, offset, bytes, finish);
640 }
641
642 void bdrv_dirty_bitmap_deserialize_finish(BdrvDirtyBitmap *bitmap)
643 {
644 hbitmap_deserialize_finish(bitmap->bitmap);
645 }
646
647 void bdrv_set_dirty(BlockDriverState *bs, int64_t offset, int64_t bytes)
648 {
649 BdrvDirtyBitmap *bitmap;
650
651 if (QLIST_EMPTY(&bs->dirty_bitmaps)) {
652 return;
653 }
654
655 bdrv_dirty_bitmaps_lock(bs);
656 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
657 if (!bdrv_dirty_bitmap_enabled(bitmap)) {
658 continue;
659 }
660 assert(!bdrv_dirty_bitmap_readonly(bitmap));
661 hbitmap_set(bitmap->bitmap, offset, bytes);
662 }
663 bdrv_dirty_bitmaps_unlock(bs);
664 }
665
666 /**
667 * Advance a BdrvDirtyBitmapIter to an arbitrary offset.
668 */
669 void bdrv_set_dirty_iter(BdrvDirtyBitmapIter *iter, int64_t offset)
670 {
671 hbitmap_iter_init(&iter->hbi, iter->hbi.hb, offset);
672 }
673
674 int64_t bdrv_get_dirty_count(BdrvDirtyBitmap *bitmap)
675 {
676 return hbitmap_count(bitmap->bitmap);
677 }
678
679 int64_t bdrv_get_meta_dirty_count(BdrvDirtyBitmap *bitmap)
680 {
681 return hbitmap_count(bitmap->meta);
682 }
683
684 bool bdrv_dirty_bitmap_readonly(const BdrvDirtyBitmap *bitmap)
685 {
686 return bitmap->readonly;
687 }
688
689 /* Called with BQL taken. */
690 void bdrv_dirty_bitmap_set_readonly(BdrvDirtyBitmap *bitmap, bool value)
691 {
692 qemu_mutex_lock(bitmap->mutex);
693 bitmap->readonly = value;
694 qemu_mutex_unlock(bitmap->mutex);
695 }
696
697 bool bdrv_has_readonly_bitmaps(BlockDriverState *bs)
698 {
699 BdrvDirtyBitmap *bm;
700 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
701 if (bm->readonly) {
702 return true;
703 }
704 }
705
706 return false;
707 }
708
709 /* Called with BQL taken. */
710 void bdrv_dirty_bitmap_set_persistance(BdrvDirtyBitmap *bitmap, bool persistent)
711 {
712 qemu_mutex_lock(bitmap->mutex);
713 bitmap->persistent = persistent;
714 qemu_mutex_unlock(bitmap->mutex);
715 }
716
717 /* Called with BQL taken. */
718 void bdrv_dirty_bitmap_set_migration(BdrvDirtyBitmap *bitmap, bool migration)
719 {
720 qemu_mutex_lock(bitmap->mutex);
721 bitmap->migration = migration;
722 qemu_mutex_unlock(bitmap->mutex);
723 }
724
725 bool bdrv_dirty_bitmap_get_persistance(BdrvDirtyBitmap *bitmap)
726 {
727 return bitmap->persistent && !bitmap->migration;
728 }
729
730 bool bdrv_has_changed_persistent_bitmaps(BlockDriverState *bs)
731 {
732 BdrvDirtyBitmap *bm;
733 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
734 if (bm->persistent && !bm->readonly && !bm->migration) {
735 return true;
736 }
737 }
738
739 return false;
740 }
741
742 BdrvDirtyBitmap *bdrv_dirty_bitmap_next(BlockDriverState *bs,
743 BdrvDirtyBitmap *bitmap)
744 {
745 return bitmap == NULL ? QLIST_FIRST(&bs->dirty_bitmaps) :
746 QLIST_NEXT(bitmap, list);
747 }
748
749 char *bdrv_dirty_bitmap_sha256(const BdrvDirtyBitmap *bitmap, Error **errp)
750 {
751 return hbitmap_sha256(bitmap->bitmap, errp);
752 }
753
754 int64_t bdrv_dirty_bitmap_next_zero(BdrvDirtyBitmap *bitmap, uint64_t offset,
755 uint64_t bytes)
756 {
757 return hbitmap_next_zero(bitmap->bitmap, offset, bytes);
758 }
759
760 bool bdrv_dirty_bitmap_next_dirty_area(BdrvDirtyBitmap *bitmap,
761 uint64_t *offset, uint64_t *bytes)
762 {
763 return hbitmap_next_dirty_area(bitmap->bitmap, offset, bytes);
764 }
765
766 void bdrv_merge_dirty_bitmap(BdrvDirtyBitmap *dest, const BdrvDirtyBitmap *src,
767 HBitmap **backup, Error **errp)
768 {
769 bool ret;
770
771 /* only bitmaps from one bds are supported */
772 assert(dest->mutex == src->mutex);
773
774 qemu_mutex_lock(dest->mutex);
775
776 if (bdrv_dirty_bitmap_user_locked(dest)) {
777 error_setg(errp, "Bitmap '%s' is currently in use by another"
778 " operation and cannot be modified", dest->name);
779 goto out;
780 }
781
782 if (bdrv_dirty_bitmap_readonly(dest)) {
783 error_setg(errp, "Bitmap '%s' is readonly and cannot be modified",
784 dest->name);
785 goto out;
786 }
787
788 if (!hbitmap_can_merge(dest->bitmap, src->bitmap)) {
789 error_setg(errp, "Bitmaps are incompatible and can't be merged");
790 goto out;
791 }
792
793 if (backup) {
794 *backup = dest->bitmap;
795 dest->bitmap = hbitmap_alloc(dest->size, hbitmap_granularity(*backup));
796 ret = hbitmap_merge(*backup, src->bitmap, dest->bitmap);
797 } else {
798 ret = hbitmap_merge(dest->bitmap, src->bitmap, dest->bitmap);
799 }
800 assert(ret);
801
802 out:
803 qemu_mutex_unlock(dest->mutex);
804 }