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:
parent
30da9dd88a
commit
8ea1613d91
@ -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,
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user