On Fri, Mar 09, 2018 at 06:27:10PM +0100, Kevin Wolf wrote: > This adds the .bdrv_co_create driver callback to luks, which enables > image creation over QMP. > > Signed-off-by: Kevin Wolf <kw...@redhat.com> > --- > qapi/block-core.json | 17 ++++++++++++++++- > block/crypto.c | 34 ++++++++++++++++++++++++++++++++++ > 2 files changed, 50 insertions(+), 1 deletion(-) > > diff --git a/qapi/block-core.json b/qapi/block-core.json > index 524d51567a..07039bfe9c 100644 > --- a/qapi/block-core.json > +++ b/qapi/block-core.json > @@ -3452,6 +3452,21 @@ > '*preallocation': 'PreallocMode' } } > > ## > +# @BlockdevCreateOptionsLUKS: > +# > +# Driver specific image creation options for LUKS. > +# > +# @file Node to create the image format on > +# @size Size of the virtual disk in bytes > +# > +# Since: 2.12 > +## > +{ 'struct': 'BlockdevCreateOptionsLUKS', > + 'data': { 'file': 'BlockdevRef', > + 'qcrypto': 'QCryptoBlockCreateOptionsLUKS', > + 'size': 'size' } }
s/qcrypto/crypto/ in this field. I do wonder about whether instead of embedding QCryptoBlockCreateOptionsLUKS as a field, we could instead use QCryptoBlockCreateOptionsLUKS as the base struct and just inherit from it to add file/size. I'm not really fussed, but I wonder if you/Eric have any thoughts on the pros or cons of inheritance vs embedding in this case. > + > +## > # @BlockdevCreateOptionsNfs: > # > # Driver specific image creation options for NFS. > @@ -3643,7 +3658,7 @@ > 'http': 'BlockdevCreateNotSupported', > 'https': 'BlockdevCreateNotSupported', > 'iscsi': 'BlockdevCreateNotSupported', > - 'luks': 'BlockdevCreateNotSupported', > + 'luks': 'BlockdevCreateOptionsLUKS', > 'nbd': 'BlockdevCreateNotSupported', > 'nfs': 'BlockdevCreateOptionsNfs', > 'null-aio': 'BlockdevCreateNotSupported', > diff --git a/block/crypto.c b/block/crypto.c > index b0a4cb3388..2035f9ab13 100644 > --- a/block/crypto.c > +++ b/block/crypto.c > @@ -543,6 +543,39 @@ static int block_crypto_open_luks(BlockDriverState *bs, > bs, options, flags, errp); > } > > +static int coroutine_fn > +block_crypto_co_create_luks(BlockdevCreateOptions *create_options, Error > **errp) > +{ > + BlockdevCreateOptionsLUKS *luks_opts; > + BlockDriverState *bs = NULL; > + QCryptoBlockCreateOptions create_opts; > + int ret; > + > + assert(create_options->driver == BLOCKDEV_DRIVER_LUKS); > + luks_opts = &create_options->u.luks; > + > + bs = bdrv_open_blockdev_ref(luks_opts->file, errp); > + if (bs == NULL) { > + return -EIO; > + } > + > + create_opts = (QCryptoBlockCreateOptions) { > + .format = Q_CRYPTO_BLOCK_FORMAT_LUKS, > + .u.luks = *luks_opts->qcrypto, > + }; > + > + ret = block_crypto_co_create_generic(bs, luks_opts->size, &create_opts, > + errp); > + if (ret < 0) { > + goto fail; > + } > + > + ret = 0; > +fail: > + bdrv_unref(bs); > + return ret; > +} > + > static int coroutine_fn block_crypto_co_create_opts_luks(const char > *filename, > QemuOpts *opts, > Error **errp) > @@ -647,6 +680,7 @@ BlockDriver bdrv_crypto_luks = { > .bdrv_open = block_crypto_open_luks, > .bdrv_close = block_crypto_close, > .bdrv_child_perm = bdrv_format_default_perms, > + .bdrv_co_create = block_crypto_co_create_luks, > .bdrv_co_create_opts = block_crypto_co_create_opts_luks, > .bdrv_truncate = block_crypto_truncate, > .create_opts = &block_crypto_create_opts_luks, > -- > 2.13.6 > Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|