From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51518) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UpnIq-0008DP-0x for qemu-devel@nongnu.org; Thu, 20 Jun 2013 18:26:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UpnIo-0006Fv-BE for qemu-devel@nongnu.org; Thu, 20 Jun 2013 18:26:03 -0400 Received: from mail-ea0-x236.google.com ([2a00:1450:4013:c01::236]:54862) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UpnIo-0006Fi-1z for qemu-devel@nongnu.org; Thu, 20 Jun 2013 18:26:02 -0400 Received: by mail-ea0-f182.google.com with SMTP id d10so4312497eaj.13 for ; Thu, 20 Jun 2013 15:26:01 -0700 (PDT) Sender: Paolo Bonzini Message-ID: <51C38171.3010806@redhat.com> Date: Fri, 21 Jun 2013 00:25:53 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1371750371-18491-1-git-send-email-marcandre.lureau@redhat.com> <1371750371-18491-8-git-send-email-marcandre.lureau@redhat.com> In-Reply-To: <1371750371-18491-8-git-send-email-marcandre.lureau@redhat.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH 07/12] block: save the associated child in BlockDriverState List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: =?UTF-8?B?TWFyYy1BbmRyw6kgTHVyZWF1?= Cc: spice-devel@lists.freedesktop.org, qemu-devel@nongnu.org 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 > --- > 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; > >