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