From: "Benoît Canet" <benoit.canet@irqsave.net>
To: Kevin Wolf <kwolf@redhat.com>
Cc: qemu-devel@nongnu.org, stefanha@redhat.com, armbru@redhat.com
Subject: Re: [Qemu-devel] [PATCH 4/9] block: Always pass driver name through options QDict
Date: Thu, 12 Jun 2014 14:40:00 +0200 [thread overview]
Message-ID: <20140612123954.GD24528@irqsave.net> (raw)
In-Reply-To: <1402495503-4722-5-git-send-email-kwolf@redhat.com>
The Wednesday 11 Jun 2014 à 16:04:58 (+0200), Kevin Wolf wrote :
> The "driver" entry in the options QDict is now only missing if we're
> opening an image with format probing.
>
> We also catch cases now where both the drv argument and a "driver"
> option is specified, e.g. by specifying -drive format=qcow2,driver=raw
>
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
> block.c | 76 ++++++++++++++++++++++++----------------------
> tests/qemu-iotests/051 | 1 +
> tests/qemu-iotests/051.out | 5 ++-
> 3 files changed, 45 insertions(+), 37 deletions(-)
>
> diff --git a/block.c b/block.c
> index b9c2b41..011cfc4 100644
> --- a/block.c
> +++ b/block.c
> @@ -1038,14 +1038,13 @@ static QDict *parse_json_filename(const char *filename, Error **errp)
> * filename/flags pair to option QDict entries.
> */
> static int bdrv_fill_options(QDict **options, const char **pfilename, int flags,
> - Error **errp)
> + BlockDriver *drv, Error **errp)
> {
> const char *filename = *pfilename;
> const char *drvname;
> bool protocol = flags & BDRV_O_PROTOCOL;
> bool parse_filename = false;
> Error *local_err = NULL;
> - BlockDriver *drv;
>
> /* Parse json: pseudo-protocol */
> if (filename && g_str_has_prefix(filename, "json:")) {
> @@ -1062,12 +1061,8 @@ static int bdrv_fill_options(QDict **options, const char **pfilename, int flags,
> *pfilename = filename = NULL;
> }
>
> - if (!protocol) {
> - return 0;
> - }
> -
> /* Fetch the file name from the options QDict if necessary */
> - if (filename) {
> + if (protocol && filename) {
> if (filename && !qdict_haskey(*options, "filename")) {
> qdict_put(*options, "filename", qstring_from_str(filename));
> parse_filename = true;
> @@ -1082,30 +1077,41 @@ static int bdrv_fill_options(QDict **options, const char **pfilename, int flags,
> filename = qdict_get_try_str(*options, "filename");
> drvname = qdict_get_try_str(*options, "driver");
>
> - if (!drvname) {
> - if (filename) {
> - drv = bdrv_find_protocol(filename, parse_filename);
> - if (!drv) {
> - error_setg(errp, "Unknown protocol");
> + if (drv) {
> + if (drvname) {
> + error_setg(errp, "Driver specified twice");
> + return -EINVAL;
> + }
> + drvname = drv->format_name;
> + qdict_put(*options, "driver", qstring_from_str(drvname));
> + } else {
> + if (!drvname && protocol) {
> + if (filename) {
> + drv = bdrv_find_protocol(filename, parse_filename);
> + if (!drv) {
> + error_setg(errp, "Unknown protocol");
> + return -EINVAL;
> + }
> +
> + drvname = drv->format_name;
> + qdict_put(*options, "driver", qstring_from_str(drvname));
> + } else {
> + error_setg(errp, "Must specify either driver or file");
> return -EINVAL;
> }
> -
> - drvname = drv->format_name;
> - qdict_put(*options, "driver", qstring_from_str(drvname));
> - } else {
> - error_setg(errp, "Must specify either driver or file");
> - return -EINVAL;
> + } else if (drvname) {
> + drv = bdrv_find_format(drvname);
> + if (!drv) {
> + error_setg(errp, "Unknown driver '%s'", drvname);
> + return -ENOENT;
> + }
> }
> }
>
> - drv = bdrv_find_format(drvname);
> - if (!drv) {
> - error_setg(errp, "Unknown driver '%s'", drvname);
> - return -ENOENT;
> - }
> + assert(drv || !protocol);
>
> /* Driver-specific filename parsing */
> - if (drv->bdrv_parse_filename && parse_filename) {
> + if (drv && drv->bdrv_parse_filename && parse_filename) {
> drv->bdrv_parse_filename(filename, *options, &local_err);
> if (local_err) {
> error_propagate(errp, local_err);
> @@ -1445,7 +1451,7 @@ int bdrv_open(BlockDriverState **pbs, const char *filename,
> options = qdict_new();
> }
>
> - ret = bdrv_fill_options(&options, &filename, flags, &local_err);
> + ret = bdrv_fill_options(&options, &filename, flags, drv, &local_err);
> if (local_err) {
> error_propagate(errp, local_err);
> return ret;
> @@ -1486,7 +1492,10 @@ int bdrv_open(BlockDriverState **pbs, const char *filename,
> }
>
> /* Find the right image format driver */
> + drv = NULL;
> drvname = qdict_get_try_str(options, "driver");
> + assert(drvname || !(flags & BDRV_O_PROTOCOL));
> +
> if (drvname) {
> drv = bdrv_find_format(drvname);
> qdict_del(options, "driver");
> @@ -1495,19 +1504,14 @@ int bdrv_open(BlockDriverState **pbs, const char *filename,
> ret = -EINVAL;
> goto fail;
> }
> - }
> -
> - if (!drv) {
> - if (file) {
> - ret = find_image_format(file, filename, &drv, &local_err);
> - } else {
> - error_setg(errp, "Must specify either driver or file");
> - ret = -EINVAL;
> + } else if (file) {
> + ret = find_image_format(file, filename, &drv, &local_err);
> + if (ret < 0) {
> goto fail;
> }
> - }
> -
> - if (!drv) {
> + } else {
> + error_setg(errp, "Must specify either driver or file");
> + ret = -EINVAL;
> goto fail;
> }
>
> diff --git a/tests/qemu-iotests/051 b/tests/qemu-iotests/051
> index c4af131..30a712f 100755
> --- a/tests/qemu-iotests/051
> +++ b/tests/qemu-iotests/051
> @@ -92,6 +92,7 @@ echo
>
> run_qemu -drive file="$TEST_IMG",format=foo
> run_qemu -drive file="$TEST_IMG",driver=foo
> +run_qemu -drive file="$TEST_IMG",driver=raw,format=qcow2
>
> echo
> echo === Overriding backing file ===
> diff --git a/tests/qemu-iotests/051.out b/tests/qemu-iotests/051.out
> index ad60107..37cb049 100644
> --- a/tests/qemu-iotests/051.out
> +++ b/tests/qemu-iotests/051.out
> @@ -38,7 +38,10 @@ Testing: -drive file=TEST_DIR/t.qcow2,format=foo
> QEMU_PROG: -drive file=TEST_DIR/t.qcow2,format=foo: 'foo' invalid format
>
> Testing: -drive file=TEST_DIR/t.qcow2,driver=foo
> -QEMU_PROG: -drive file=TEST_DIR/t.qcow2,driver=foo: could not open disk image TEST_DIR/t.qcow2: Invalid driver: 'foo'
> +QEMU_PROG: -drive file=TEST_DIR/t.qcow2,driver=foo: could not open disk image TEST_DIR/t.qcow2: Unknown driver 'foo'
> +
> +Testing: -drive file=TEST_DIR/t.qcow2,driver=raw,format=qcow2
> +QEMU_PROG: -drive file=TEST_DIR/t.qcow2,driver=raw,format=qcow2: could not open disk image TEST_DIR/t.qcow2: Driver specified twice
>
>
> === Overriding backing file ===
> --
> 1.8.3.1
>
>
That's faily huge patch. I didn't understood everything.
next prev parent reply other threads:[~2014-06-12 12:40 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-11 14:04 [Qemu-devel] [PATCH 0/9] bdrv_open() cleanups, part 1 Kevin Wolf
2014-06-11 14:04 ` [Qemu-devel] [PATCH 1/9] block: Create bdrv_fill_options() Kevin Wolf
2014-06-11 19:14 ` Eric Blake
2014-06-12 12:08 ` Benoît Canet
2014-06-23 15:30 ` Kevin Wolf
2014-06-23 16:38 ` Benoît Canet
2014-06-11 14:04 ` [Qemu-devel] [PATCH 2/9] block: Move bdrv_fill_options() call to bdrv_open() Kevin Wolf
2014-06-11 19:31 ` Eric Blake
2014-06-12 12:19 ` Benoît Canet
2014-06-11 14:04 ` [Qemu-devel] [PATCH 3/9] block: Move json: parsing to bdrv_fill_options() Kevin Wolf
2014-06-11 19:35 ` Eric Blake
2014-06-12 12:26 ` Benoît Canet
2014-06-12 13:47 ` Eric Blake
2014-06-11 14:04 ` [Qemu-devel] [PATCH 4/9] block: Always pass driver name through options QDict Kevin Wolf
2014-06-11 19:43 ` Eric Blake
2014-06-12 12:40 ` Benoît Canet [this message]
2014-06-11 14:04 ` [Qemu-devel] [PATCH 5/9] block: Use common driver selection code for bdrv_open_file() Kevin Wolf
2014-06-11 20:24 ` Eric Blake
2014-06-12 12:48 ` Benoît Canet
2014-06-11 14:05 ` [Qemu-devel] [PATCH 6/9] block: Inline bdrv_file_open() Kevin Wolf
2014-06-12 12:50 ` Benoît Canet
2014-06-11 14:05 ` [Qemu-devel] [PATCH 7/9] block: Remove second bdrv_open() recursion Kevin Wolf
2014-06-11 14:05 ` [Qemu-devel] [PATCH 8/9] block: Catch backing files assigned to non-COW drivers Kevin Wolf
2014-06-11 14:05 ` [Qemu-devel] [PATCH 9/9] block: Remove a special case for protocols Kevin Wolf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140612123954.GD24528@irqsave.net \
--to=benoit.canet@irqsave.net \
--cc=armbru@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.