]> git.proxmox.com Git - mirror_qemu.git/blame - block/dirty-bitmap.c
qapi: Introduce QAPI_LIST_APPEND
[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
ef893b5c
EB
481bool
482bdrv_supports_persistent_dirty_bitmap(BlockDriverState *bs)
483{
484 if (bs->drv && bs->drv->bdrv_supports_persistent_dirty_bitmap) {
485 return bs->drv->bdrv_supports_persistent_dirty_bitmap(bs);
486 }
487 return false;
488}
489
d2c3080e
VSO
490static bool coroutine_fn
491bdrv_co_can_store_new_dirty_bitmap(BlockDriverState *bs, const char *name,
492 uint32_t granularity, Error **errp)
85cc8a4f
VSO
493{
494 BlockDriver *drv = bs->drv;
495
496 if (!drv) {
497 error_setg_errno(errp, ENOMEDIUM,
498 "Can't store persistent bitmaps to %s",
499 bdrv_get_device_or_node_name(bs));
500 return false;
501 }
502
d2c3080e 503 if (!drv->bdrv_co_can_store_new_dirty_bitmap) {
85cc8a4f
VSO
504 error_setg_errno(errp, ENOTSUP,
505 "Can't store persistent bitmaps to %s",
506 bdrv_get_device_or_node_name(bs));
507 return false;
508 }
509
d2c3080e
VSO
510 return drv->bdrv_co_can_store_new_dirty_bitmap(bs, name, granularity, errp);
511}
512
513typedef struct BdrvCanStoreNewDirtyBitmapCo {
514 BlockDriverState *bs;
515 const char *name;
516 uint32_t granularity;
517 Error **errp;
518 bool ret;
519
520 bool in_progress;
521} BdrvCanStoreNewDirtyBitmapCo;
522
523static void coroutine_fn bdrv_co_can_store_new_dirty_bitmap_entry(void *opaque)
524{
525 BdrvCanStoreNewDirtyBitmapCo *s = opaque;
526
527 s->ret = bdrv_co_can_store_new_dirty_bitmap(s->bs, s->name, s->granularity,
528 s->errp);
529 s->in_progress = false;
530 aio_wait_kick();
531}
532
533bool bdrv_can_store_new_dirty_bitmap(BlockDriverState *bs, const char *name,
534 uint32_t granularity, Error **errp)
535{
536 if (qemu_in_coroutine()) {
537 return bdrv_co_can_store_new_dirty_bitmap(bs, name, granularity, errp);
538 } else {
539 Coroutine *co;
540 BdrvCanStoreNewDirtyBitmapCo s = {
541 .bs = bs,
542 .name = name,
543 .granularity = granularity,
544 .errp = errp,
545 .in_progress = true,
546 };
547
548 co = qemu_coroutine_create(bdrv_co_can_store_new_dirty_bitmap_entry,
549 &s);
550 bdrv_coroutine_enter(bs, co);
551 BDRV_POLL_WHILE(bs, s.in_progress);
552
553 return s.ret;
554 }
85cc8a4f
VSO
555}
556
ebab2259
FZ
557void bdrv_disable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
558{
1e638301 559 bdrv_dirty_bitmaps_lock(bitmap->bs);
ebab2259 560 bitmap->disabled = true;
1e638301 561 bdrv_dirty_bitmaps_unlock(bitmap->bs);
ebab2259
FZ
562}
563
564void bdrv_enable_dirty_bitmap(BdrvDirtyBitmap *bitmap)
565{
1e638301 566 bdrv_dirty_bitmaps_lock(bitmap->bs);
92bcea40 567 bdrv_enable_dirty_bitmap_locked(bitmap);
1e638301 568 bdrv_dirty_bitmaps_unlock(bitmap->bs);
ebab2259
FZ
569}
570
571BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs)
572{
573 BdrvDirtyBitmap *bm;
574 BlockDirtyInfoList *list = NULL;
575 BlockDirtyInfoList **plist = &list;
576
2119882c 577 bdrv_dirty_bitmaps_lock(bs);
ebab2259
FZ
578 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
579 BlockDirtyInfo *info = g_new0(BlockDirtyInfo, 1);
580 BlockDirtyInfoList *entry = g_new0(BlockDirtyInfoList, 1);
9a46dba7 581 info->count = bdrv_get_dirty_count(bm);
ebab2259
FZ
582 info->granularity = bdrv_dirty_bitmap_granularity(bm);
583 info->has_name = !!bm->name;
584 info->name = g_strdup(bm->name);
585 info->status = bdrv_dirty_bitmap_status(bm);
4db6ceb0 586 info->recording = bdrv_dirty_bitmap_recording(bm);
27a1b301 587 info->busy = bdrv_dirty_bitmap_busy(bm);
f67cf661 588 info->persistent = bm->persistent;
b0f45559
JS
589 info->has_inconsistent = bm->inconsistent;
590 info->inconsistent = bm->inconsistent;
ebab2259
FZ
591 entry->value = info;
592 *plist = entry;
593 plist = &entry->next;
594 }
2119882c 595 bdrv_dirty_bitmaps_unlock(bs);
ebab2259
FZ
596
597 return list;
598}
599
b64bd51e 600/* Called within bdrv_dirty_bitmap_lock..unlock */
28636b82 601bool bdrv_dirty_bitmap_get_locked(BdrvDirtyBitmap *bitmap, int64_t offset)
ebab2259 602{
28636b82
JS
603 return hbitmap_get(bitmap->bitmap, offset);
604}
605
606bool bdrv_dirty_bitmap_get(BdrvDirtyBitmap *bitmap, int64_t offset)
607{
608 bool ret;
1e638301 609 bdrv_dirty_bitmaps_lock(bitmap->bs);
28636b82 610 ret = bdrv_dirty_bitmap_get_locked(bitmap, offset);
1e638301 611 bdrv_dirty_bitmaps_unlock(bitmap->bs);
28636b82
JS
612
613 return ret;
ebab2259
FZ
614}
615
616/**
617 * Chooses a default granularity based on the existing cluster size,
618 * but clamped between [4K, 64K]. Defaults to 64K in the case that there
619 * is no cluster size information available.
620 */
621uint32_t bdrv_get_default_bitmap_granularity(BlockDriverState *bs)
622{
623 BlockDriverInfo bdi;
624 uint32_t granularity;
625
626 if (bdrv_get_info(bs, &bdi) >= 0 && bdi.cluster_size > 0) {
627 granularity = MAX(4096, bdi.cluster_size);
628 granularity = MIN(65536, granularity);
629 } else {
630 granularity = 65536;
631 }
632
633 return granularity;
634}
635
ba06ff1a 636uint32_t bdrv_dirty_bitmap_granularity(const BdrvDirtyBitmap *bitmap)
ebab2259 637{
ca759622 638 return 1U << hbitmap_granularity(bitmap->bitmap);
ebab2259
FZ
639}
640
715a74d8 641BdrvDirtyBitmapIter *bdrv_dirty_iter_new(BdrvDirtyBitmap *bitmap)
dc162c8e
FZ
642{
643 BdrvDirtyBitmapIter *iter = g_new(BdrvDirtyBitmapIter, 1);
715a74d8 644 hbitmap_iter_init(&iter->hbi, bitmap->bitmap, 0);
dc162c8e
FZ
645 iter->bitmap = bitmap;
646 bitmap->active_iterators++;
647 return iter;
648}
649
650void bdrv_dirty_iter_free(BdrvDirtyBitmapIter *iter)
651{
652 if (!iter) {
653 return;
654 }
655 assert(iter->bitmap->active_iterators > 0);
656 iter->bitmap->active_iterators--;
657 g_free(iter);
658}
659
660int64_t bdrv_dirty_iter_next(BdrvDirtyBitmapIter *iter)
ebab2259 661{
19c021e1 662 return hbitmap_iter_next(&iter->hbi);
ebab2259
FZ
663}
664
b64bd51e
PB
665/* Called within bdrv_dirty_bitmap_lock..unlock */
666void bdrv_set_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap,
e0d7f73e 667 int64_t offset, int64_t bytes)
b64bd51e 668{
d6883bc9 669 assert(!bdrv_dirty_bitmap_readonly(bitmap));
ca759622 670 hbitmap_set(bitmap->bitmap, offset, bytes);
b64bd51e
PB
671}
672
ebab2259 673void bdrv_set_dirty_bitmap(BdrvDirtyBitmap *bitmap,
e0d7f73e 674 int64_t offset, int64_t bytes)
b64bd51e 675{
1e638301 676 bdrv_dirty_bitmaps_lock(bitmap->bs);
e0d7f73e 677 bdrv_set_dirty_bitmap_locked(bitmap, offset, bytes);
1e638301 678 bdrv_dirty_bitmaps_unlock(bitmap->bs);
b64bd51e
PB
679}
680
681/* Called within bdrv_dirty_bitmap_lock..unlock */
682void bdrv_reset_dirty_bitmap_locked(BdrvDirtyBitmap *bitmap,
e0d7f73e 683 int64_t offset, int64_t bytes)
ebab2259 684{
d6883bc9 685 assert(!bdrv_dirty_bitmap_readonly(bitmap));
ca759622 686 hbitmap_reset(bitmap->bitmap, offset, bytes);
ebab2259
FZ
687}
688
689void bdrv_reset_dirty_bitmap(BdrvDirtyBitmap *bitmap,
e0d7f73e 690 int64_t offset, int64_t bytes)
ebab2259 691{
1e638301 692 bdrv_dirty_bitmaps_lock(bitmap->bs);
e0d7f73e 693 bdrv_reset_dirty_bitmap_locked(bitmap, offset, bytes);
1e638301 694 bdrv_dirty_bitmaps_unlock(bitmap->bs);
ebab2259
FZ
695}
696
697void bdrv_clear_dirty_bitmap(BdrvDirtyBitmap *bitmap, HBitmap **out)
698{
d6883bc9 699 assert(!bdrv_dirty_bitmap_readonly(bitmap));
1e638301 700 bdrv_dirty_bitmaps_lock(bitmap->bs);
ebab2259
FZ
701 if (!out) {
702 hbitmap_reset_all(bitmap->bitmap);
703 } else {
704 HBitmap *backup = bitmap->bitmap;
ca759622 705 bitmap->bitmap = hbitmap_alloc(bitmap->size,
ebab2259
FZ
706 hbitmap_granularity(backup));
707 *out = backup;
708 }
1e638301 709 bdrv_dirty_bitmaps_unlock(bitmap->bs);
ebab2259
FZ
710}
711
56bd6624 712void bdrv_restore_dirty_bitmap(BdrvDirtyBitmap *bitmap, HBitmap *backup)
ebab2259
FZ
713{
714 HBitmap *tmp = bitmap->bitmap;
d6883bc9 715 assert(!bdrv_dirty_bitmap_readonly(bitmap));
56bd6624 716 bitmap->bitmap = backup;
ebab2259
FZ
717 hbitmap_free(tmp);
718}
719
882c36f5 720uint64_t bdrv_dirty_bitmap_serialization_size(const BdrvDirtyBitmap *bitmap,
86f6ae67 721 uint64_t offset, uint64_t bytes)
882c36f5 722{
ca759622 723 return hbitmap_serialization_size(bitmap->bitmap, offset, bytes);
882c36f5
VSO
724}
725
726uint64_t bdrv_dirty_bitmap_serialization_align(const BdrvDirtyBitmap *bitmap)
727{
ca759622 728 return hbitmap_serialization_align(bitmap->bitmap);
882c36f5
VSO
729}
730
731void bdrv_dirty_bitmap_serialize_part(const BdrvDirtyBitmap *bitmap,
86f6ae67
EB
732 uint8_t *buf, uint64_t offset,
733 uint64_t bytes)
882c36f5 734{
ca759622 735 hbitmap_serialize_part(bitmap->bitmap, buf, offset, bytes);
882c36f5
VSO
736}
737
738void bdrv_dirty_bitmap_deserialize_part(BdrvDirtyBitmap *bitmap,
86f6ae67
EB
739 uint8_t *buf, uint64_t offset,
740 uint64_t bytes, bool finish)
882c36f5 741{
ca759622 742 hbitmap_deserialize_part(bitmap->bitmap, buf, offset, bytes, finish);
882c36f5
VSO
743}
744
745void bdrv_dirty_bitmap_deserialize_zeroes(BdrvDirtyBitmap *bitmap,
86f6ae67 746 uint64_t offset, uint64_t bytes,
882c36f5
VSO
747 bool finish)
748{
ca759622 749 hbitmap_deserialize_zeroes(bitmap->bitmap, offset, bytes, finish);
6bdc8b71
VSO
750}
751
752void bdrv_dirty_bitmap_deserialize_ones(BdrvDirtyBitmap *bitmap,
86f6ae67 753 uint64_t offset, uint64_t bytes,
6bdc8b71
VSO
754 bool finish)
755{
ca759622 756 hbitmap_deserialize_ones(bitmap->bitmap, offset, bytes, finish);
882c36f5
VSO
757}
758
759void bdrv_dirty_bitmap_deserialize_finish(BdrvDirtyBitmap *bitmap)
760{
761 hbitmap_deserialize_finish(bitmap->bitmap);
762}
763
0fdf1a4f 764void bdrv_set_dirty(BlockDriverState *bs, int64_t offset, int64_t bytes)
ebab2259
FZ
765{
766 BdrvDirtyBitmap *bitmap;
2119882c
PB
767
768 if (QLIST_EMPTY(&bs->dirty_bitmaps)) {
769 return;
770 }
771
772 bdrv_dirty_bitmaps_lock(bs);
ebab2259
FZ
773 QLIST_FOREACH(bitmap, &bs->dirty_bitmaps, list) {
774 if (!bdrv_dirty_bitmap_enabled(bitmap)) {
775 continue;
776 }
d6883bc9 777 assert(!bdrv_dirty_bitmap_readonly(bitmap));
ca759622 778 hbitmap_set(bitmap->bitmap, offset, bytes);
ebab2259 779 }
2119882c 780 bdrv_dirty_bitmaps_unlock(bs);
ebab2259
FZ
781}
782
783/**
dc162c8e 784 * Advance a BdrvDirtyBitmapIter to an arbitrary offset.
ebab2259 785 */
715a74d8 786void bdrv_set_dirty_iter(BdrvDirtyBitmapIter *iter, int64_t offset)
ebab2259 787{
ca759622 788 hbitmap_iter_init(&iter->hbi, iter->hbi.hb, offset);
ebab2259
FZ
789}
790
791int64_t bdrv_get_dirty_count(BdrvDirtyBitmap *bitmap)
792{
ca759622 793 return hbitmap_count(bitmap->bitmap);
ebab2259 794}
6d3f4049 795
d6883bc9
VSO
796bool bdrv_dirty_bitmap_readonly(const BdrvDirtyBitmap *bitmap)
797{
798 return bitmap->readonly;
799}
800
801/* Called with BQL taken. */
802void bdrv_dirty_bitmap_set_readonly(BdrvDirtyBitmap *bitmap, bool value)
803{
1e638301 804 bdrv_dirty_bitmaps_lock(bitmap->bs);
d6883bc9 805 bitmap->readonly = value;
1e638301 806 bdrv_dirty_bitmaps_unlock(bitmap->bs);
d6883bc9
VSO
807}
808
809bool bdrv_has_readonly_bitmaps(BlockDriverState *bs)
810{
811 BdrvDirtyBitmap *bm;
812 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
813 if (bm->readonly) {
814 return true;
815 }
816 }
817
818 return false;
819}
a0319aac 820
7ae89a0d
VSO
821bool bdrv_has_named_bitmaps(BlockDriverState *bs)
822{
823 BdrvDirtyBitmap *bm;
824
825 QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
826 if (bdrv_dirty_bitmap_name(bm)) {
827 return true;
828 }
829 }
830
831 return false;
832}
833
a88b179f 834/* Called with BQL taken. */
796a3798 835void bdrv_dirty_bitmap_set_persistence(BdrvDirtyBitmap *bitmap, bool persistent)
a88b179f 836{
1e638301 837 bdrv_dirty_bitmaps_lock(bitmap->bs);
a88b179f 838 bitmap->persistent = persistent;
1e638301 839 bdrv_dirty_bitmaps_unlock(bitmap->bs);
a88b179f
VSO
840}
841
b0f45559
JS
842/* Called with BQL taken. */
843void bdrv_dirty_bitmap_set_inconsistent(BdrvDirtyBitmap *bitmap)
844{
1e638301 845 bdrv_dirty_bitmaps_lock(bitmap->bs);
b0f45559
JS
846 assert(bitmap->persistent == true);
847 bitmap->inconsistent = true;
848 bitmap->disabled = true;
1e638301 849 bdrv_dirty_bitmaps_unlock(bitmap->bs);
b0f45559
JS
850}
851
9c98f145 852/* Called with BQL taken. */
c4e4b0fa 853void bdrv_dirty_bitmap_skip_store(BdrvDirtyBitmap *bitmap, bool skip)
9c98f145 854{
1e638301 855 bdrv_dirty_bitmaps_lock(bitmap->bs);
c4e4b0fa 856 bitmap->skip_store = skip;
1e638301 857 bdrv_dirty_bitmaps_unlock(bitmap->bs);
9c98f145
VSO
858}
859
796a3798 860bool bdrv_dirty_bitmap_get_persistence(BdrvDirtyBitmap *bitmap)
a88b179f 861{
c4e4b0fa 862 return bitmap->persistent && !bitmap->skip_store;
a88b179f
VSO
863}
864
b0f45559
JS
865bool bdrv_dirty_bitmap_inconsistent(const BdrvDirtyBitmap *bitmap)
866{
867 return bitmap->inconsistent;
868}
869
ef9041a7 870BdrvDirtyBitmap *bdrv_dirty_bitmap_first(BlockDriverState *bs)
3dd10a06 871{
ef9041a7
VSO
872 return QLIST_FIRST(&bs->dirty_bitmaps);
873}
874
875BdrvDirtyBitmap *bdrv_dirty_bitmap_next(BdrvDirtyBitmap *bitmap)
876{
877 return QLIST_NEXT(bitmap, list);
3dd10a06 878}
a3b52535
VSO
879
880char *bdrv_dirty_bitmap_sha256(const BdrvDirtyBitmap *bitmap, Error **errp)
881{
882 return hbitmap_sha256(bitmap->bitmap, errp);
883}
56207df5 884
9399c54b
VSO
885int64_t bdrv_dirty_bitmap_next_dirty(BdrvDirtyBitmap *bitmap, int64_t offset,
886 int64_t bytes)
887{
888 return hbitmap_next_dirty(bitmap->bitmap, offset, bytes);
889}
890
642700fd
VSO
891int64_t bdrv_dirty_bitmap_next_zero(BdrvDirtyBitmap *bitmap, int64_t offset,
892 int64_t bytes)
56207df5 893{
76d570dc 894 return hbitmap_next_zero(bitmap->bitmap, offset, bytes);
56207df5 895}
b598e531 896
a78a1a48 897bool bdrv_dirty_bitmap_next_dirty_area(BdrvDirtyBitmap *bitmap,
299ea9ff
VSO
898 int64_t start, int64_t end, int64_t max_dirty_count,
899 int64_t *dirty_start, int64_t *dirty_count)
a78a1a48 900{
299ea9ff
VSO
901 return hbitmap_next_dirty_area(bitmap->bitmap, start, end, max_dirty_count,
902 dirty_start, dirty_count);
a78a1a48
VSO
903}
904
b7661ca5
JS
905/**
906 * bdrv_merge_dirty_bitmap: merge src into dest.
907 * Ensures permissions on bitmaps are reasonable; use for public API.
908 *
909 * @backup: If provided, make a copy of dest here prior to merge.
910 */
b598e531 911void bdrv_merge_dirty_bitmap(BdrvDirtyBitmap *dest, const BdrvDirtyBitmap *src,
fa000f2f 912 HBitmap **backup, Error **errp)
b598e531 913{
fa000f2f
VSO
914 bool ret;
915
1e638301
VSO
916 bdrv_dirty_bitmaps_lock(dest->bs);
917 if (src->bs != dest->bs) {
918 bdrv_dirty_bitmaps_lock(src->bs);
eff0829b 919 }
b598e531 920
3ae96d66 921 if (bdrv_dirty_bitmap_check(dest, BDRV_BITMAP_DEFAULT, errp)) {
06bf5006
VSO
922 goto out;
923 }
924
cb8e58e3
JS
925 if (bdrv_dirty_bitmap_check(src, BDRV_BITMAP_ALLOW_RO, errp)) {
926 goto out;
927 }
b598e531 928
fa000f2f 929 if (!hbitmap_can_merge(dest->bitmap, src->bitmap)) {
b598e531 930 error_setg(errp, "Bitmaps are incompatible and can't be merged");
06bf5006 931 goto out;
b598e531
VSO
932 }
933
b7661ca5
JS
934 ret = bdrv_dirty_bitmap_merge_internal(dest, src, backup, false);
935 assert(ret);
936
937out:
1e638301
VSO
938 bdrv_dirty_bitmaps_unlock(dest->bs);
939 if (src->bs != dest->bs) {
940 bdrv_dirty_bitmaps_unlock(src->bs);
b7661ca5
JS
941 }
942}
943
944/**
945 * bdrv_dirty_bitmap_merge_internal: merge src into dest.
946 * Does NOT check bitmap permissions; not suitable for use as public API.
947 *
948 * @backup: If provided, make a copy of dest here prior to merge.
949 * @lock: If true, lock and unlock bitmaps on the way in/out.
950 * returns true if the merge succeeded; false if unattempted.
951 */
952bool bdrv_dirty_bitmap_merge_internal(BdrvDirtyBitmap *dest,
953 const BdrvDirtyBitmap *src,
954 HBitmap **backup,
955 bool lock)
956{
957 bool ret;
958
959 assert(!bdrv_dirty_bitmap_readonly(dest));
960 assert(!bdrv_dirty_bitmap_inconsistent(dest));
961 assert(!bdrv_dirty_bitmap_inconsistent(src));
962
963 if (lock) {
1e638301
VSO
964 bdrv_dirty_bitmaps_lock(dest->bs);
965 if (src->bs != dest->bs) {
966 bdrv_dirty_bitmaps_lock(src->bs);
b7661ca5
JS
967 }
968 }
969
fa000f2f
VSO
970 if (backup) {
971 *backup = dest->bitmap;
972 dest->bitmap = hbitmap_alloc(dest->size, hbitmap_granularity(*backup));
973 ret = hbitmap_merge(*backup, src->bitmap, dest->bitmap);
974 } else {
975 ret = hbitmap_merge(dest->bitmap, src->bitmap, dest->bitmap);
976 }
fa000f2f 977
b7661ca5 978 if (lock) {
1e638301
VSO
979 bdrv_dirty_bitmaps_unlock(dest->bs);
980 if (src->bs != dest->bs) {
981 bdrv_dirty_bitmaps_unlock(src->bs);
b7661ca5 982 }
eff0829b 983 }
b7661ca5
JS
984
985 return ret;
b598e531 986}