block: Split out parse_json_protocol()
The next patch distinguishes options that were explicitly set and options that were derived. bdrv_fill_option() added options of both types: Options given by json: syntax should be counted as explicit, but the rest is derived. In preparation for the distinction, move json: parse to a separate function. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
8e2160e2c7
commit
de3b53f007
50
block.c
50
block.c
|
@ -1018,37 +1018,45 @@ static QDict *parse_json_filename(const char *filename, Error **errp)
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void parse_json_protocol(QDict *options, const char **pfilename,
|
||||||
|
Error **errp)
|
||||||
|
{
|
||||||
|
QDict *json_options;
|
||||||
|
Error *local_err = NULL;
|
||||||
|
|
||||||
|
/* Parse json: pseudo-protocol */
|
||||||
|
if (!*pfilename || !g_str_has_prefix(*pfilename, "json:")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
json_options = parse_json_filename(*pfilename, &local_err);
|
||||||
|
if (local_err) {
|
||||||
|
error_propagate(errp, local_err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Options given in the filename have lower priority than options
|
||||||
|
* specified directly */
|
||||||
|
qdict_join(options, json_options, false);
|
||||||
|
QDECREF(json_options);
|
||||||
|
*pfilename = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fills in default options for opening images and converts the legacy
|
* Fills in default options for opening images and converts the legacy
|
||||||
* filename/flags pair to option QDict entries.
|
* filename/flags pair to option QDict entries.
|
||||||
* The BDRV_O_PROTOCOL flag in *flags will be set or cleared accordingly if a
|
* The BDRV_O_PROTOCOL flag in *flags will be set or cleared accordingly if a
|
||||||
* block driver has been specified explicitly.
|
* block driver has been specified explicitly.
|
||||||
*/
|
*/
|
||||||
static int bdrv_fill_options(QDict **options, const char **pfilename,
|
static int bdrv_fill_options(QDict **options, const char *filename,
|
||||||
int *flags, Error **errp)
|
int *flags, Error **errp)
|
||||||
{
|
{
|
||||||
const char *filename = *pfilename;
|
|
||||||
const char *drvname;
|
const char *drvname;
|
||||||
bool protocol = *flags & BDRV_O_PROTOCOL;
|
bool protocol = *flags & BDRV_O_PROTOCOL;
|
||||||
bool parse_filename = false;
|
bool parse_filename = false;
|
||||||
BlockDriver *drv = NULL;
|
BlockDriver *drv = NULL;
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
|
|
||||||
/* Parse json: pseudo-protocol */
|
|
||||||
if (filename && g_str_has_prefix(filename, "json:")) {
|
|
||||||
QDict *json_options = parse_json_filename(filename, &local_err);
|
|
||||||
if (local_err) {
|
|
||||||
error_propagate(errp, local_err);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Options given in the filename have lower priority than options
|
|
||||||
* specified directly */
|
|
||||||
qdict_join(*options, json_options, false);
|
|
||||||
QDECREF(json_options);
|
|
||||||
*pfilename = filename = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
drvname = qdict_get_try_str(*options, "driver");
|
drvname = qdict_get_try_str(*options, "driver");
|
||||||
if (drvname) {
|
if (drvname) {
|
||||||
drv = bdrv_find_format(drvname);
|
drv = bdrv_find_format(drvname);
|
||||||
|
@ -1487,13 +1495,19 @@ static int bdrv_open_inherit(BlockDriverState **pbs, const char *filename,
|
||||||
options = qdict_new();
|
options = qdict_new();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
parse_json_protocol(options, &filename, &local_err);
|
||||||
|
if (local_err) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
if (child_role) {
|
if (child_role) {
|
||||||
bs->inherits_from = parent;
|
bs->inherits_from = parent;
|
||||||
child_role->inherit_options(&flags, options,
|
child_role->inherit_options(&flags, options,
|
||||||
parent->open_flags, parent->options);
|
parent->open_flags, parent->options);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = bdrv_fill_options(&options, &filename, &flags, &local_err);
|
ret = bdrv_fill_options(&options, filename, &flags, &local_err);
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue