mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-24 03:59:52 +00:00
block: keep bs->total_sectors up to date even for growable block devices
If a BlockDriverState is growable, after every write we need to check if bs->total_sectors might have changed. With this change, bdrv_getlength does not need anymore a system call. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
e641c1e81e
commit
df2a6f29a5
5
block.c
5
block.c
@ -2739,6 +2739,9 @@ static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs,
|
|||||||
if (bs->wr_highest_sector < sector_num + nb_sectors - 1) {
|
if (bs->wr_highest_sector < sector_num + nb_sectors - 1) {
|
||||||
bs->wr_highest_sector = sector_num + nb_sectors - 1;
|
bs->wr_highest_sector = sector_num + nb_sectors - 1;
|
||||||
}
|
}
|
||||||
|
if (bs->growable && ret >= 0) {
|
||||||
|
bs->total_sectors = MAX(bs->total_sectors, sector_num + nb_sectors);
|
||||||
|
}
|
||||||
|
|
||||||
tracked_request_end(&req);
|
tracked_request_end(&req);
|
||||||
|
|
||||||
@ -2813,7 +2816,7 @@ int64_t bdrv_getlength(BlockDriverState *bs)
|
|||||||
if (!drv)
|
if (!drv)
|
||||||
return -ENOMEDIUM;
|
return -ENOMEDIUM;
|
||||||
|
|
||||||
if (bs->growable || bdrv_dev_has_removable_media(bs)) {
|
if (bdrv_dev_has_removable_media(bs)) {
|
||||||
if (drv->bdrv_getlength) {
|
if (drv->bdrv_getlength) {
|
||||||
return drv->bdrv_getlength(bs);
|
return drv->bdrv_getlength(bs);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user