mirror of
https://github.com/mii443/qemu.git
synced 2025-08-22 15:15:46 +00:00
dirty-bitmap: make it possible to restore bitmap after merge
Add backup parameter to bdrv_merge_dirty_bitmap() to be used then with bdrv_restore_dirty_bitmap() if it needed to restore the bitmap after merge operation. This is needed to implement bitmap merge transaction action in further commit. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Reviewed-by: John Snow <jsnow@redhat.com>
This commit is contained in:
committed by
John Snow
parent
56bd662497
commit
fa000f2f9f
@ -723,6 +723,10 @@ void hbitmap_truncate(HBitmap *hb, uint64_t size)
|
||||
}
|
||||
}
|
||||
|
||||
bool hbitmap_can_merge(const HBitmap *a, const HBitmap *b)
|
||||
{
|
||||
return (a->size == b->size) && (a->granularity == b->granularity);
|
||||
}
|
||||
|
||||
/**
|
||||
* Given HBitmaps A and B, let A := A (BITOR) B.
|
||||
@ -731,14 +735,15 @@ void hbitmap_truncate(HBitmap *hb, uint64_t size)
|
||||
* @return true if the merge was successful,
|
||||
* false if it was not attempted.
|
||||
*/
|
||||
bool hbitmap_merge(HBitmap *a, const HBitmap *b)
|
||||
bool hbitmap_merge(const HBitmap *a, const HBitmap *b, HBitmap *result)
|
||||
{
|
||||
int i;
|
||||
uint64_t j;
|
||||
|
||||
if ((a->size != b->size) || (a->granularity != b->granularity)) {
|
||||
if (!hbitmap_can_merge(a, b) || !hbitmap_can_merge(a, result)) {
|
||||
return false;
|
||||
}
|
||||
assert(hbitmap_can_merge(b, result));
|
||||
|
||||
if (hbitmap_count(b) == 0) {
|
||||
return true;
|
||||
@ -750,7 +755,7 @@ bool hbitmap_merge(HBitmap *a, const HBitmap *b)
|
||||
*/
|
||||
for (i = HBITMAP_LEVELS - 1; i >= 0; i--) {
|
||||
for (j = 0; j < a->sizes[i]; j++) {
|
||||
a->levels[i][j] |= b->levels[i][j];
|
||||
result->levels[i][j] = a->levels[i][j] | b->levels[i][j];
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user