提交 df2a6f29 编写于 作者: P Paolo Bonzini 提交者: Stefan Hajnoczi

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: NPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: NStefan Hajnoczi <stefanha@redhat.com>
上级 e641c1e8
...@@ -2739,6 +2739,9 @@ static int coroutine_fn bdrv_co_do_writev(BlockDriverState *bs, ...@@ -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) ...@@ -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);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册