On 2018-02-21 14:53, Kevin Wolf wrote: > This adds the .bdrv_co_create driver callback to sheepdog, which enables > image creation over QMP. > > Signed-off-by: Kevin Wolf > --- > qapi/block-core.json | 24 +++++- > block/sheepdog.c | 240 +++++++++++++++++++++++++++++++++++---------------- > 2 files changed, 189 insertions(+), 75 deletions(-) [...] > diff --git a/block/sheepdog.c b/block/sheepdog.c > index 22df2ba9d0..d45cf68ff2 100644 > --- a/block/sheepdog.c > +++ b/block/sheepdog.c [...] > @@ -1882,6 +1866,42 @@ out_with_err_set: > return ret; > } > > +static int sd_create_prealloc(BlockdevOptionsSheepdog *location, int64_t size, > + Error **errp) > +{ > + BlockDriverState *bs; > + Visitor *v; > + QObject *obj = NULL; > + QDict *qdict; > + Error *local_err = NULL; > + int ret; > + > + v = qobject_output_visitor_new(&obj); > + visit_type_BlockdevOptionsSheepdog(v, NULL, &location, &local_err); > + visit_free(v); > + > + if (local_err) { > + error_propagate(errp, local_err); > + qobject_decref(obj); > + return -EINVAL; > + } > + > + qdict = qobject_to_qdict(obj); > + qdict_flatten(qdict); > + > + bs = bdrv_open(NULL, NULL, qdict, BDRV_O_PROTOCOL | BDRV_O_RDWR, errp); Hu, nice, we can even get rid of the filename again. But I am wondering where "driver": "sheepdog" comes into qdict... Max > + if (bs == NULL) { > + ret = -EIO; > + goto fail; > + } > + > + ret = sd_prealloc(bs, 0, size, errp); > +fail: > + bdrv_unref(bs); > + QDECREF(qdict); > + return ret; > +} > + > static int parse_redundancy(BDRVSheepdogState *s, SheepdogRedundancy *opt) > { > struct SheepdogInode *inode = &s->inode;