Lines Matching full:bitmap
30 #include "block/dirty-bitmap.h"
40 /* Bitmap directory entry constraints */
47 /* Size of bitmap table entries */
53 #error In the code bitmap table physical size assumed to fit into int
56 /* Bitmap directory entry flags */
192 error_setg(errp, "Too much space will be occupied by the bitmap. " in check_constraints_on_bitmap()
287 * @bitmap must be cleared */
290 uint32_t bitmap_table_size, BdrvDirtyBitmap *bitmap) in load_bitmap_data() argument
295 uint64_t bm_size = bdrv_dirty_bitmap_size(bitmap); in load_bitmap_data()
299 bdrv_dirty_bitmap_serialization_size(bitmap, 0, bm_size)); in load_bitmap_data()
306 limit = bdrv_dirty_bitmap_serialization_coverage(s->cluster_size, bitmap); in load_bitmap_data()
316 bdrv_dirty_bitmap_deserialize_ones(bitmap, offset, count, in load_bitmap_data()
319 /* No need to deserialize zeros because the dirty bitmap is in load_bitmap_data()
327 bdrv_dirty_bitmap_deserialize_part(bitmap, buf, offset, count, in load_bitmap_data()
333 bdrv_dirty_bitmap_deserialize_finish(bitmap); in load_bitmap_data()
348 BdrvDirtyBitmap *bitmap = NULL; in load_bitmap() local
351 bitmap = bdrv_create_dirty_bitmap(bs, granularity, bm->name, errp); in load_bitmap()
352 if (bitmap == NULL) { in load_bitmap()
358 return bitmap; in load_bitmap()
365 "bitmap '%s'", bm->name); in load_bitmap()
369 ret = load_bitmap_data(bs, bitmap_table, bm->table.size, bitmap); in load_bitmap()
371 error_setg_errno(errp, -ret, "Could not read bitmap '%s' from image", in load_bitmap()
377 return bitmap; in load_bitmap()
381 if (bitmap != NULL) { in load_bitmap()
382 bdrv_release_dirty_bitmap(bitmap); in load_bitmap()
389 * Bitmap List
393 * Bitmap List private functions
394 * Only Bitmap List knows about bitmap directory structure in Qcow2.
477 * We've loaded a valid bitmap (IN_USE not set) or we are going to in check_dir_entry()
478 * store a valid bitmap, but the allocated bitmap table size is not in check_dir_entry()
479 * enough to store this bitmap. in check_dir_entry()
481 * Note, that it's OK to have an invalid bitmap with invalid size due in check_dir_entry()
482 * to a bitmap that was not correctly saved after image resize. in check_dir_entry()
502 * Bitmap List public functions
552 * Get bitmap list from qcow2 image. Actually reads bitmap directory,
553 * checks it and convert to bitmap list.
567 error_setg(errp, "Requested bitmap directory size is zero"); in bitmap_list_load()
572 error_setg(errp, "Requested bitmap directory size is too big"); in bitmap_list_load()
578 error_setg(errp, "Failed to allocate space for bitmap directory"); in bitmap_list_load()
585 error_setg_errno(errp, -ret, "Failed to read bitmap directory"); in bitmap_list_load()
612 error_setg(errp, "Bitmap extra data is not supported"); in bitmap_list_load()
618 error_setg(errp, "Bitmap '%.*s' doesn't satisfy the constraints", in bitmap_list_load()
646 error_setg(errp, "Broken bitmap directory"); in bitmap_list_load()
733 * Store bitmap list to qcow2 image as a bitmap directory.
799 * bitmap directory in-place (actually, turn-off the extension), which is in bitmap_list_store()
833 * Bitmap List end
860 /* autoclear bit is not set, so we can safely update bitmap directory */ in update_ext_header_and_dir_in_place()
949 static void release_dirty_bitmap_helper(gpointer bitmap, in release_dirty_bitmap_helper() argument
952 bdrv_release_dirty_bitmap(bitmap); in release_dirty_bitmap_helper()
956 static void set_readonly_helper(gpointer bitmap, gpointer value) in set_readonly_helper() argument
958 bdrv_dirty_bitmap_set_readonly(bitmap, (bool)value); in set_readonly_helper()
992 BdrvDirtyBitmap *bitmap; in qcow2_load_dirty_bitmaps() local
998 * We already have corresponding BdrvDirtyBitmap, and bitmap in the in qcow2_load_dirty_bitmaps()
1002 * with dirty-bitmaps capability enabled: if the bitmap was loaded in qcow2_load_dirty_bitmaps()
1004 * of-course contain IN_USE outdated version of the bitmap, and we in qcow2_load_dirty_bitmaps()
1006 * bitmap, being migrated. in qcow2_load_dirty_bitmaps()
1011 bitmap = load_bitmap(bs, bm, errp); in qcow2_load_dirty_bitmaps()
1012 if (bitmap == NULL) { in qcow2_load_dirty_bitmaps()
1016 bdrv_dirty_bitmap_set_persistence(bitmap, true); in qcow2_load_dirty_bitmaps()
1018 bdrv_dirty_bitmap_set_inconsistent(bitmap); in qcow2_load_dirty_bitmaps()
1025 bdrv_disable_dirty_bitmap(bitmap); in qcow2_load_dirty_bitmaps()
1028 g_slist_append(created_dirty_bitmaps, bitmap); in qcow2_load_dirty_bitmaps()
1035 error_setg_errno(errp, -ret, "Can't update bitmap directory"); in qcow2_load_dirty_bitmaps()
1069 int bme; /* Bitmap directory entry flags */ in get_bitmap_info_flags()
1092 * Returns a list of QCOW2 bitmap details.
1153 BdrvDirtyBitmap *bitmap = bdrv_find_dirty_bitmap(bs, bm->name); in qcow2_reopen_bitmaps_rw() local
1155 if (!bitmap) { in qcow2_reopen_bitmaps_rw()
1156 error_setg(errp, "Unexpected bitmap '%s' in image '%s'", in qcow2_reopen_bitmaps_rw()
1162 if (!bdrv_dirty_bitmap_readonly(bitmap)) { in qcow2_reopen_bitmaps_rw()
1163 error_setg(errp, "Corruption: bitmap '%s' is not marked IN_USE " in qcow2_reopen_bitmaps_rw()
1168 if (bdrv_dirty_bitmap_inconsistent(bitmap)) { in qcow2_reopen_bitmaps_rw()
1169 error_setg(errp, "Corruption: bitmap '%s' is inconsistent but " in qcow2_reopen_bitmaps_rw()
1183 * 2.1 if @bitmap is inconsistent, it's OK. It means that it was in qcow2_reopen_bitmaps_rw()
1185 * 2.2 if @bitmap is not inconsistent. This seems to be impossible in qcow2_reopen_bitmaps_rw()
1189 if (bdrv_dirty_bitmap_readonly(bitmap) && in qcow2_reopen_bitmaps_rw()
1190 !bdrv_dirty_bitmap_inconsistent(bitmap)) in qcow2_reopen_bitmaps_rw()
1192 error_setg(errp, "Corruption: bitmap '%s' is marked IN_USE " in qcow2_reopen_bitmaps_rw()
1200 if (bdrv_dirty_bitmap_readonly(bitmap)) { in qcow2_reopen_bitmaps_rw()
1201 ro_dirty_bitmaps = g_slist_append(ro_dirty_bitmaps, bitmap); in qcow2_reopen_bitmaps_rw()
1215 error_setg_errno(errp, -ret, "Cannot update bitmap directory"); in qcow2_reopen_bitmaps_rw()
1249 BdrvDirtyBitmap *bitmap = bdrv_find_dirty_bitmap(bs, bm->name); in qcow2_truncate_bitmaps_check() local
1250 if (bitmap == NULL) { in qcow2_truncate_bitmaps_check()
1265 if (bdrv_dirty_bitmap_check(bitmap, BDRV_BITMAP_DEFAULT, errp)) { in qcow2_truncate_bitmaps_check()
1277 * Store bitmap to image, filling bitmap table accordingly.
1280 store_bitmap_data(BlockDriverState *bs, BdrvDirtyBitmap *bitmap, in store_bitmap_data() argument
1287 uint64_t bm_size = bdrv_dirty_bitmap_size(bitmap); in store_bitmap_data()
1288 const char *bm_name = bdrv_dirty_bitmap_name(bitmap); in store_bitmap_data()
1293 bdrv_dirty_bitmap_serialization_size(bitmap, 0, bm_size)); in store_bitmap_data()
1298 error_setg(errp, "Bitmap '%s' is too big", bm_name); in store_bitmap_data()
1309 limit = bdrv_dirty_bitmap_serialization_coverage(s->cluster_size, bitmap); in store_bitmap_data()
1313 while ((offset = bdrv_dirty_bitmap_next_dirty(bitmap, offset, INT64_MAX)) in store_bitmap_data()
1322 * entire cluster of the bitmap that includes that offset, in store_bitmap_data()
1327 write_size = bdrv_dirty_bitmap_serialization_size(bitmap, offset, in store_bitmap_data()
1334 "Failed to allocate clusters for bitmap '%s'", in store_bitmap_data()
1340 bdrv_dirty_bitmap_serialize_part(bitmap, buf, offset, end - offset); in store_bitmap_data()
1353 error_setg_errno(errp, -ret, "Failed to write bitmap '%s' to file", in store_bitmap_data()
1385 BdrvDirtyBitmap *bitmap = bm->dirty_bitmap; in store_bitmap() local
1388 assert(bitmap != NULL); in store_bitmap()
1390 bm_name = bdrv_dirty_bitmap_name(bitmap); in store_bitmap()
1392 tb = store_bitmap_data(bs, bitmap, &tb_size, errp); in store_bitmap()
1401 "Failed to allocate clusters for bitmap '%s'", in store_bitmap()
1418 error_setg_errno(errp, -ret, "Failed to write bitmap '%s' to file", in store_bitmap()
1468 * Absence of the bitmap is not an error: see explanation above in qcow2_co_remove_persistent_dirty_bitmap()
1485 /* Absence of the bitmap is not an error, see above. */ in qcow2_co_remove_persistent_dirty_bitmap()
1494 error_setg_errno(errp, -ret, "Failed to update bitmap extension"); in qcow2_co_remove_persistent_dirty_bitmap()
1537 BdrvDirtyBitmap *bitmap; in qcow2_store_persistent_dirty_bitmaps() local
1561 FOR_EACH_DIRTY_BITMAP(bs, bitmap) { in qcow2_store_persistent_dirty_bitmaps()
1562 const char *name = bdrv_dirty_bitmap_name(bitmap); in qcow2_store_persistent_dirty_bitmaps()
1563 uint32_t granularity = bdrv_dirty_bitmap_granularity(bitmap); in qcow2_store_persistent_dirty_bitmaps()
1565 if (!bdrv_dirty_bitmap_get_persistence(bitmap) || in qcow2_store_persistent_dirty_bitmaps()
1566 bdrv_dirty_bitmap_inconsistent(bitmap)) { in qcow2_store_persistent_dirty_bitmaps()
1570 if (bdrv_dirty_bitmap_readonly(bitmap)) { in qcow2_store_persistent_dirty_bitmaps()
1572 * Store the bitmap in the associated Qcow2Bitmap so it in qcow2_store_persistent_dirty_bitmaps()
1577 bm->dirty_bitmap = bitmap; in qcow2_store_persistent_dirty_bitmaps()
1585 error_prepend(errp, "Bitmap '%s' doesn't satisfy the constraints: ", in qcow2_store_persistent_dirty_bitmaps()
1599 error_setg(errp, "Bitmap directory is too large"); in qcow2_store_persistent_dirty_bitmaps()
1608 error_setg(errp, "Bitmap '%s' already exists in the image", in qcow2_store_persistent_dirty_bitmaps()
1617 bm->flags = bdrv_dirty_bitmap_enabled(bitmap) ? BME_FLAG_AUTO : 0; in qcow2_store_persistent_dirty_bitmaps()
1618 bm->granularity_bits = ctz32(bdrv_dirty_bitmap_granularity(bitmap)); in qcow2_store_persistent_dirty_bitmaps()
1619 bm->dirty_bitmap = bitmap; in qcow2_store_persistent_dirty_bitmaps()
1633 bitmap = bm->dirty_bitmap; in qcow2_store_persistent_dirty_bitmaps()
1635 if (bitmap == NULL || bdrv_dirty_bitmap_readonly(bitmap)) { in qcow2_store_persistent_dirty_bitmaps()
1647 error_setg_errno(errp, -ret, "Failed to update bitmap extension"); in qcow2_store_persistent_dirty_bitmaps()
1651 /* Bitmap directory was successfully updated, so, old data can be dropped. in qcow2_store_persistent_dirty_bitmaps()
1693 BdrvDirtyBitmap *bitmap; in qcow2_reopen_bitmaps_ro() local
1699 FOR_EACH_DIRTY_BITMAP(bs, bitmap) { in qcow2_reopen_bitmaps_ro()
1700 if (bdrv_dirty_bitmap_get_persistence(bitmap)) { in qcow2_reopen_bitmaps_ro()
1701 bdrv_dirty_bitmap_set_readonly(bitmap, true); in qcow2_reopen_bitmaps_ro()
1715 BdrvDirtyBitmap *bitmap; in qcow2_co_can_store_new_dirty_bitmap() local
1720 error_setg(errp, "Bitmap already exists: %s", name); in qcow2_co_can_store_new_dirty_bitmap()
1726 * that a program without persistent dirty bitmap support has in qcow2_co_can_store_new_dirty_bitmap()
1738 FOR_EACH_DIRTY_BITMAP(bs, bitmap) { in qcow2_co_can_store_new_dirty_bitmap()
1739 if (bdrv_dirty_bitmap_get_persistence(bitmap)) { in qcow2_co_can_store_new_dirty_bitmap()
1742 calc_dir_entry_size(strlen(bdrv_dirty_bitmap_name(bitmap)), 0); in qcow2_co_can_store_new_dirty_bitmap()
1755 error_setg(errp, "Not enough space in the bitmap directory"); in qcow2_co_can_store_new_dirty_bitmap()
1762 error_prepend(errp, "Can't make bitmap '%s' persistent in '%s': ", in qcow2_co_can_store_new_dirty_bitmap()
1797 /* Assume the entire bitmap is allocated */ in qcow2_get_persistent_dirty_bitmap_size()
1799 /* Also reserve space for the bitmap table entries */ in qcow2_get_persistent_dirty_bitmap_size()
1802 /* And space for contribution to bitmap directory size */ in qcow2_get_persistent_dirty_bitmap_size()