block/qcow2: implement blockdev-amend

Currently the implementation only supports amending the encryption
options, unlike the qemu-img version

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-14-mlevitsk@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
Maxim Levitsky 2020-06-25 14:55:47 +02:00 committed by Max Reitz
parent 30da9dd88a
commit 8ea1613d91
2 changed files with 54 additions and 1 deletions

View File

@ -5596,6 +5596,44 @@ static int qcow2_amend_options(BlockDriverState *bs, QemuOpts *opts,
return 0;
}
static int coroutine_fn qcow2_co_amend(BlockDriverState *bs,
BlockdevAmendOptions *opts,
bool force,
Error **errp)
{
BlockdevAmendOptionsQcow2 *qopts = &opts->u.qcow2;
BDRVQcow2State *s = bs->opaque;
int ret = 0;
if (qopts->has_encrypt) {
if (!s->crypto) {
error_setg(errp, "image is not encrypted, can't amend");
return -EOPNOTSUPP;
}
if (qopts->encrypt->format != Q_CRYPTO_BLOCK_FORMAT_LUKS) {
error_setg(errp,
"Amend can't be used to change the qcow2 encryption format");
return -EOPNOTSUPP;
}
if (s->crypt_method_header != QCOW_CRYPT_LUKS) {
error_setg(errp,
"Only LUKS encryption options can be amended for qcow2 with blockdev-amend");
return -EOPNOTSUPP;
}
ret = qcrypto_block_amend_options(s->crypto,
qcow2_crypto_hdr_read_func,
qcow2_crypto_hdr_write_func,
bs,
qopts->encrypt,
force,
errp);
}
return ret;
}
/*
* If offset or size are negative, respectively, they will not be included in
* the BLOCK_IMAGE_CORRUPTED event emitted.
@ -5813,6 +5851,7 @@ BlockDriver bdrv_qcow2 = {
.mutable_opts = mutable_opts,
.bdrv_co_check = qcow2_co_check,
.bdrv_amend_options = qcow2_amend_options,
.bdrv_co_amend = qcow2_co_amend,
.bdrv_detach_aio_context = qcow2_detach_aio_context,
.bdrv_attach_aio_context = qcow2_attach_aio_context,

View File

@ -4686,6 +4686,19 @@
'data': { }
}
##
# @BlockdevAmendOptionsQcow2:
#
# Driver specific image amend options for qcow2.
# For now, only encryption options can be amended
#
# @encrypt Encryption options to be amended
#
# Since: 5.1
##
{ 'struct': 'BlockdevAmendOptionsQcow2',
'data': { '*encrypt': 'QCryptoBlockAmendOptions' } }
##
# @BlockdevAmendOptions:
#
@ -4700,7 +4713,8 @@
'driver': 'BlockdevDriver' },
'discriminator': 'driver',
'data': {
'luks': 'BlockdevAmendOptionsLUKS' } }
'luks': 'BlockdevAmendOptionsLUKS',
'qcow2': 'BlockdevAmendOptionsQcow2' } }
##
# @x-blockdev-amend: