mirror of https://github.com/xemu-project/xemu.git
block/crypto: implement blockdev-amend
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Message-Id: <20200608094030.670121-13-mlevitsk@redhat.com> Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
ced914d0ab
commit
30da9dd88a
|
@ -791,32 +791,21 @@ block_crypto_get_specific_info_luks(BlockDriverState *bs, Error **errp)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
block_crypto_amend_options_luks(BlockDriverState *bs,
|
block_crypto_amend_options_generic_luks(BlockDriverState *bs,
|
||||||
QemuOpts *opts,
|
QCryptoBlockAmendOptions *amend_options,
|
||||||
BlockDriverAmendStatusCB *status_cb,
|
bool force,
|
||||||
void *cb_opaque,
|
Error **errp)
|
||||||
bool force,
|
|
||||||
Error **errp)
|
|
||||||
{
|
{
|
||||||
BlockCrypto *crypto = bs->opaque;
|
BlockCrypto *crypto = bs->opaque;
|
||||||
QDict *cryptoopts = NULL;
|
|
||||||
QCryptoBlockAmendOptions *amend_options = NULL;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
assert(crypto);
|
assert(crypto);
|
||||||
assert(crypto->block);
|
assert(crypto->block);
|
||||||
|
|
||||||
|
/* apply for exclusive read/write permissions to the underlying file*/
|
||||||
crypto->updating_keys = true;
|
crypto->updating_keys = true;
|
||||||
|
|
||||||
ret = bdrv_child_refresh_perms(bs, bs->file, errp);
|
ret = bdrv_child_refresh_perms(bs, bs->file, errp);
|
||||||
if (ret < 0) {
|
if (ret) {
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
cryptoopts = qemu_opts_to_qdict(opts, NULL);
|
|
||||||
qdict_put_str(cryptoopts, "format", "luks");
|
|
||||||
amend_options = block_crypto_amend_opts_init(cryptoopts, errp);
|
|
||||||
if (!amend_options) {
|
|
||||||
ret = -EINVAL;
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -828,13 +817,57 @@ block_crypto_amend_options_luks(BlockDriverState *bs,
|
||||||
force,
|
force,
|
||||||
errp);
|
errp);
|
||||||
cleanup:
|
cleanup:
|
||||||
|
/* release exclusive read/write permissions to the underlying file*/
|
||||||
crypto->updating_keys = false;
|
crypto->updating_keys = false;
|
||||||
bdrv_child_refresh_perms(bs, bs->file, errp);
|
bdrv_child_refresh_perms(bs, bs->file, errp);
|
||||||
qapi_free_QCryptoBlockAmendOptions(amend_options);
|
|
||||||
qobject_unref(cryptoopts);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
block_crypto_amend_options_luks(BlockDriverState *bs,
|
||||||
|
QemuOpts *opts,
|
||||||
|
BlockDriverAmendStatusCB *status_cb,
|
||||||
|
void *cb_opaque,
|
||||||
|
bool force,
|
||||||
|
Error **errp)
|
||||||
|
{
|
||||||
|
BlockCrypto *crypto = bs->opaque;
|
||||||
|
QDict *cryptoopts = NULL;
|
||||||
|
QCryptoBlockAmendOptions *amend_options = NULL;
|
||||||
|
int ret = -EINVAL;
|
||||||
|
|
||||||
|
assert(crypto);
|
||||||
|
assert(crypto->block);
|
||||||
|
|
||||||
|
cryptoopts = qemu_opts_to_qdict(opts, NULL);
|
||||||
|
qdict_put_str(cryptoopts, "format", "luks");
|
||||||
|
amend_options = block_crypto_amend_opts_init(cryptoopts, errp);
|
||||||
|
qobject_unref(cryptoopts);
|
||||||
|
if (!amend_options) {
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
ret = block_crypto_amend_options_generic_luks(bs, amend_options,
|
||||||
|
force, errp);
|
||||||
|
cleanup:
|
||||||
|
qapi_free_QCryptoBlockAmendOptions(amend_options);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
coroutine_fn block_crypto_co_amend_luks(BlockDriverState *bs,
|
||||||
|
BlockdevAmendOptions *opts,
|
||||||
|
bool force,
|
||||||
|
Error **errp)
|
||||||
|
{
|
||||||
|
QCryptoBlockAmendOptions amend_opts;
|
||||||
|
|
||||||
|
amend_opts = (QCryptoBlockAmendOptions) {
|
||||||
|
.format = Q_CRYPTO_BLOCK_FORMAT_LUKS,
|
||||||
|
.u.luks = *qapi_BlockdevAmendOptionsLUKS_base(&opts->u.luks),
|
||||||
|
};
|
||||||
|
return block_crypto_amend_options_generic_luks(bs, &amend_opts,
|
||||||
|
force, errp);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
block_crypto_child_perms(BlockDriverState *bs, BdrvChild *c,
|
block_crypto_child_perms(BlockDriverState *bs, BdrvChild *c,
|
||||||
|
@ -910,6 +943,7 @@ static BlockDriver bdrv_crypto_luks = {
|
||||||
.bdrv_get_info = block_crypto_get_info_luks,
|
.bdrv_get_info = block_crypto_get_info_luks,
|
||||||
.bdrv_get_specific_info = block_crypto_get_specific_info_luks,
|
.bdrv_get_specific_info = block_crypto_get_specific_info_luks,
|
||||||
.bdrv_amend_options = block_crypto_amend_options_luks,
|
.bdrv_amend_options = block_crypto_amend_options_luks,
|
||||||
|
.bdrv_co_amend = block_crypto_co_amend_luks,
|
||||||
|
|
||||||
.is_format = true,
|
.is_format = true,
|
||||||
|
|
||||||
|
|
|
@ -4674,6 +4674,18 @@
|
||||||
'data': { 'job-id': 'str',
|
'data': { 'job-id': 'str',
|
||||||
'options': 'BlockdevCreateOptions' } }
|
'options': 'BlockdevCreateOptions' } }
|
||||||
|
|
||||||
|
##
|
||||||
|
# @BlockdevAmendOptionsLUKS:
|
||||||
|
#
|
||||||
|
# Driver specific image amend options for LUKS.
|
||||||
|
#
|
||||||
|
# Since: 5.1
|
||||||
|
##
|
||||||
|
{ 'struct': 'BlockdevAmendOptionsLUKS',
|
||||||
|
'base': 'QCryptoBlockAmendOptionsLUKS',
|
||||||
|
'data': { }
|
||||||
|
}
|
||||||
|
|
||||||
##
|
##
|
||||||
# @BlockdevAmendOptions:
|
# @BlockdevAmendOptions:
|
||||||
#
|
#
|
||||||
|
@ -4688,7 +4700,7 @@
|
||||||
'driver': 'BlockdevDriver' },
|
'driver': 'BlockdevDriver' },
|
||||||
'discriminator': 'driver',
|
'discriminator': 'driver',
|
||||||
'data': {
|
'data': {
|
||||||
} }
|
'luks': 'BlockdevAmendOptionsLUKS' } }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @x-blockdev-amend:
|
# @x-blockdev-amend:
|
||||||
|
|
Loading…
Reference in New Issue