From: Eric Blake <eblake@redhat.com>
To: Kevin Wolf <kwolf@redhat.com>
Cc: pbonzini@redhat.com, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 10/11] block: Allow omitting the file name when using driver-specific options
Date: Tue, 19 Mar 2013 20:27:22 -0600 [thread overview]
Message-ID: <51491E8A.5010305@redhat.com> (raw)
In-Reply-To: <1363627441-8297-11-git-send-email-kwolf@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 4028 bytes --]
On 03/18/2013 11:24 AM, Kevin Wolf wrote:
> After this patch, using -drive with an empty file name continues to open
> the file if driver-specific options are used. If no driver-specific
> options are specified, the semantics stay as it was: It defines a drive
> without an inserted medium.
>
> In order to achieve this, bdrv_open() must be made safe to work with a
> NULL filename parameter. The assumption that is made is that only block
> drivers which implement bdrv_parse_filename() support using driver
> specific options and could therefore work without a filename. These
> drivers must make sure to cope with NULL in their implementation of
> .bdrv_open() (this is only NBD for now). For all other drivers, the
> block layer code will make sure to error out before calling into their
> code - they can't possibly work without a filename.
>
> Now an NBD connection can be opened like this:
>
> qemu-system-x86_64 -drive file.driver=nbd,file.port=1234,file.host=::1
Slick.
>
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
> block.c | 49 +++++++++++++++++++++++++++++++++++++++--------
> block/nbd.c | 1 -
> blockdev.c | 10 +++++++---
> include/block/block_int.h | 3 +++
> 4 files changed, 51 insertions(+), 12 deletions(-)
> +++ b/block/nbd.c
> @@ -174,7 +174,6 @@ static void nbd_parse_filename(const char *filename, QDict *options,
>
> /* extract the host_spec - fail if it's not nbd:... */
> if (!strstart(file, "nbd:", &host_spec)) {
> - error_setg(errp, "File name string for NBD must start with 'nbd:'");
> goto out;
> }
Is this really right? The code allows me to pass both file= and
file.driver= at once; so what if I pass -drive file.driver=nbd,file=xyz.
Prior to this patch, I'd get a nice message about file=xyz not starting
with nbd:, but now there is a silent failure.
I think it might be better if you keep the error_setg(), and instead
rewrite the if on the previous line:
if (file && !strstart(file, "nbd:", &host_spec)) {
Also, since it looks like the code allows me to pass both file.driver=
and file= at once, if I pass both pieces of information, is there any
sanity checking that the two are identical, and/or should we error out
and declare that if driver options are used then nbd requires a NULL
filename?
> @@ -697,10 +701,10 @@ DriveInfo *drive_init(QemuOpts *all_opts, BlockInterfaceType block_default_type)
> if (ret < 0) {
> if (ret == -EMEDIUMTYPE) {
> error_report("could not open disk image %s: not in %s format",
> - file, drv->format_name);
> + file ?: dinfo->id, drv->format_name);
You're not the first person to use this gcc extension, but the more
instances we add, the harder it will be to scrub them back out if
someone ever insists on portability to another compiler.
> } else {
> error_report("could not open disk image %s: %s",
> - file, strerror(-ret));
> + file ?: dinfo->id, strerror(-ret));
> }
> goto err;
> }
> diff --git a/include/block/block_int.h b/include/block/block_int.h
> index 1b06a11..0986a2d 100644
> --- a/include/block/block_int.h
> +++ b/include/block/block_int.h
> @@ -75,6 +75,9 @@ struct BlockDriver {
> int instance_size;
> int (*bdrv_probe)(const uint8_t *buf, int buf_size, const char *filename);
> int (*bdrv_probe_device)(const char *filename);
> +
> + /* Any driver implementing this callback is expected to be able to handle
> + * NULL file names in its .bdrv_open() implementation */
> void (*bdrv_parse_filename)(const char *filename, QDict *options, Error **errp);
>
> /* For handling image reopen for split or non-split files */
>
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 621 bytes --]
next prev parent reply other threads:[~2013-03-20 2:27 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-18 17:23 [Qemu-devel] [PATCH 00/11] block: Driver-specific options for protocols Kevin Wolf
2013-03-18 17:23 ` [Qemu-devel] [PATCH 01/11] block: Add options QDict to bdrv_file_open() prototypes Kevin Wolf
2013-03-19 15:40 ` Eric Blake
2013-03-18 17:23 ` [Qemu-devel] [PATCH 02/11] block: Pass bdrv_file_open() options to block drivers Kevin Wolf
2013-03-19 17:48 ` Eric Blake
2013-03-19 18:05 ` Kevin Wolf
2013-03-19 19:37 ` Eric Blake
2013-03-18 17:23 ` [Qemu-devel] [PATCH 03/11] qemu-socket: Make socket_optslist public Kevin Wolf
2013-03-19 19:51 ` Eric Blake
2013-03-18 17:23 ` [Qemu-devel] [PATCH 04/11] nbd: Keep hostname and port separate Kevin Wolf
2013-03-19 20:56 ` Eric Blake
2013-03-18 17:23 ` [Qemu-devel] [PATCH 05/11] nbd: Remove unused functions Kevin Wolf
2013-03-19 20:58 ` Eric Blake
2013-03-18 17:23 ` [Qemu-devel] [PATCH 06/11] nbd: Accept -drive options for the network connection Kevin Wolf
2013-03-19 21:44 ` Eric Blake
2013-03-18 17:23 ` [Qemu-devel] [PATCH 07/11] block: Introduce .bdrv_parse_filename callback Kevin Wolf
2013-03-19 22:04 ` Eric Blake
2013-03-18 17:23 ` [Qemu-devel] [PATCH 08/11] block: Rename variable to avoid shadowing Kevin Wolf
2013-03-20 2:07 ` Eric Blake
2013-03-20 8:51 ` Kevin Wolf
2013-03-18 17:23 ` [Qemu-devel] [PATCH 09/11] block: Make find_image_format safe with NULL filename Kevin Wolf
2013-03-20 2:14 ` Eric Blake
2013-03-20 8:48 ` Kevin Wolf
2013-03-18 17:24 ` [Qemu-devel] [PATCH 10/11] block: Allow omitting the file name when using driver-specific options Kevin Wolf
2013-03-20 2:27 ` Eric Blake [this message]
2013-03-20 18:37 ` Kevin Wolf
2013-03-18 17:24 ` [Qemu-devel] [PATCH 11/11] nbd: Use default port if only host is specified Kevin Wolf
2013-03-20 2:29 ` Eric Blake
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=51491E8A.5010305@redhat.com \
--to=eblake@redhat.com \
--cc=kwolf@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/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).