The Wednesday 29 Jan 2014 à 13:07:34 (+0800), Fam Zheng wrote : > Now it's safe to allow reference for backing_hd in the interface. > > Signed-off-by: Fam Zheng <f...@redhat.com> > --- > block.c | 26 ++++++++++++++++++++++++-- > 1 file changed, 24 insertions(+), 2 deletions(-) > > diff --git a/block.c b/block.c > index 4e3b393..9d57223 100644 > --- a/block.c > +++ b/block.c > @@ -1392,12 +1392,34 @@ 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; > + const char *backing_name; > + BlockDriverState *backing_hd; > > + backing_name = qdict_get_try_str(options, "backing"); > qdict_extract_subqdict(options, &backing_options, "backing."); > - ret = bdrv_open_backing_file(bs, backing_options, &local_err); > - if (ret < 0) { > + > + if (backing_name && qdict_size(backing_options)) { > + error_setg(&local_err, > + "Option \"backing\" and \"backing.*\" cannot be " > + "used together"); > + ret = -EINVAL; > goto close_and_fail; > } > + if (backing_name) { > + backing_hd = bdrv_find(backing_name);
Is backing_name a reference ? If so it would be nice if backing_name could refer to a bs by id or or an element of the graph by node-name. I posted a series which relax bdrv_lookup_bs rules to do so. Maybe this could be done after merge in another patch. > + if (!backing_hd) { > + error_set(&local_err, QERR_DEVICE_NOT_FOUND, backing_name); > + ret = -ENOENT; > + goto close_and_fail; > + } > + qdict_del(options, "backing"); > + bdrv_set_backing_hd(bs, backing_hd); > + } else { > + ret = bdrv_open_backing_file(bs, backing_options, &local_err); > + if (ret < 0) { > + goto close_and_fail; > + } > + } > } > > /* Check if any unknown options were used */ > -- > 1.8.5.3 > >