block/crypto: Simplify block_crypto_{open,create}_opts_init()
block_crypto_open_opts_init() and block_crypto_create_opts_init() contain a virtual visit of QCryptoBlockOptions and QCryptoBlockCreateOptions less member "format", respectively. Change their callers to put member "format" in the QDict, so they can use the generated visitors for these types instead. Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
37aec7d75e
commit
796d323945
@ -148,108 +148,36 @@ static QemuOptsList block_crypto_create_opts_luks = {
|
|||||||
|
|
||||||
|
|
||||||
QCryptoBlockOpenOptions *
|
QCryptoBlockOpenOptions *
|
||||||
block_crypto_open_opts_init(QCryptoBlockFormat format,
|
block_crypto_open_opts_init(QDict *opts, Error **errp)
|
||||||
QDict *opts,
|
|
||||||
Error **errp)
|
|
||||||
{
|
{
|
||||||
Visitor *v;
|
Visitor *v;
|
||||||
QCryptoBlockOpenOptions *ret = NULL;
|
QCryptoBlockOpenOptions *ret;
|
||||||
Error *local_err = NULL;
|
|
||||||
|
|
||||||
ret = g_new0(QCryptoBlockOpenOptions, 1);
|
v = qobject_input_visitor_new_flat_confused(opts, errp);
|
||||||
ret->format = format;
|
|
||||||
|
|
||||||
v = qobject_input_visitor_new_flat_confused(opts, &local_err);
|
|
||||||
if (!v) {
|
if (!v) {
|
||||||
goto out;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
visit_start_struct(v, NULL, NULL, 0, &local_err);
|
visit_type_QCryptoBlockOpenOptions(v, NULL, &ret, errp);
|
||||||
if (local_err) {
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (format) {
|
|
||||||
case Q_CRYPTO_BLOCK_FORMAT_LUKS:
|
|
||||||
visit_type_QCryptoBlockOptionsLUKS_members(
|
|
||||||
v, &ret->u.luks, &local_err);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Q_CRYPTO_BLOCK_FORMAT_QCOW:
|
|
||||||
visit_type_QCryptoBlockOptionsQCow_members(
|
|
||||||
v, &ret->u.qcow, &local_err);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
error_setg(&local_err, "Unsupported block format %d", format);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!local_err) {
|
|
||||||
visit_check_struct(v, &local_err);
|
|
||||||
}
|
|
||||||
|
|
||||||
visit_end_struct(v, NULL);
|
|
||||||
|
|
||||||
out:
|
|
||||||
if (local_err) {
|
|
||||||
error_propagate(errp, local_err);
|
|
||||||
qapi_free_QCryptoBlockOpenOptions(ret);
|
|
||||||
ret = NULL;
|
|
||||||
}
|
|
||||||
visit_free(v);
|
visit_free(v);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QCryptoBlockCreateOptions *
|
QCryptoBlockCreateOptions *
|
||||||
block_crypto_create_opts_init(QCryptoBlockFormat format,
|
block_crypto_create_opts_init(QDict *opts, Error **errp)
|
||||||
QDict *opts,
|
|
||||||
Error **errp)
|
|
||||||
{
|
{
|
||||||
Visitor *v;
|
Visitor *v;
|
||||||
QCryptoBlockCreateOptions *ret = NULL;
|
QCryptoBlockCreateOptions *ret;
|
||||||
Error *local_err = NULL;
|
|
||||||
|
|
||||||
ret = g_new0(QCryptoBlockCreateOptions, 1);
|
v = qobject_input_visitor_new_flat_confused(opts, errp);
|
||||||
ret->format = format;
|
|
||||||
|
|
||||||
v = qobject_input_visitor_new_flat_confused(opts, &local_err);
|
|
||||||
if (!v) {
|
if (!v) {
|
||||||
goto out;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
visit_start_struct(v, NULL, NULL, 0, &local_err);
|
visit_type_QCryptoBlockCreateOptions(v, NULL, &ret, errp);
|
||||||
if (local_err) {
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (format) {
|
|
||||||
case Q_CRYPTO_BLOCK_FORMAT_LUKS:
|
|
||||||
visit_type_QCryptoBlockCreateOptionsLUKS_members(
|
|
||||||
v, &ret->u.luks, &local_err);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Q_CRYPTO_BLOCK_FORMAT_QCOW:
|
|
||||||
visit_type_QCryptoBlockOptionsQCow_members(
|
|
||||||
v, &ret->u.qcow, &local_err);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
error_setg(&local_err, "Unsupported block format %d", format);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!local_err) {
|
|
||||||
visit_check_struct(v, &local_err);
|
|
||||||
}
|
|
||||||
|
|
||||||
visit_end_struct(v, NULL);
|
|
||||||
|
|
||||||
out:
|
|
||||||
if (local_err) {
|
|
||||||
error_propagate(errp, local_err);
|
|
||||||
qapi_free_QCryptoBlockCreateOptions(ret);
|
|
||||||
ret = NULL;
|
|
||||||
}
|
|
||||||
visit_free(v);
|
visit_free(v);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -287,8 +215,9 @@ static int block_crypto_open_generic(QCryptoBlockFormat format,
|
|||||||
}
|
}
|
||||||
|
|
||||||
cryptoopts = qemu_opts_to_qdict(opts, NULL);
|
cryptoopts = qemu_opts_to_qdict(opts, NULL);
|
||||||
|
qdict_put_str(cryptoopts, "format", QCryptoBlockFormat_str(format));
|
||||||
|
|
||||||
open_opts = block_crypto_open_opts_init(format, cryptoopts, errp);
|
open_opts = block_crypto_open_opts_init(cryptoopts, errp);
|
||||||
if (!open_opts) {
|
if (!open_opts) {
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
@ -612,8 +541,8 @@ static int coroutine_fn block_crypto_co_create_opts_luks(const char *filename,
|
|||||||
&block_crypto_create_opts_luks,
|
&block_crypto_create_opts_luks,
|
||||||
true);
|
true);
|
||||||
|
|
||||||
create_opts = block_crypto_create_opts_init(Q_CRYPTO_BLOCK_FORMAT_LUKS,
|
qdict_put_str(cryptoopts, "format", "luks");
|
||||||
cryptoopts, errp);
|
create_opts = block_crypto_create_opts_init(cryptoopts, errp);
|
||||||
if (!create_opts) {
|
if (!create_opts) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -89,13 +89,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
QCryptoBlockCreateOptions *
|
QCryptoBlockCreateOptions *
|
||||||
block_crypto_create_opts_init(QCryptoBlockFormat format,
|
block_crypto_create_opts_init(QDict *opts, Error **errp);
|
||||||
QDict *opts,
|
|
||||||
Error **errp);
|
|
||||||
|
|
||||||
QCryptoBlockOpenOptions *
|
QCryptoBlockOpenOptions *
|
||||||
block_crypto_open_opts_init(QCryptoBlockFormat format,
|
block_crypto_open_opts_init(QDict *opts, Error **errp);
|
||||||
QDict *opts,
|
|
||||||
Error **errp);
|
|
||||||
|
|
||||||
#endif /* BLOCK_CRYPTO_H__ */
|
#endif /* BLOCK_CRYPTO_H__ */
|
||||||
|
@ -203,9 +203,8 @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
|
|||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
qdict_del(encryptopts, "format");
|
qdict_put_str(encryptopts, "format", "qcow");
|
||||||
crypto_opts = block_crypto_open_opts_init(
|
crypto_opts = block_crypto_open_opts_init(encryptopts, errp);
|
||||||
Q_CRYPTO_BLOCK_FORMAT_QCOW, encryptopts, errp);
|
|
||||||
if (!crypto_opts) {
|
if (!crypto_opts) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -1040,9 +1040,8 @@ static int qcow2_update_options_prepare(BlockDriverState *bs,
|
|||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
qdict_del(encryptopts, "format");
|
qdict_put_str(encryptopts, "format", "qcow");
|
||||||
r->crypto_opts = block_crypto_open_opts_init(
|
r->crypto_opts = block_crypto_open_opts_init(encryptopts, errp);
|
||||||
Q_CRYPTO_BLOCK_FORMAT_QCOW, encryptopts, errp);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case QCOW_CRYPT_LUKS:
|
case QCOW_CRYPT_LUKS:
|
||||||
@ -1053,9 +1052,8 @@ static int qcow2_update_options_prepare(BlockDriverState *bs,
|
|||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
qdict_del(encryptopts, "format");
|
qdict_put_str(encryptopts, "format", "luks");
|
||||||
r->crypto_opts = block_crypto_open_opts_init(
|
r->crypto_opts = block_crypto_open_opts_init(encryptopts, errp);
|
||||||
Q_CRYPTO_BLOCK_FORMAT_LUKS, encryptopts, errp);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
Loading…
Reference in New Issue
Block a user