From: Liran Schour Date: Tue, 26 Jan 2010 08:31:48 +0000 (+0200) Subject: Count dirty blocks and expose an API to get dirty count X-Git-Tag: v0.13.0-rc0~1433 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=aaa0eb75e2e56d483c89731a447c999985713b43;p=thirdparty%2Fqemu.git Count dirty blocks and expose an API to get dirty count This will manage dirty counter for each device and will allow to get the dirty counter from above. Signed-off-by: Liran Schour Signed-off-by: Anthony Liguori --- diff --git a/block.c b/block.c index 1919d197328..e9fd8808bbb 100644 --- a/block.c +++ b/block.c @@ -686,9 +686,15 @@ static void set_dirty_bitmap(BlockDriverState *bs, int64_t sector_num, bit = start % (sizeof(unsigned long) * 8); val = bs->dirty_bitmap[idx]; if (dirty) { - val |= 1 << bit; + if (!(val & (1 << bit))) { + bs->dirty_count++; + val |= 1 << bit; + } } else { - val &= ~(1 << bit); + if (val & (1 << bit)) { + bs->dirty_count--; + val &= ~(1 << bit); + } } bs->dirty_bitmap[idx] = val; } @@ -2139,6 +2145,7 @@ void bdrv_set_dirty_tracking(BlockDriverState *bs, int enable) { int64_t bitmap_size; + bs->dirty_count = 0; if (enable) { if (!bs->dirty_bitmap) { bitmap_size = (bdrv_getlength(bs) >> BDRV_SECTOR_BITS) + @@ -2173,3 +2180,8 @@ void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector, { set_dirty_bitmap(bs, cur_sector, nr_sectors, 0); } + +int64_t bdrv_get_dirty_count(BlockDriverState *bs) +{ + return bs->dirty_count; +} diff --git a/block.h b/block.h index ecf66c52ab4..536265e86c2 100644 --- a/block.h +++ b/block.h @@ -200,4 +200,5 @@ void bdrv_set_dirty_tracking(BlockDriverState *bs, int enable); int bdrv_get_dirty(BlockDriverState *bs, int64_t sector); void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector, int nr_sectors); +int64_t bdrv_get_dirty_count(BlockDriverState *bs); #endif diff --git a/block_int.h b/block_int.h index a0ebd90a0be..223a437b6ae 100644 --- a/block_int.h +++ b/block_int.h @@ -175,6 +175,7 @@ struct BlockDriverState { int type; char device_name[32]; unsigned long *dirty_bitmap; + int64_t dirty_count; BlockDriverState *next; void *private; };