mirror of https://github.com/xemu-project/xemu.git
dirty-bitmap: Switch bdrv_set_dirty() to bytes
Both callers already had bytes available, but were scaling to sectors. Move the scaling to internal code. In the case of bdrv_aligned_pwritev(), we are now passing the exact offset rather than a rounded sector-aligned value, but that's okay as long as dirty bitmap widens start/bytes to granularity boundaries. Signed-off-by: Eric Blake <eblake@redhat.com> Reviewed-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
49d741b504
commit
0fdf1a4f68
|
@ -628,10 +628,10 @@ void bdrv_dirty_bitmap_deserialize_finish(BdrvDirtyBitmap *bitmap)
|
||||||
hbitmap_deserialize_finish(bitmap->bitmap);
|
hbitmap_deserialize_finish(bitmap->bitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
void bdrv_set_dirty(BlockDriverState *bs, int64_t cur_sector,
|
void bdrv_set_dirty(BlockDriverState *bs, int64_t offset, int64_t bytes)
|
||||||
int64_t nr_sectors)
|
|
||||||
{
|
{
|
||||||
BdrvDirtyBitmap *bitmap;
|
BdrvDirtyBitmap *bitmap;
|
||||||
|
int64_t end_sector = DIV_ROUND_UP(offset + bytes, BDRV_SECTOR_SIZE);
|
||||||
|
|
||||||
if (QLIST_EMPTY(&bs->dirty_bitmaps)) {
|
if (QLIST_EMPTY(&bs->dirty_bitmaps)) {
|
||||||
return;
|
return;
|
||||||
|
@ -643,7 +643,8 @@ void bdrv_set_dirty(BlockDriverState *bs, int64_t cur_sector,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
assert(!bdrv_dirty_bitmap_readonly(bitmap));
|
assert(!bdrv_dirty_bitmap_readonly(bitmap));
|
||||||
hbitmap_set(bitmap->bitmap, cur_sector, nr_sectors);
|
hbitmap_set(bitmap->bitmap, offset >> BDRV_SECTOR_BITS,
|
||||||
|
end_sector - (offset >> BDRV_SECTOR_BITS));
|
||||||
}
|
}
|
||||||
bdrv_dirty_bitmaps_unlock(bs);
|
bdrv_dirty_bitmaps_unlock(bs);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1334,7 +1334,6 @@ static int coroutine_fn bdrv_aligned_pwritev(BdrvChild *child,
|
||||||
bool waited;
|
bool waited;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
int64_t start_sector = offset >> BDRV_SECTOR_BITS;
|
|
||||||
int64_t end_sector = DIV_ROUND_UP(offset + bytes, BDRV_SECTOR_SIZE);
|
int64_t end_sector = DIV_ROUND_UP(offset + bytes, BDRV_SECTOR_SIZE);
|
||||||
uint64_t bytes_remaining = bytes;
|
uint64_t bytes_remaining = bytes;
|
||||||
int max_transfer;
|
int max_transfer;
|
||||||
|
@ -1409,7 +1408,7 @@ static int coroutine_fn bdrv_aligned_pwritev(BdrvChild *child,
|
||||||
bdrv_debug_event(bs, BLKDBG_PWRITEV_DONE);
|
bdrv_debug_event(bs, BLKDBG_PWRITEV_DONE);
|
||||||
|
|
||||||
atomic_inc(&bs->write_gen);
|
atomic_inc(&bs->write_gen);
|
||||||
bdrv_set_dirty(bs, start_sector, end_sector - start_sector);
|
bdrv_set_dirty(bs, offset, bytes);
|
||||||
|
|
||||||
stat64_max(&bs->wr_highest_offset, offset + bytes);
|
stat64_max(&bs->wr_highest_offset, offset + bytes);
|
||||||
|
|
||||||
|
@ -2438,8 +2437,7 @@ int coroutine_fn bdrv_co_pdiscard(BlockDriverState *bs, int64_t offset,
|
||||||
ret = 0;
|
ret = 0;
|
||||||
out:
|
out:
|
||||||
atomic_inc(&bs->write_gen);
|
atomic_inc(&bs->write_gen);
|
||||||
bdrv_set_dirty(bs, req.offset >> BDRV_SECTOR_BITS,
|
bdrv_set_dirty(bs, req.offset, req.bytes);
|
||||||
req.bytes >> BDRV_SECTOR_BITS);
|
|
||||||
tracked_request_end(&req);
|
tracked_request_end(&req);
|
||||||
bdrv_dec_in_flight(bs);
|
bdrv_dec_in_flight(bs);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -1028,7 +1028,7 @@ void blk_dev_eject_request(BlockBackend *blk, bool force);
|
||||||
bool blk_dev_is_tray_open(BlockBackend *blk);
|
bool blk_dev_is_tray_open(BlockBackend *blk);
|
||||||
bool blk_dev_is_medium_locked(BlockBackend *blk);
|
bool blk_dev_is_medium_locked(BlockBackend *blk);
|
||||||
|
|
||||||
void bdrv_set_dirty(BlockDriverState *bs, int64_t cur_sector, int64_t nr_sect);
|
void bdrv_set_dirty(BlockDriverState *bs, int64_t offset, int64_t bytes);
|
||||||
bool bdrv_requests_pending(BlockDriverState *bs);
|
bool bdrv_requests_pending(BlockDriverState *bs);
|
||||||
|
|
||||||
void bdrv_clear_dirty_bitmap(BdrvDirtyBitmap *bitmap, HBitmap **out);
|
void bdrv_clear_dirty_bitmap(BdrvDirtyBitmap *bitmap, HBitmap **out);
|
||||||
|
|
Loading…
Reference in New Issue