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:
Paolo Bonzini 2013-09-04 19:00:21 +02:00 committed by Stefan Hajnoczi
parent e641c1e81e
commit df2a6f29a5

View File

@ -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);
} }