From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59110) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wuj9Y-0005UB-Dj for qemu-devel@nongnu.org; Wed, 11 Jun 2014 10:05:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Wuj9P-0007LB-IP for qemu-devel@nongnu.org; Wed, 11 Jun 2014 10:05:24 -0400 Received: from mx1.redhat.com ([209.132.183.28]:59045) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wuj9P-0007L5-BF for qemu-devel@nongnu.org; Wed, 11 Jun 2014 10:05:15 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s5BE5EsJ018154 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 11 Jun 2014 10:05:14 -0400 From: Kevin Wolf Date: Wed, 11 Jun 2014 16:04:55 +0200 Message-Id: <1402495503-4722-2-git-send-email-kwolf@redhat.com> In-Reply-To: <1402495503-4722-1-git-send-email-kwolf@redhat.com> References: <1402495503-4722-1-git-send-email-kwolf@redhat.com> Subject: [Qemu-devel] [PATCH 1/9] block: Create bdrv_fill_options() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, armbru@redhat.com, stefanha@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 --- block.c | 116 ++++++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 73 insertions(+), 43 deletions(-) diff --git a/block.c b/block.c index 17f763d..c5707e8 100644 --- a/block.c +++ b/block.c @@ -1007,77 +1007,107 @@ 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 (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"); + 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); + return ret; + } + + filename = qdict_get_try_str(*options, "filename"); + drvname = qdict_get_str(*options, "driver"); + + drv = bdrv_find_format(drvname); + if (!drv) { + error_setg(errp, "Unknown driver '%s'", drvname); + ret = -ENOENT; + goto fail; + } + 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