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 <mre...@redhat.com> --- 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; } -- 1.8.5.1