Commit 8ea1613d authored by Maxim Levitsky's avatar Maxim Levitsky Committed by Max Reitz
Browse files

block/qcow2: implement blockdev-amend



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

Signed-off-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
Reviewed-by: default avatarDaniel P. Berrangé <berrange@redhat.com>
Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
Message-Id: <20200608094030.670121-14-mlevitsk@redhat.com>
Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
parent 30da9dd8
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
@@ -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,
+15 −1
Original line number Diff line number Diff line
@@ -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: