提交 aaa0eb75 编写于 作者: L Liran Schour 提交者: Anthony Liguori

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: NLiran Schour <lirans@il.ibm.com>
Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
上级 d76cac7d
......@@ -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;
}
......@@ -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
......@@ -175,6 +175,7 @@ struct BlockDriverState {
int type;
char device_name[32];
unsigned long *dirty_bitmap;
int64_t dirty_count;
BlockDriverState *next;
void *private;
};
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册