mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 08:43:55 -06:00
block/amend: refactor qcow2 amend options
Some qcow2 create options can't be used for amend. Remove them from the qcow2 create options and add generic logic to detect such options in qemu-img Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> [mreitz: Dropped some iotests reference output hunks that became unnecessary thanks to "iotests: Make _filter_img_create more active"] Signed-off-by: Max Reitz <mreitz@redhat.com> Message-Id: <20200625125548.870061-12-mreitz@redhat.com>
This commit is contained in:
parent
df373fb0a3
commit
0b6786a9c1
12 changed files with 183 additions and 353 deletions
138
block/qcow2.c
138
block/qcow2.c
|
@ -3042,17 +3042,6 @@ static int qcow2_change_backing_file(BlockDriverState *bs,
|
|||
return qcow2_update_header(bs);
|
||||
}
|
||||
|
||||
static int qcow2_crypt_method_from_format(const char *encryptfmt)
|
||||
{
|
||||
if (g_str_equal(encryptfmt, "luks")) {
|
||||
return QCOW_CRYPT_LUKS;
|
||||
} else if (g_str_equal(encryptfmt, "aes")) {
|
||||
return QCOW_CRYPT_AES;
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static int qcow2_set_up_encryption(BlockDriverState *bs,
|
||||
QCryptoBlockCreateOptions *cryptoopts,
|
||||
Error **errp)
|
||||
|
@ -5361,9 +5350,6 @@ static int qcow2_amend_options(BlockDriverState *bs, QemuOpts *opts,
|
|||
bool lazy_refcounts = s->use_lazy_refcounts;
|
||||
bool data_file_raw = data_file_is_raw(bs);
|
||||
const char *compat = NULL;
|
||||
uint64_t cluster_size = s->cluster_size;
|
||||
bool encrypt;
|
||||
int encformat;
|
||||
int refcount_bits = s->refcount_bits;
|
||||
int ret;
|
||||
QemuOptDesc *desc = opts->list->desc;
|
||||
|
@ -5388,44 +5374,12 @@ static int qcow2_amend_options(BlockDriverState *bs, QemuOpts *opts,
|
|||
error_setg(errp, "Unknown compatibility level %s", compat);
|
||||
return -EINVAL;
|
||||
}
|
||||
} else if (!strcmp(desc->name, BLOCK_OPT_PREALLOC)) {
|
||||
error_setg(errp, "Cannot change preallocation mode");
|
||||
return -ENOTSUP;
|
||||
} else if (!strcmp(desc->name, BLOCK_OPT_SIZE)) {
|
||||
new_size = qemu_opt_get_size(opts, BLOCK_OPT_SIZE, 0);
|
||||
} else if (!strcmp(desc->name, BLOCK_OPT_BACKING_FILE)) {
|
||||
backing_file = qemu_opt_get(opts, BLOCK_OPT_BACKING_FILE);
|
||||
} else if (!strcmp(desc->name, BLOCK_OPT_BACKING_FMT)) {
|
||||
backing_format = qemu_opt_get(opts, BLOCK_OPT_BACKING_FMT);
|
||||
} else if (!strcmp(desc->name, BLOCK_OPT_ENCRYPT)) {
|
||||
encrypt = qemu_opt_get_bool(opts, BLOCK_OPT_ENCRYPT,
|
||||
!!s->crypto);
|
||||
|
||||
if (encrypt != !!s->crypto) {
|
||||
error_setg(errp,
|
||||
"Changing the encryption flag is not supported");
|
||||
return -ENOTSUP;
|
||||
}
|
||||
} else if (!strcmp(desc->name, BLOCK_OPT_ENCRYPT_FORMAT)) {
|
||||
encformat = qcow2_crypt_method_from_format(
|
||||
qemu_opt_get(opts, BLOCK_OPT_ENCRYPT_FORMAT));
|
||||
|
||||
if (encformat != s->crypt_method_header) {
|
||||
error_setg(errp,
|
||||
"Changing the encryption format is not supported");
|
||||
return -ENOTSUP;
|
||||
}
|
||||
} else if (g_str_has_prefix(desc->name, "encrypt.")) {
|
||||
error_setg(errp,
|
||||
"Changing the encryption parameters is not supported");
|
||||
return -ENOTSUP;
|
||||
} else if (!strcmp(desc->name, BLOCK_OPT_CLUSTER_SIZE)) {
|
||||
cluster_size = qemu_opt_get_size(opts, BLOCK_OPT_CLUSTER_SIZE,
|
||||
cluster_size);
|
||||
if (cluster_size != s->cluster_size) {
|
||||
error_setg(errp, "Changing the cluster size is not supported");
|
||||
return -ENOTSUP;
|
||||
}
|
||||
} else if (!strcmp(desc->name, BLOCK_OPT_LAZY_REFCOUNTS)) {
|
||||
lazy_refcounts = qemu_opt_get_bool(opts, BLOCK_OPT_LAZY_REFCOUNTS,
|
||||
lazy_refcounts);
|
||||
|
@ -5455,22 +5409,6 @@ static int qcow2_amend_options(BlockDriverState *bs, QemuOpts *opts,
|
|||
"images");
|
||||
return -EINVAL;
|
||||
}
|
||||
} else if (!strcmp(desc->name, BLOCK_OPT_COMPRESSION_TYPE)) {
|
||||
const char *ct_name =
|
||||
qemu_opt_get(opts, BLOCK_OPT_COMPRESSION_TYPE);
|
||||
int compression_type =
|
||||
qapi_enum_parse(&Qcow2CompressionType_lookup, ct_name, -1,
|
||||
NULL);
|
||||
if (compression_type == -1) {
|
||||
error_setg(errp, "Unknown compression type: %s", ct_name);
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
if (compression_type != s->compression_type) {
|
||||
error_setg(errp, "Changing the compression type "
|
||||
"is not supported");
|
||||
return -ENOTSUP;
|
||||
}
|
||||
} else {
|
||||
/* if this point is reached, this probably means a new option was
|
||||
* added without having it covered here */
|
||||
|
@ -5692,37 +5630,6 @@ void qcow2_signal_corruption(BlockDriverState *bs, bool fatal, int64_t offset,
|
|||
.help = "The external data file must stay valid " \
|
||||
"as a raw image" \
|
||||
}, \
|
||||
{ \
|
||||
.name = BLOCK_OPT_ENCRYPT, \
|
||||
.type = QEMU_OPT_BOOL, \
|
||||
.help = "Encrypt the image with format 'aes'. (Deprecated " \
|
||||
"in favor of " BLOCK_OPT_ENCRYPT_FORMAT "=aes)", \
|
||||
}, \
|
||||
{ \
|
||||
.name = BLOCK_OPT_ENCRYPT_FORMAT, \
|
||||
.type = QEMU_OPT_STRING, \
|
||||
.help = "Encrypt the image, format choices: 'aes', 'luks'", \
|
||||
}, \
|
||||
BLOCK_CRYPTO_OPT_DEF_KEY_SECRET("encrypt.", \
|
||||
"ID of secret providing qcow AES key or LUKS passphrase"), \
|
||||
BLOCK_CRYPTO_OPT_DEF_LUKS_CIPHER_ALG("encrypt."), \
|
||||
BLOCK_CRYPTO_OPT_DEF_LUKS_CIPHER_MODE("encrypt."), \
|
||||
BLOCK_CRYPTO_OPT_DEF_LUKS_IVGEN_ALG("encrypt."), \
|
||||
BLOCK_CRYPTO_OPT_DEF_LUKS_IVGEN_HASH_ALG("encrypt."), \
|
||||
BLOCK_CRYPTO_OPT_DEF_LUKS_HASH_ALG("encrypt."), \
|
||||
BLOCK_CRYPTO_OPT_DEF_LUKS_ITER_TIME("encrypt."), \
|
||||
{ \
|
||||
.name = BLOCK_OPT_CLUSTER_SIZE, \
|
||||
.type = QEMU_OPT_SIZE, \
|
||||
.help = "qcow2 cluster size", \
|
||||
.def_value_str = stringify(DEFAULT_CLUSTER_SIZE) \
|
||||
}, \
|
||||
{ \
|
||||
.name = BLOCK_OPT_PREALLOC, \
|
||||
.type = QEMU_OPT_STRING, \
|
||||
.help = "Preallocation mode (allowed values: off, " \
|
||||
"metadata, falloc, full)" \
|
||||
}, \
|
||||
{ \
|
||||
.name = BLOCK_OPT_LAZY_REFCOUNTS, \
|
||||
.type = QEMU_OPT_BOOL, \
|
||||
|
@ -5734,19 +5641,50 @@ void qcow2_signal_corruption(BlockDriverState *bs, bool fatal, int64_t offset,
|
|||
.type = QEMU_OPT_NUMBER, \
|
||||
.help = "Width of a reference count entry in bits", \
|
||||
.def_value_str = "16" \
|
||||
}, \
|
||||
{ \
|
||||
.name = BLOCK_OPT_COMPRESSION_TYPE, \
|
||||
.type = QEMU_OPT_STRING, \
|
||||
.help = "Compression method used for image cluster " \
|
||||
"compression", \
|
||||
.def_value_str = "zlib" \
|
||||
}
|
||||
|
||||
static QemuOptsList qcow2_create_opts = {
|
||||
.name = "qcow2-create-opts",
|
||||
.head = QTAILQ_HEAD_INITIALIZER(qcow2_create_opts.head),
|
||||
.desc = {
|
||||
{ \
|
||||
.name = BLOCK_OPT_ENCRYPT, \
|
||||
.type = QEMU_OPT_BOOL, \
|
||||
.help = "Encrypt the image with format 'aes'. (Deprecated " \
|
||||
"in favor of " BLOCK_OPT_ENCRYPT_FORMAT "=aes)", \
|
||||
}, \
|
||||
{ \
|
||||
.name = BLOCK_OPT_ENCRYPT_FORMAT, \
|
||||
.type = QEMU_OPT_STRING, \
|
||||
.help = "Encrypt the image, format choices: 'aes', 'luks'", \
|
||||
}, \
|
||||
BLOCK_CRYPTO_OPT_DEF_KEY_SECRET("encrypt.", \
|
||||
"ID of secret providing qcow AES key or LUKS passphrase"), \
|
||||
BLOCK_CRYPTO_OPT_DEF_LUKS_CIPHER_ALG("encrypt."), \
|
||||
BLOCK_CRYPTO_OPT_DEF_LUKS_CIPHER_MODE("encrypt."), \
|
||||
BLOCK_CRYPTO_OPT_DEF_LUKS_IVGEN_ALG("encrypt."), \
|
||||
BLOCK_CRYPTO_OPT_DEF_LUKS_IVGEN_HASH_ALG("encrypt."), \
|
||||
BLOCK_CRYPTO_OPT_DEF_LUKS_HASH_ALG("encrypt."), \
|
||||
BLOCK_CRYPTO_OPT_DEF_LUKS_ITER_TIME("encrypt."), \
|
||||
{ \
|
||||
.name = BLOCK_OPT_CLUSTER_SIZE, \
|
||||
.type = QEMU_OPT_SIZE, \
|
||||
.help = "qcow2 cluster size", \
|
||||
.def_value_str = stringify(DEFAULT_CLUSTER_SIZE) \
|
||||
}, \
|
||||
{ \
|
||||
.name = BLOCK_OPT_PREALLOC, \
|
||||
.type = QEMU_OPT_STRING, \
|
||||
.help = "Preallocation mode (allowed values: off, " \
|
||||
"metadata, falloc, full)" \
|
||||
}, \
|
||||
{ \
|
||||
.name = BLOCK_OPT_COMPRESSION_TYPE, \
|
||||
.type = QEMU_OPT_STRING, \
|
||||
.help = "Compression method used for image cluster " \
|
||||
"compression", \
|
||||
.def_value_str = "zlib" \
|
||||
},
|
||||
QCOW_COMMON_OPTIONS,
|
||||
{ /* end of list */ }
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue