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 <f...@redhat.com> --- 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