Re: [Qemu-block] [PATCH v2 12/21] block: Split out parse_json_protocol()

2015-11-27 Thread Max Reitz
On 23.11.2015 16:59, Kevin Wolf wrote:
> 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 
> ---
>  block.c | 50 --
>  1 file changed, 32 insertions(+), 18 deletions(-)

Reviewed-by: Max Reitz 



signature.asc
Description: OpenPGP digital signature


[Qemu-block] [PATCH v2 12/21] block: Split out parse_json_protocol()

2015-11-23 Thread Kevin Wolf
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 
---
 block.c | 50 --
 1 file changed, 32 insertions(+), 18 deletions(-)

diff --git a/block.c b/block.c
index 08d29b3..6dbff92 100644
--- a/block.c
+++ b/block.c
@@ -1018,37 +1018,45 @@ static QDict *parse_json_filename(const char *filename, 
Error **errp)
 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, _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
  * filename/flags pair to option QDict entries.
  * The BDRV_O_PROTOCOL flag in *flags will be set or cleared accordingly if a
  * 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)
 {
-const char *filename = *pfilename;
 const char *drvname;
 bool protocol = *flags & BDRV_O_PROTOCOL;
 bool parse_filename = false;
 BlockDriver *drv = NULL;
 Error *local_err = NULL;
 
-/* Parse json: pseudo-protocol */
-if (filename && g_str_has_prefix(filename, "json:")) {
-QDict *json_options = parse_json_filename(filename, _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");
 if (drvname) {
 drv = bdrv_find_format(drvname);
@@ -1487,13 +1495,19 @@ static int bdrv_open_inherit(BlockDriverState **pbs, 
const char *filename,
 options = qdict_new();
 }
 
+parse_json_protocol(options, , _err);
+if (local_err) {
+ret = -EINVAL;
+goto fail;
+}
+
 if (child_role) {
 bs->inherits_from = parent;
 child_role->inherit_options(, options,
 parent->open_flags, parent->options);
 }
 
-ret = bdrv_fill_options(, , , _err);
+ret = bdrv_fill_options(, filename, , _err);
 if (local_err) {
 goto fail;
 }
-- 
1.8.3.1