@@ -86,6 +86,7 @@ static BlockDriverState *bdrv_open_inherit(const char *filename,
86
86
BlockDriverState * parent ,
87
87
const BdrvChildClass * child_class ,
88
88
BdrvChildRole child_role ,
89
+ bool parse_filename ,
89
90
Error * * errp );
90
91
91
92
static bool bdrv_recurse_has_child (BlockDriverState * bs ,
@@ -2055,7 +2056,8 @@ static void parse_json_protocol(QDict *options, const char **pfilename,
2055
2056
* block driver has been specified explicitly.
2056
2057
*/
2057
2058
static int bdrv_fill_options (QDict * * options , const char * filename ,
2058
- int * flags , Error * * errp )
2059
+ int * flags , bool allow_parse_filename ,
2060
+ Error * * errp )
2059
2061
{
2060
2062
const char * drvname ;
2061
2063
bool protocol = * flags & BDRV_O_PROTOCOL ;
@@ -2097,7 +2099,7 @@ static int bdrv_fill_options(QDict **options, const char *filename,
2097
2099
if (protocol && filename ) {
2098
2100
if (!qdict_haskey (* options , "filename" )) {
2099
2101
qdict_put_str (* options , "filename" , filename );
2100
- parse_filename = true ;
2102
+ parse_filename = allow_parse_filename ;
2101
2103
} else {
2102
2104
error_setg (errp , "Can't specify 'file' and 'filename' options at "
2103
2105
"the same time" );
@@ -3660,7 +3662,8 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
3660
3662
}
3661
3663
3662
3664
backing_hd = bdrv_open_inherit (backing_filename , reference , options , 0 , bs ,
3663
- & child_of_bds , bdrv_backing_role (bs ), errp );
3665
+ & child_of_bds , bdrv_backing_role (bs ), true,
3666
+ errp );
3664
3667
if (!backing_hd ) {
3665
3668
bs -> open_flags |= BDRV_O_NO_BACKING ;
3666
3669
error_prepend (errp , "Could not open backing file: " );
@@ -3694,7 +3697,8 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
3694
3697
static BlockDriverState *
3695
3698
bdrv_open_child_bs (const char * filename , QDict * options , const char * bdref_key ,
3696
3699
BlockDriverState * parent , const BdrvChildClass * child_class ,
3697
- BdrvChildRole child_role , bool allow_none , Error * * errp )
3700
+ BdrvChildRole child_role , bool allow_none ,
3701
+ bool parse_filename , Error * * errp )
3698
3702
{
3699
3703
BlockDriverState * bs = NULL ;
3700
3704
QDict * image_options ;
@@ -3725,7 +3729,8 @@ bdrv_open_child_bs(const char *filename, QDict *options, const char *bdref_key,
3725
3729
}
3726
3730
3727
3731
bs = bdrv_open_inherit (filename , reference , image_options , 0 ,
3728
- parent , child_class , child_role , errp );
3732
+ parent , child_class , child_role , parse_filename ,
3733
+ errp );
3729
3734
if (!bs ) {
3730
3735
goto done ;
3731
3736
}
@@ -3735,6 +3740,33 @@ bdrv_open_child_bs(const char *filename, QDict *options, const char *bdref_key,
3735
3740
return bs ;
3736
3741
}
3737
3742
3743
+ static BdrvChild * bdrv_open_child_common (const char * filename ,
3744
+ QDict * options , const char * bdref_key ,
3745
+ BlockDriverState * parent ,
3746
+ const BdrvChildClass * child_class ,
3747
+ BdrvChildRole child_role ,
3748
+ bool allow_none , bool parse_filename ,
3749
+ Error * * errp )
3750
+ {
3751
+ BlockDriverState * bs ;
3752
+ BdrvChild * child ;
3753
+
3754
+ GLOBAL_STATE_CODE ();
3755
+
3756
+ bs = bdrv_open_child_bs (filename , options , bdref_key , parent , child_class ,
3757
+ child_role , allow_none , parse_filename , errp );
3758
+ if (bs == NULL ) {
3759
+ return NULL ;
3760
+ }
3761
+
3762
+ bdrv_graph_wrlock ();
3763
+ child = bdrv_attach_child (parent , bs , bdref_key , child_class , child_role ,
3764
+ errp );
3765
+ bdrv_graph_wrunlock ();
3766
+
3767
+ return child ;
3768
+ }
3769
+
3738
3770
/*
3739
3771
* Opens a disk image whose options are given as BlockdevRef in another block
3740
3772
* device's options.
@@ -3758,27 +3790,15 @@ BdrvChild *bdrv_open_child(const char *filename,
3758
3790
BdrvChildRole child_role ,
3759
3791
bool allow_none , Error * * errp )
3760
3792
{
3761
- BlockDriverState * bs ;
3762
- BdrvChild * child ;
3763
-
3764
- GLOBAL_STATE_CODE ();
3765
-
3766
- bs = bdrv_open_child_bs (filename , options , bdref_key , parent , child_class ,
3767
- child_role , allow_none , errp );
3768
- if (bs == NULL ) {
3769
- return NULL ;
3770
- }
3771
-
3772
- bdrv_graph_wrlock ();
3773
- child = bdrv_attach_child (parent , bs , bdref_key , child_class , child_role ,
3774
- errp );
3775
- bdrv_graph_wrunlock ();
3776
-
3777
- return child ;
3793
+ return bdrv_open_child_common (filename , options , bdref_key , parent ,
3794
+ child_class , child_role , allow_none , false,
3795
+ errp );
3778
3796
}
3779
3797
3780
3798
/*
3781
- * Wrapper on bdrv_open_child() for most popular case: open primary child of bs.
3799
+ * This does mostly the same as bdrv_open_child(), but for opening the primary
3800
+ * child of a node. A notable difference from bdrv_open_child() is that it
3801
+ * enables filename parsing for protocol names (including json:).
3782
3802
*
3783
3803
* @parent can move to a different AioContext in this function.
3784
3804
*/
@@ -3793,8 +3813,8 @@ int bdrv_open_file_child(const char *filename,
3793
3813
role = parent -> drv -> is_filter ?
3794
3814
(BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY ) : BDRV_CHILD_IMAGE ;
3795
3815
3796
- if (!bdrv_open_child (filename , options , bdref_key , parent ,
3797
- & child_of_bds , role , false, errp ))
3816
+ if (!bdrv_open_child_common (filename , options , bdref_key , parent ,
3817
+ & child_of_bds , role , false, true , errp ))
3798
3818
{
3799
3819
return - EINVAL ;
3800
3820
}
@@ -3839,7 +3859,8 @@ BlockDriverState *bdrv_open_blockdev_ref(BlockdevRef *ref, Error **errp)
3839
3859
3840
3860
}
3841
3861
3842
- bs = bdrv_open_inherit (NULL , reference , qdict , 0 , NULL , NULL , 0 , errp );
3862
+ bs = bdrv_open_inherit (NULL , reference , qdict , 0 , NULL , NULL , 0 , false,
3863
+ errp );
3843
3864
obj = NULL ;
3844
3865
qobject_unref (obj );
3845
3866
visit_free (v );
@@ -3929,7 +3950,7 @@ static BlockDriverState * no_coroutine_fn
3929
3950
bdrv_open_inherit (const char * filename , const char * reference , QDict * options ,
3930
3951
int flags , BlockDriverState * parent ,
3931
3952
const BdrvChildClass * child_class , BdrvChildRole child_role ,
3932
- Error * * errp )
3953
+ bool parse_filename , Error * * errp )
3933
3954
{
3934
3955
int ret ;
3935
3956
BlockBackend * file = NULL ;
@@ -3977,9 +3998,11 @@ bdrv_open_inherit(const char *filename, const char *reference, QDict *options,
3977
3998
}
3978
3999
3979
4000
/* json: syntax counts as explicit options, as if in the QDict */
3980
- parse_json_protocol (options , & filename , & local_err );
3981
- if (local_err ) {
3982
- goto fail ;
4001
+ if (parse_filename ) {
4002
+ parse_json_protocol (options , & filename , & local_err );
4003
+ if (local_err ) {
4004
+ goto fail ;
4005
+ }
3983
4006
}
3984
4007
3985
4008
bs -> explicit_options = qdict_clone_shallow (options );
@@ -4004,7 +4027,8 @@ bdrv_open_inherit(const char *filename, const char *reference, QDict *options,
4004
4027
parent -> open_flags , parent -> options );
4005
4028
}
4006
4029
4007
- ret = bdrv_fill_options (& options , filename , & flags , & local_err );
4030
+ ret = bdrv_fill_options (& options , filename , & flags , parse_filename ,
4031
+ & local_err );
4008
4032
if (ret < 0 ) {
4009
4033
goto fail ;
4010
4034
}
@@ -4073,7 +4097,7 @@ bdrv_open_inherit(const char *filename, const char *reference, QDict *options,
4073
4097
4074
4098
file_bs = bdrv_open_child_bs (filename , options , "file" , bs ,
4075
4099
& child_of_bds , BDRV_CHILD_IMAGE ,
4076
- true, & local_err );
4100
+ true, true, & local_err );
4077
4101
if (local_err ) {
4078
4102
goto fail ;
4079
4103
}
@@ -4222,7 +4246,7 @@ BlockDriverState *bdrv_open(const char *filename, const char *reference,
4222
4246
GLOBAL_STATE_CODE ();
4223
4247
4224
4248
return bdrv_open_inherit (filename , reference , options , flags , NULL ,
4225
- NULL , 0 , errp );
4249
+ NULL , 0 , true, errp );
4226
4250
}
4227
4251
4228
4252
/* Return true if the NULL-terminated @list contains @str */
0 commit comments