@ -712,11 +712,12 @@ int coroutine_fn bdrv_co_delete_file(BlockDriverState *bs, Error **errp)
int bdrv_probe_blocksizes ( BlockDriverState * bs , BlockSizes * bsz )
{
BlockDriver * drv = bs - > drv ;
BlockDriverState * filtered = bdrv_filter_bs ( bs ) ;
if ( drv & & drv - > bdrv_probe_blocksizes ) {
return drv - > bdrv_probe_blocksizes ( bs , bsz ) ;
} else if ( drv & & drv - > is_ filter & & bs - > fil e ) {
return bdrv_probe_blocksizes ( bs - > file - > bs , bsz ) ;
} else if ( filtered ) {
return bdrv_probe_blocksizes ( filtered , bsz ) ;
}
return - ENOTSUP ;
@ -731,11 +732,12 @@ int bdrv_probe_blocksizes(BlockDriverState *bs, BlockSizes *bsz)
int bdrv_probe_geometry ( BlockDriverState * bs , HDGeometry * geo )
{
BlockDriver * drv = bs - > drv ;
BlockDriverState * filtered = bdrv_filter_bs ( bs ) ;
if ( drv & & drv - > bdrv_probe_geometry ) {
return drv - > bdrv_probe_geometry ( bs , geo ) ;
} else if ( drv & & drv - > is_ filter & & bs - > fil e ) {
return bdrv_probe_geometry ( bs - > file - > bs , geo ) ;
} else if ( filtered ) {
return bdrv_probe_geometry ( filtered , geo ) ;
}
return - ENOTSUP ;
@ -5442,6 +5444,8 @@ int bdrv_has_zero_init_1(BlockDriverState *bs)
int bdrv_has_zero_init ( BlockDriverState * bs )
{
BlockDriverState * filtered ;
if ( ! bs - > drv ) {
return 0 ;
}
@ -5454,8 +5458,10 @@ int bdrv_has_zero_init(BlockDriverState *bs)
if ( bs - > drv - > bdrv_has_zero_init ) {
return bs - > drv - > bdrv_has_zero_init ( bs ) ;
}
if ( bs - > file & & bs - > drv - > is_filter ) {
return bdrv_has_zero_init ( bs - > file - > bs ) ;
filtered = bdrv_filter_bs ( bs ) ;
if ( filtered ) {
return bdrv_has_zero_init ( filtered ) ;
}
/* safe default */
@ -5485,8 +5491,9 @@ int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
return - ENOMEDIUM ;
}
if ( ! drv - > bdrv_get_info ) {
if ( bs - > file & & drv - > is_filter ) {
return bdrv_get_info ( bs - > file - > bs , bdi ) ;
BlockDriverState * filtered = bdrv_filter_bs ( bs ) ;
if ( filtered ) {
return bdrv_get_info ( filtered , bdi ) ;
}
return - ENOTSUP ;
}
@ -6571,6 +6578,8 @@ int bdrv_amend_options(BlockDriverState *bs, QemuOpts *opts,
bool bdrv_recurse_can_replace ( BlockDriverState * bs ,
BlockDriverState * to_replace )
{
BlockDriverState * filtered ;
if ( ! bs | | ! bs - > drv ) {
return false ;
}
@ -6585,9 +6594,9 @@ bool bdrv_recurse_can_replace(BlockDriverState *bs,
}
/* For filters without an own implementation, we can recurse on our own */
if ( bs - > drv - > is_filter ) {
BdrvChild * child = bs - > file ? : bs - > backing ;
return bdrv_recurse_can_replace ( child - > bs , to_replace ) ;
filtered = bdrv_filter_bs ( bs ) ;
if ( filtered ) {
return bdrv_recurse_can_replace ( filtered , to_replace ) ;
}
/* Safe default */