From: Kevin Wolf <kwolf@redhat.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, benoit.canet@irqsave.net, armbru@redhat.com,
mreitz@redhat.com, stefanha@redhat.com
Subject: [Qemu-devel] [PATCH v2 1/9] block: Create bdrv_fill_options()
Date: Wed, 25 Jun 2014 16:35:51 +0200 [thread overview]
Message-ID: <1403706959-6979-2-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1403706959-6979-1-git-send-email-kwolf@redhat.com>
The idea of bdrv_fill_options() is to convert every parameter for
opening images, in particular the filename and flags, to entries in the
options QDict.
This patch starts with moving the filename parsing and driver probing
part from bdrv_file_open() to the new function.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block.c | 112 +++++++++++++++++++++++++++++++++++++++-------------------------
1 file changed, 69 insertions(+), 43 deletions(-)
diff --git a/block.c b/block.c
index a3d09fa..f1c3b57 100644
--- a/block.c
+++ b/block.c
@@ -1006,77 +1006,103 @@ free_and_fail:
}
/*
- * Opens a file using a protocol (file, host_device, nbd, ...)
- *
- * options is an indirect pointer to a QDict of options to pass to the block
- * drivers, or pointer to NULL for an empty set of options. If this function
- * takes ownership of the QDict reference, it will set *options to NULL;
- * otherwise, it will contain unused/unrecognized options after this function
- * returns. Then, the caller is responsible for freeing it. If it intends to
- * reuse the QDict, QINCREF() should be called beforehand.
+ * Fills in default options for opening images and converts the legacy
+ * filename/flags pair to option QDict entries.
*/
-static int bdrv_file_open(BlockDriverState *bs, const char *filename,
- QDict **options, int flags, Error **errp)
+static int bdrv_fill_options(QDict **options, const char *filename,
+ Error **errp)
{
- BlockDriver *drv;
const char *drvname;
bool parse_filename = false;
Error *local_err = NULL;
- int ret;
+ BlockDriver *drv;
/* Fetch the file name from the options QDict if necessary */
- if (!filename) {
- filename = qdict_get_try_str(*options, "filename");
- } else if (filename && !qdict_haskey(*options, "filename")) {
- qdict_put(*options, "filename", qstring_from_str(filename));
- parse_filename = true;
- } else {
- error_setg(errp, "Can't specify 'file' and 'filename' options at the "
- "same time");
- ret = -EINVAL;
- goto fail;
+ if (filename) {
+ if (!qdict_haskey(*options, "filename")) {
+ qdict_put(*options, "filename", qstring_from_str(filename));
+ parse_filename = true;
+ } else {
+ error_setg(errp, "Can't specify 'file' and 'filename' options at "
+ "the same time");
+ return -EINVAL;
+ }
}
/* Find the right block driver */
+ filename = qdict_get_try_str(*options, "filename");
drvname = qdict_get_try_str(*options, "driver");
- if (drvname) {
- drv = bdrv_find_format(drvname);
- if (!drv) {
- error_setg(errp, "Unknown driver '%s'", drvname);
- }
- qdict_del(*options, "driver");
- } else if (filename) {
- drv = bdrv_find_protocol(filename, parse_filename);
- if (!drv) {
- error_setg(errp, "Unknown protocol");
+
+ if (!drvname) {
+ 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;
}
- } else {
- error_setg(errp, "Must specify either driver or file");
- drv = NULL;
}
+ drv = bdrv_find_format(drvname);
if (!drv) {
- /* errp has been set already */
- ret = -ENOENT;
- goto fail;
+ error_setg(errp, "Unknown driver '%s'", drvname);
+ return -ENOENT;
}
- /* Parse the filename and open it */
+ /* Driver-specific filename parsing */
if (drv->bdrv_parse_filename && parse_filename) {
drv->bdrv_parse_filename(filename, *options, &local_err);
if (local_err) {
error_propagate(errp, local_err);
- ret = -EINVAL;
- goto fail;
+ return -EINVAL;
}
if (!drv->bdrv_needs_filename) {
qdict_del(*options, "filename");
- } else {
- filename = qdict_get_str(*options, "filename");
}
}
+ return 0;
+}
+
+/*
+ * Opens a file using a protocol (file, host_device, nbd, ...)
+ *
+ * options is an indirect pointer to a QDict of options to pass to the block
+ * drivers, or pointer to NULL for an empty set of options. If this function
+ * takes ownership of the QDict reference, it will set *options to NULL;
+ * otherwise, it will contain unused/unrecognized options after this function
+ * returns. Then, the caller is responsible for freeing it. If it intends to
+ * reuse the QDict, QINCREF() should be called beforehand.
+ */
+static int bdrv_file_open(BlockDriverState *bs, const char *filename,
+ QDict **options, int flags, Error **errp)
+{
+ BlockDriver *drv;
+ const char *drvname;
+ Error *local_err = NULL;
+ int ret;
+
+ ret = bdrv_fill_options(options, filename, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ goto fail;
+ }
+
+ filename = qdict_get_try_str(*options, "filename");
+ drvname = qdict_get_str(*options, "driver");
+
+ drv = bdrv_find_format(drvname);
+ assert(drv);
+ qdict_del(*options, "driver");
+
+ /* Open the file */
if (!drv->bdrv_file_open) {
ret = bdrv_open(&bs, filename, NULL, *options, flags, drv, &local_err);
*options = NULL;
--
1.8.3.1
next prev parent reply other threads:[~2014-06-25 14:36 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-25 14:35 [Qemu-devel] [PATCH v2 0/9] bdrv_open() cleanups, part 1 Kevin Wolf
2014-06-25 14:35 ` Kevin Wolf [this message]
2014-06-25 15:37 ` [Qemu-devel] [PATCH v2 1/9] block: Create bdrv_fill_options() Eric Blake
2014-06-25 14:35 ` [Qemu-devel] [PATCH v2 2/9] block: Move bdrv_fill_options() call to bdrv_open() Kevin Wolf
2014-06-25 15:40 ` Eric Blake
2014-06-25 14:35 ` [Qemu-devel] [PATCH v2 3/9] block: Move json: parsing to bdrv_fill_options() Kevin Wolf
2014-06-25 14:35 ` [Qemu-devel] [PATCH v2 4/9] block: Always pass driver name through options QDict Kevin Wolf
2014-06-25 14:35 ` [Qemu-devel] [PATCH v2 5/9] block: Use common driver selection code for bdrv_open_file() Kevin Wolf
2014-06-25 14:35 ` [Qemu-devel] [PATCH v2 6/9] block: Inline bdrv_file_open() Kevin Wolf
2014-06-25 15:49 ` Eric Blake
2014-06-25 14:35 ` [Qemu-devel] [PATCH v2 7/9] block: Remove second bdrv_open() recursion Kevin Wolf
2014-06-25 15:52 ` Eric Blake
2014-06-25 14:35 ` [Qemu-devel] [PATCH v2 8/9] block: Catch backing files assigned to non-COW drivers Kevin Wolf
2014-06-25 15:53 ` Eric Blake
2014-06-25 14:35 ` [Qemu-devel] [PATCH v2 9/9] block: Remove a special case for protocols Kevin Wolf
2014-06-25 15:55 ` Eric Blake
2014-06-26 10:17 ` [Qemu-devel] [PATCH v2 0/9] bdrv_open() cleanups, part 1 Kevin Wolf
2014-06-26 21:17 ` Max Reitz
2014-06-26 21:46 ` Eric Blake
2014-06-26 21:48 ` Max Reitz
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=1403706959-6979-2-git-send-email-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=armbru@redhat.com \
--cc=benoit.canet@irqsave.net \
--cc=mreitz@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).