On Fri 18 Sep 2015 05:22:42 PM CEST, Max Reitz wrote:
> If bdrv_is_inserted() is called on the top level BDS, it should make
> sure all nodes in the BDS tree are actually inserted.
>
> Signed-off-by: Max Reitz <[email protected]>
> ---
> block.c | 12 +++++++++---
> 1 file changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/block.c b/block.c
> index 4a089e6..c4fa299 100644
> --- a/block.c
> +++ b/block.c
> @@ -3247,14 +3247,20 @@ void bdrv_invalidate_cache_all(Error **errp)
> bool bdrv_is_inserted(BlockDriverState *bs)
> {
> BlockDriver *drv = bs->drv;
> + BdrvChild *child;
>
> if (!drv) {
> return false;
> }
> - if (!drv->bdrv_is_inserted) {
> - return true;
> + if (drv->bdrv_is_inserted) {
> + return drv->bdrv_is_inserted(bs);
> }
If there's drv->bdrv_is_inserted then this code stops here and does not
iterate the children, is this correct?
> - return drv->bdrv_is_inserted(bs);
> + QLIST_FOREACH(child, &bs->children, next) {
> + if (!bdrv_is_inserted(child->bs)) {
> + return false;
> + }
> + }
> + return true;
> }
Berto