@ -1537,16 +1537,17 @@ static void bdrv_child_abort_perm_update(BdrvChild *c);
static void bdrv_child_set_perm ( BdrvChild * c , uint64_t perm , uint64_t shared ) ;
static void bdrv_child_perm ( BlockDriverState * bs , BlockDriverState * child_bs ,
BdrvChild * c ,
const BdrvChildRole * rol e,
BdrvChild * c , const BdrvChildRole * role ,
BlockReopenQueue * reopen_queu e,
uint64_t parent_perm , uint64_t parent_shared ,
uint64_t * nperm , uint64_t * nshared )
{
if ( bs - > drv & & bs - > drv - > bdrv_child_perm ) {
bs - > drv - > bdrv_child_perm ( bs , c , role ,
bs - > drv - > bdrv_child_perm ( bs , c , role , reopen_queue ,
parent_perm , parent_shared ,
nperm , nshared ) ;
}
/* TODO Take force_share from reopen_queue */
if ( child_bs & & child_bs - > force_share ) {
* nshared = BLK_PERM_ALL ;
}
@ -1596,7 +1597,7 @@ static int bdrv_check_perm(BlockDriverState *bs, uint64_t cumulative_perms,
/* Check all children */
QLIST_FOREACH ( c , & bs - > children , next ) {
uint64_t cur_perm , cur_shared ;
bdrv_child_perm ( bs , c - > bs , c , c - > role ,
bdrv_child_perm ( bs , c - > bs , c , c - > role , NULL ,
cumulative_perms , cumulative_shared_perms ,
& cur_perm , & cur_shared ) ;
ret = bdrv_child_check_perm ( c , cur_perm , cur_shared , ignore_children ,
@ -1658,7 +1659,7 @@ static void bdrv_set_perm(BlockDriverState *bs, uint64_t cumulative_perms,
/* Update all children */
QLIST_FOREACH ( c , & bs - > children , next ) {
uint64_t cur_perm , cur_shared ;
bdrv_child_perm ( bs , c - > bs , c , c - > role ,
bdrv_child_perm ( bs , c - > bs , c , c - > role , NULL ,
cumulative_perms , cumulative_shared_perms ,
& cur_perm , & cur_shared ) ;
bdrv_child_set_perm ( c , cur_perm , cur_shared ) ;
@ -1827,6 +1828,7 @@ int bdrv_child_try_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared,
void bdrv_filter_default_perms ( BlockDriverState * bs , BdrvChild * c ,
const BdrvChildRole * role ,
BlockReopenQueue * reopen_queue ,
uint64_t perm , uint64_t shared ,
uint64_t * nperm , uint64_t * nshared )
{
@ -1844,6 +1846,7 @@ void bdrv_filter_default_perms(BlockDriverState *bs, BdrvChild *c,
void bdrv_format_default_perms ( BlockDriverState * bs , BdrvChild * c ,
const BdrvChildRole * role ,
BlockReopenQueue * reopen_queue ,
uint64_t perm , uint64_t shared ,
uint64_t * nperm , uint64_t * nshared )
{
@ -1853,9 +1856,11 @@ void bdrv_format_default_perms(BlockDriverState *bs, BdrvChild *c,
if ( ! backing ) {
/* Apart from the modifications below, the same permissions are
* forwarded and left alone as for filters */
bdrv_filter_default_perms ( bs , c , role , perm , shared , & perm , & shared ) ;
bdrv_filter_default_perms ( bs , c , role , reopen_queue , perm , shared ,
& perm , & shared ) ;
/* Format drivers may touch metadata even if the guest doesn't write */
/* TODO Take flags from reopen_queue */
if ( bdrv_is_writable ( bs ) ) {
perm | = BLK_PERM_WRITE | BLK_PERM_RESIZE ;
}
@ -1999,7 +2004,7 @@ BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs,
assert ( parent_bs - > drv ) ;
assert ( bdrv_get_aio_context ( parent_bs ) = = bdrv_get_aio_context ( child_bs ) ) ;
bdrv_child_perm ( parent_bs , child_bs , NULL , child_role ,
bdrv_child_perm ( parent_bs , child_bs , NULL , child_role , NULL ,
perm , shared_perm , & perm , & shared_perm ) ;
child = bdrv_root_attach_child ( child_bs , child_name , child_role ,