From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57339) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UzOGW-0004Fh-He for qemu-devel@nongnu.org; Wed, 17 Jul 2013 05:43:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UzOGU-0007wZ-95 for qemu-devel@nongnu.org; Wed, 17 Jul 2013 05:43:20 -0400 Received: from mx1.redhat.com ([209.132.183.28]:43566) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UzOGU-0007wV-0w for qemu-devel@nongnu.org; Wed, 17 Jul 2013 05:43:18 -0400 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r6H9hH0F007959 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 17 Jul 2013 05:43:17 -0400 From: Fam Zheng Date: Wed, 17 Jul 2013 17:42:15 +0800 Message-Id: <1374054136-28741-11-git-send-email-famz@redhat.com> In-Reply-To: <1374054136-28741-1-git-send-email-famz@redhat.com> References: <1374054136-28741-1-git-send-email-famz@redhat.com> Subject: [Qemu-devel] [PATCH v2 10/11] block: add option 'backing' to -drive options List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, famz@redhat.com, hbrock@redhat.com, rjones@redhat.com, imain@redhat.com, stefanha@redhat.com, pbonzini@redhat.com This option allows overriding backing hd of drive. If the target drive exists, it's referenced as the backing file and refcount incremented. Example: qemu-system-x86_64 -drive \ file.filename=foo.qcow2,if=none,id=foo \ -drive file=bar.qcow2,backing=foo Signed-off-by: Fam Zheng --- block.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/block.c b/block.c index 147a448..31fab07 100644 --- a/block.c +++ b/block.c @@ -1083,12 +1083,30 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options, /* If there is a backing file, use it */ if ((flags & BDRV_O_NO_BACKING) == 0) { - QDict *backing_options; - - extract_subqdict(options, &backing_options, "backing."); - ret = bdrv_open_backing_file(bs, backing_options); - if (ret < 0) { - goto close_and_fail; + const char *backing_drive; + backing_drive = qdict_get_try_str(options, "backing"); + if (backing_drive) { + bs->backing_hd = bdrv_find(backing_drive); + if (bs->backing_hd) { + bdrv_ref(bs->backing_hd, false); + pstrcpy(bs->backing_file, sizeof(bs->backing_file), + bs->backing_hd->filename); + pstrcpy(bs->backing_format, sizeof(bs->backing_format), + bs->backing_hd->drv->format_name); + } else { + qerror_report(ERROR_CLASS_DEVICE_NOT_FOUND, + "Can't find drive with name %s\n", backing_drive); + ret = -EINVAL; + goto close_and_fail; + } + qdict_del(options, "backing"); + } else { + QDict *backing_options; + extract_subqdict(options, &backing_options, "backing."); + ret = bdrv_open_backing_file(bs, backing_options); + if (ret < 0) { + goto close_and_fail; + } } } -- 1.8.3.2