mirror of https://github.com/xemu-project/xemu.git
LUKS: support preallocation
preallocation=off and preallocation=metadata both allocate luks header only, and preallocation=falloc/full is passed to underlying file. Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1534951 Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> Message-id: 20190716161901.1430-1-mlevitsk@redhat.com Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
3fbd3405d2
commit
672de729a1
|
@ -74,6 +74,7 @@ static ssize_t block_crypto_read_func(QCryptoBlock *block,
|
||||||
struct BlockCryptoCreateData {
|
struct BlockCryptoCreateData {
|
||||||
BlockBackend *blk;
|
BlockBackend *blk;
|
||||||
uint64_t size;
|
uint64_t size;
|
||||||
|
PreallocMode prealloc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -112,7 +113,7 @@ static ssize_t block_crypto_init_func(QCryptoBlock *block,
|
||||||
* available to the guest, so we must take account of that
|
* available to the guest, so we must take account of that
|
||||||
* which will be used by the crypto header
|
* which will be used by the crypto header
|
||||||
*/
|
*/
|
||||||
return blk_truncate(data->blk, data->size + headerlen, PREALLOC_MODE_OFF,
|
return blk_truncate(data->blk, data->size + headerlen, data->prealloc,
|
||||||
errp);
|
errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,6 +252,7 @@ static int block_crypto_open_generic(QCryptoBlockFormat format,
|
||||||
static int block_crypto_co_create_generic(BlockDriverState *bs,
|
static int block_crypto_co_create_generic(BlockDriverState *bs,
|
||||||
int64_t size,
|
int64_t size,
|
||||||
QCryptoBlockCreateOptions *opts,
|
QCryptoBlockCreateOptions *opts,
|
||||||
|
PreallocMode prealloc,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -266,9 +268,14 @@ static int block_crypto_co_create_generic(BlockDriverState *bs,
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (prealloc == PREALLOC_MODE_METADATA) {
|
||||||
|
prealloc = PREALLOC_MODE_OFF;
|
||||||
|
}
|
||||||
|
|
||||||
data = (struct BlockCryptoCreateData) {
|
data = (struct BlockCryptoCreateData) {
|
||||||
.blk = blk,
|
.blk = blk,
|
||||||
.size = size,
|
.size = size,
|
||||||
|
.prealloc = prealloc,
|
||||||
};
|
};
|
||||||
|
|
||||||
crypto = qcrypto_block_create(opts, NULL,
|
crypto = qcrypto_block_create(opts, NULL,
|
||||||
|
@ -500,6 +507,7 @@ block_crypto_co_create_luks(BlockdevCreateOptions *create_options, Error **errp)
|
||||||
BlockdevCreateOptionsLUKS *luks_opts;
|
BlockdevCreateOptionsLUKS *luks_opts;
|
||||||
BlockDriverState *bs = NULL;
|
BlockDriverState *bs = NULL;
|
||||||
QCryptoBlockCreateOptions create_opts;
|
QCryptoBlockCreateOptions create_opts;
|
||||||
|
PreallocMode preallocation = PREALLOC_MODE_OFF;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
assert(create_options->driver == BLOCKDEV_DRIVER_LUKS);
|
assert(create_options->driver == BLOCKDEV_DRIVER_LUKS);
|
||||||
|
@ -515,8 +523,12 @@ block_crypto_co_create_luks(BlockdevCreateOptions *create_options, Error **errp)
|
||||||
.u.luks = *qapi_BlockdevCreateOptionsLUKS_base(luks_opts),
|
.u.luks = *qapi_BlockdevCreateOptionsLUKS_base(luks_opts),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (luks_opts->has_preallocation) {
|
||||||
|
preallocation = luks_opts->preallocation;
|
||||||
|
}
|
||||||
|
|
||||||
ret = block_crypto_co_create_generic(bs, luks_opts->size, &create_opts,
|
ret = block_crypto_co_create_generic(bs, luks_opts->size, &create_opts,
|
||||||
errp);
|
preallocation, errp);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -534,12 +546,24 @@ static int coroutine_fn block_crypto_co_create_opts_luks(const char *filename,
|
||||||
QCryptoBlockCreateOptions *create_opts = NULL;
|
QCryptoBlockCreateOptions *create_opts = NULL;
|
||||||
BlockDriverState *bs = NULL;
|
BlockDriverState *bs = NULL;
|
||||||
QDict *cryptoopts;
|
QDict *cryptoopts;
|
||||||
|
PreallocMode prealloc;
|
||||||
|
char *buf = NULL;
|
||||||
int64_t size;
|
int64_t size;
|
||||||
int ret;
|
int ret;
|
||||||
|
Error *local_err = NULL;
|
||||||
|
|
||||||
/* Parse options */
|
/* Parse options */
|
||||||
size = qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0);
|
size = qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0);
|
||||||
|
|
||||||
|
buf = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);
|
||||||
|
prealloc = qapi_enum_parse(&PreallocMode_lookup, buf,
|
||||||
|
PREALLOC_MODE_OFF, &local_err);
|
||||||
|
g_free(buf);
|
||||||
|
if (local_err) {
|
||||||
|
error_propagate(errp, local_err);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
cryptoopts = qemu_opts_to_qdict_filtered(opts, NULL,
|
cryptoopts = qemu_opts_to_qdict_filtered(opts, NULL,
|
||||||
&block_crypto_create_opts_luks,
|
&block_crypto_create_opts_luks,
|
||||||
true);
|
true);
|
||||||
|
@ -565,7 +589,7 @@ static int coroutine_fn block_crypto_co_create_opts_luks(const char *filename,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create format layer */
|
/* Create format layer */
|
||||||
ret = block_crypto_co_create_generic(bs, size, create_opts, errp);
|
ret = block_crypto_co_create_generic(bs, size, create_opts, prealloc, errp);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4212,13 +4212,17 @@
|
||||||
#
|
#
|
||||||
# @file Node to create the image format on
|
# @file Node to create the image format on
|
||||||
# @size Size of the virtual disk in bytes
|
# @size Size of the virtual disk in bytes
|
||||||
|
# @preallocation Preallocation mode for the new image
|
||||||
|
# (since: 4.2)
|
||||||
|
# (default: off; allowed values: off, metadata, falloc, full)
|
||||||
#
|
#
|
||||||
# Since: 2.12
|
# Since: 2.12
|
||||||
##
|
##
|
||||||
{ 'struct': 'BlockdevCreateOptionsLUKS',
|
{ 'struct': 'BlockdevCreateOptionsLUKS',
|
||||||
'base': 'QCryptoBlockCreateOptionsLUKS',
|
'base': 'QCryptoBlockCreateOptionsLUKS',
|
||||||
'data': { 'file': 'BlockdevRef',
|
'data': { 'file': 'BlockdevRef',
|
||||||
'size': 'size' } }
|
'size': 'size',
|
||||||
|
'*preallocation': 'PreallocMode' } }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @BlockdevCreateOptionsNfs:
|
# @BlockdevCreateOptionsNfs:
|
||||||
|
|
Loading…
Reference in New Issue