qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: "Marc-André Lureau" <marcandre.lureau@gmail.com>
Cc: spice-devel@lists.freedesktop.org, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 07/12] block: save the associated child in BlockDriverState
Date: Fri, 21 Jun 2013 00:25:53 +0200	[thread overview]
Message-ID: <51C38171.3010806@redhat.com> (raw)
In-Reply-To: <1371750371-18491-8-git-send-email-marcandre.lureau@redhat.com>

Il 20/06/2013 19:46, Marc-André Lureau ha scritto:
> This allows the Spice block driver to eject the associated device.

The child can change when you have for example a streaming operation.
What exactly are you trying to do here (I guess I'll understand more
when I get to the later patches)?

Can you draw the relationships between all the BlockDriverStates in a
spicebd: drive?

Paolo

> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  block.c                   | 46 +++++++++++++++++++++++++++++-----------------
>  include/block/block_int.h |  1 +
>  2 files changed, 30 insertions(+), 17 deletions(-)
> 
> diff --git a/block.c b/block.c
> index b88ad2f..f502eed 100644
> --- a/block.c
> +++ b/block.c
> @@ -294,7 +294,8 @@ void bdrv_register(BlockDriver *bdrv)
>  }
>  
>  /* create a new block device (by default it is empty) */
> -BlockDriverState *bdrv_new(const char *device_name)
> +static BlockDriverState *bdrv_new_int(const char *device_name,
> +    BlockDriverState *child)
>  {
>      BlockDriverState *bs;
>  
> @@ -305,10 +306,16 @@ BlockDriverState *bdrv_new(const char *device_name)
>      }
>      bdrv_iostatus_disable(bs);
>      notifier_list_init(&bs->close_notifiers);
> +    bs->child = child;
>  
>      return bs;
>  }
>  
> +BlockDriverState *bdrv_new(const char *device_name)
> +{
> +    return bdrv_new_int(device_name, NULL);
> +}
> +
>  void bdrv_add_close_notifier(BlockDriverState *bs, Notifier *notify)
>  {
>      notifier_list_add(&bs->close_notifiers, notify);
> @@ -769,16 +776,8 @@ free_and_fail:
>      return ret;
>  }
>  
> -/*
> - * Opens a file using a protocol (file, host_device, nbd, ...)
> - *
> - * options is a QDict of options to pass to the block drivers, or NULL for an
> - * empty set of options. The reference to the QDict belongs to the block layer
> - * after the call (even on failure), so if the caller intends to reuse the
> - * dictionary, it needs to use QINCREF() before calling bdrv_file_open.
> - */
> -int bdrv_file_open(BlockDriverState **pbs, const char *filename,
> -                   QDict *options, int flags)
> +static int bdrv_file_open_int(BlockDriverState **pbs, const char *filename,
> +    QDict *options, int flags, BlockDriverState *child)
>  {
>      BlockDriverState *bs;
>      BlockDriver *drv;
> @@ -790,7 +789,7 @@ int bdrv_file_open(BlockDriverState **pbs, const char *filename,
>          options = qdict_new();
>      }
>  
> -    bs = bdrv_new("");
> +    bs = bdrv_new_int("", child);
>      bs->options = options;
>      options = qdict_clone_shallow(options);
>  
> @@ -873,6 +872,20 @@ fail:
>  }
>  
>  /*
> + * Opens a file using a protocol (file, host_device, nbd, ...)
> + *
> + * options is a QDict of options to pass to the block drivers, or NULL for an
> + * empty set of options. The reference to the QDict belongs to the block layer
> + * after the call (even on failure), so if the caller intends to reuse the
> + * dictionary, it needs to use QINCREF() before calling bdrv_file_open.
> + */
> +int bdrv_file_open(BlockDriverState **pbs, const char *filename,
> +                   QDict *options, int flags)
> +{
> +    return bdrv_file_open_int(pbs, filename, options, flags, NULL);
> +}
> +
> +/*
>   * Opens the backing file for a BlockDriverState if not yet open
>   *
>   * options is a QDict of options to pass to the block drivers, or NULL for an
> @@ -904,7 +917,7 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *options)
>          return 0;
>      }
>  
> -    bs->backing_hd = bdrv_new("");
> +    bs->backing_hd = bdrv_new_int("", bs);
>      bdrv_get_full_backing_filename(bs, backing_filename,
>                                     sizeof(backing_filename));
>  
> @@ -990,7 +1003,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options,
>             instead of opening 'filename' directly */
>  
>          /* if there is a backing file, use it */
> -        bs1 = bdrv_new("");
> +        bs1 = bdrv_new_int("", bs);
>          ret = bdrv_open(bs1, filename, NULL, 0, drv);
>          if (ret < 0) {
>              bdrv_delete(bs1);
> @@ -1043,9 +1056,8 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options,
>      }
>  
>      extract_subqdict(options, &file_options, "file.");
> -
> -    ret = bdrv_file_open(&file, filename, file_options,
> -                         bdrv_open_flags(bs, flags));
> +    ret = bdrv_file_open_int(&file, filename, file_options,
> +                             bdrv_open_flags(bs, flags), bs);
>      if (ret < 0) {
>          goto fail;
>      }
> diff --git a/include/block/block_int.h b/include/block/block_int.h
> index ba52247..9c72b32 100644
> --- a/include/block/block_int.h
> +++ b/include/block/block_int.h
> @@ -245,6 +245,7 @@ struct BlockDriverState {
>  
>      BlockDriverState *backing_hd;
>      BlockDriverState *file;
> +    BlockDriverState *child;
>  
>      NotifierList close_notifiers;
>  
> 

  reply	other threads:[~2013-06-20 22:26 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-20 17:45 [Qemu-devel] [PATCH 00/12] RFC: add Spice block device Marc-André Lureau
2013-06-20 17:46 ` [Qemu-devel] [PATCH 01/12] include: add missing config-host.h include Marc-André Lureau
2013-06-20 17:46 ` [Qemu-devel] [PATCH 02/12] char: add qemu_chr_fe_event() Marc-André Lureau
2013-06-21  7:35   ` Gerd Hoffmann
2013-06-21  8:40     ` Marc-André Lureau
2013-06-20 17:46 ` [Qemu-devel] [PATCH 03/12] nbd: don't change socket block during negotiate Marc-André Lureau
2013-06-20 17:46 ` [Qemu-devel] [PATCH 04/12] Split nbd block client code Marc-André Lureau
2013-06-20 17:46 ` [Qemu-devel] [PATCH 05/12] nbd: pass export name as init argument Marc-André Lureau
2013-06-20 17:46 ` [Qemu-devel] [PATCH 06/12] nbd: make session_close() idempotent Marc-André Lureau
2013-06-20 17:46 ` [Qemu-devel] [PATCH 07/12] block: save the associated child in BlockDriverState Marc-André Lureau
2013-06-20 22:25   ` Paolo Bonzini [this message]
2013-06-21  8:36     ` Marc-André Lureau
2013-06-21 11:57       ` Paolo Bonzini
2013-06-21 13:30         ` Marc-André Lureau
2013-06-21 13:39           ` Paolo Bonzini
2013-06-20 17:46 ` [Qemu-devel] [PATCH 08/12] block: extract make_snapshot() from bdrv_open() Marc-André Lureau
2013-06-20 17:46 ` [Qemu-devel] [PATCH 09/12] block: add "snapshot.size" option to avoid extra bdrv_open() Marc-André Lureau
2013-06-20 17:46 ` [Qemu-devel] [PATCH 10/12] block: learn to open a driver with a given opaque Marc-André Lureau
2013-06-20 17:46 ` [Qemu-devel] [PATCH 11/12] block: allow to call bdrv_open() with an opaque Marc-André Lureau
2013-06-20 17:46 ` [Qemu-devel] [PATCH 12/12] block: add spice block device backend Marc-André Lureau

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=51C38171.3010806@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=marcandre.lureau@gmail.com \
    --cc=qemu-devel@nongnu.org \
    --cc=spice-devel@lists.freedesktop.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).