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