block: fix shift in dirty bitmap calculation
Otherwise upper 32 bits of bitmap entries are not correctly calculated. Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
c276b17da6
commit
6d59fec11e
12
block.c
12
block.c
@ -930,14 +930,14 @@ static void set_dirty_bitmap(BlockDriverState *bs, int64_t sector_num,
|
|||||||
bit = start % (sizeof(unsigned long) * 8);
|
bit = start % (sizeof(unsigned long) * 8);
|
||||||
val = bs->dirty_bitmap[idx];
|
val = bs->dirty_bitmap[idx];
|
||||||
if (dirty) {
|
if (dirty) {
|
||||||
if (!(val & (1 << bit))) {
|
if (!(val & (1UL << bit))) {
|
||||||
bs->dirty_count++;
|
bs->dirty_count++;
|
||||||
val |= 1 << bit;
|
val |= 1UL << bit;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (val & (1 << bit)) {
|
if (val & (1UL << bit)) {
|
||||||
bs->dirty_count--;
|
bs->dirty_count--;
|
||||||
val &= ~(1 << bit);
|
val &= ~(1UL << bit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bs->dirty_bitmap[idx] = val;
|
bs->dirty_bitmap[idx] = val;
|
||||||
@ -2685,8 +2685,8 @@ int bdrv_get_dirty(BlockDriverState *bs, int64_t sector)
|
|||||||
|
|
||||||
if (bs->dirty_bitmap &&
|
if (bs->dirty_bitmap &&
|
||||||
(sector << BDRV_SECTOR_BITS) < bdrv_getlength(bs)) {
|
(sector << BDRV_SECTOR_BITS) < bdrv_getlength(bs)) {
|
||||||
return bs->dirty_bitmap[chunk / (sizeof(unsigned long) * 8)] &
|
return !!(bs->dirty_bitmap[chunk / (sizeof(unsigned long) * 8)] &
|
||||||
(1 << (chunk % (sizeof(unsigned long) * 8)));
|
(1UL << (chunk % (sizeof(unsigned long) * 8))));
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user