@ -2941,6 +2941,20 @@ static bool bdrv_inherits_from_recursive(BlockDriverState *child,
return child ! = NULL ;
}
/*
* Return the BdrvChildRole for @ bs ' s backing child . bs - > backing is
* mostly used for COW backing children ( role = COW ) , but also for
* filtered children ( role = FILTERED | PRIMARY ) .
*/
static BdrvChildRole bdrv_backing_role ( BlockDriverState * bs )
{
if ( bs - > drv & & bs - > drv - > is_filter ) {
return BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY ;
} else {
return BDRV_CHILD_COW ;
}
}
/*
* Sets the backing file link of a BDS . A new reference is created ; callers
* which don ' t need their own reference any more must call bdrv_unref ( ) .
@ -2968,8 +2982,8 @@ void bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd,
goto out ;
}
bs - > backing = bdrv_attach_child ( bs , backing_hd , " backing " , & child_backing ,
0 , errp ) ;
bs - > backing = bdrv_attach_child ( bs , backing_hd , " backing " , & child_of_bds ,
bdrv_backing_role ( bs ) , errp ) ;
/* If backing_hd was already part of bs's backing chain, and
* inherits_from pointed recursively to bs then let ' s update it to
* point directly to bs ( else it will become NULL ) . */
@ -3066,7 +3080,7 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
}
backing_hd = bdrv_open_inherit ( backing_filename , reference , options , 0 , bs ,
& child_backing , 0 , errp ) ;
& child_of_bds , bdrv_backing_role ( bs ) , errp ) ;
if ( ! backing_hd ) {
bs - > open_flags | = BDRV_O_NO_BACKING ;
error_prepend ( errp , " Could not open backing file: " ) ;
@ -3895,8 +3909,8 @@ int bdrv_reopen_multiple(BlockReopenQueue *bs_queue, Error **errp)
if ( state - > replace_backing_bs & & state - > new_backing_bs ) {
uint64_t nperm , nshared ;
bdrv_child_perm ( state - > bs , state - > new_backing_bs ,
NULL , & child_backing , 0 , bs_queue ,
state - > perm , state - > shared_perm ,
NULL , & child_of_bds , bdrv_backing_role ( state - > bs ) ,
bs_queue , state - > perm , state - > shared_perm ,
& nperm , & nshared ) ;
ret = bdrv_check_update_perm ( state - > new_backing_bs , NULL ,
nperm , nshared , NULL , NULL , errp ) ;
@ -6852,7 +6866,7 @@ void bdrv_refresh_filename(BlockDriverState *bs)
drv - > bdrv_gather_child_options ( bs , opts , backing_overridden ) ;
} else {
QLIST_FOREACH ( child , & bs - > children , next ) {
if ( child - > klass = = & child_ backing & & ! backing_overridden ) {
if ( child = = bs - > backing & & ! backing_overridden ) {
/* We can skip the backing BDS if it has not been overridden */
continue ;
}