From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36481) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VrZDU-0005gy-VS for qemu-devel@nongnu.org; Fri, 13 Dec 2013 15:20:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VrZDN-00077x-Ib for qemu-devel@nongnu.org; Fri, 13 Dec 2013 15:20:08 -0500 Received: from mx1.redhat.com ([209.132.183.28]:1379) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VrZDN-00075c-7X for qemu-devel@nongnu.org; Fri, 13 Dec 2013 15:20:01 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id rBDKK083000542 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 13 Dec 2013 15:20:00 -0500 Date: Fri, 13 Dec 2013 21:19:58 +0100 From: Kevin Wolf Message-ID: <20131213201958.GZ3916@dhcp-200-207.str.redhat.com> References: <1386954633-28905-1-git-send-email-mreitz@redhat.com> <1386954633-28905-13-git-send-email-mreitz@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1386954633-28905-13-git-send-email-mreitz@redhat.com> Subject: Re: [Qemu-devel] [PATCH v5 12/22] block: Allow recursive "file"s List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Max Reitz Cc: Fam Zheng , qemu-devel@nongnu.org, Stefan Hajnoczi Am 13.12.2013 um 18:10 hat Max Reitz geschrieben: > It should be possible to use a format as a driver for a file which in > turn requires another file, i.e., nesting file formats. > > Signed-off-by: Max Reitz Hm, does this do what I think it does? $ ./qemu-img convert -O qcow2 /home/kwolf/images/hd.img /tmp/hd.qcow2 $ ./qemu-img convert -f raw -O qcow2 /tmp/hd.qcow2 /tmp/hd.qcow2.qcow2 $ x86_64-softmmu/qemu-system-x86_64 -drive driver=qcow2,file.driver=qcow2,file.file.driver=file,file.file.filename=/tmp/hd.qcow2.qcow2 I can't decide whether this is awesomeness or insanity, but in any case it works with this patch. :-) Worth a qemu-iotests case, I think. > block.c | 17 ++++++++++++----- > 1 file changed, 12 insertions(+), 5 deletions(-) > > diff --git a/block.c b/block.c > index 9659eb5..9222669 100644 > --- a/block.c > +++ b/block.c > @@ -948,14 +948,19 @@ int bdrv_file_open(BlockDriverState **pbs, const char *filename, > goto fail; > } > > - ret = bdrv_open_common(bs, NULL, options, flags, drv, &local_err); > + if (!drv->bdrv_file_open) { > + ret = bdrv_open(bs, filename, options, flags, drv, &local_err); > + options = NULL; > + } else { > + ret = bdrv_open_common(bs, NULL, options, flags, drv, &local_err); > + } > if (ret < 0) { > error_propagate(errp, local_err); > goto fail; > } > > /* Check if any unknown options were used */ > - if (qdict_size(options) != 0) { > + if (options && (qdict_size(options) != 0)) { > const QDictEntry *entry = qdict_first(options); > error_setg(errp, "Block protocol '%s' doesn't support the option '%s'", > drv->format_name, entry->key); > @@ -970,10 +975,12 @@ int bdrv_file_open(BlockDriverState **pbs, const char *filename, > > fail: > QDECREF(options); > - if (!bs->drv) { > - QDECREF(bs->options); > + if (bs) { > + if (!bs->drv) { > + QDECREF(bs->options); > + } > + bdrv_unref(bs); > } > - bdrv_unref(bs); > return ret; > } Not sure why this hunk is needed, but anyway: Reviewed-by: Kevin Wolf