mirror of https://github.com/xemu-project/xemu.git
luks: implement .bdrv_measure()
Add qemu-img measure support in the "luks" block driver. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Message-Id: <20200221112522.1497712-3-stefanha@redhat.com> Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
6d49d3a859
commit
a9da6e49d8
|
@ -484,6 +484,67 @@ static int64_t block_crypto_getlength(BlockDriverState *bs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static BlockMeasureInfo *block_crypto_measure(QemuOpts *opts,
|
||||||
|
BlockDriverState *in_bs,
|
||||||
|
Error **errp)
|
||||||
|
{
|
||||||
|
g_autoptr(QCryptoBlockCreateOptions) create_opts = NULL;
|
||||||
|
Error *local_err = NULL;
|
||||||
|
BlockMeasureInfo *info;
|
||||||
|
uint64_t size;
|
||||||
|
size_t luks_payload_size;
|
||||||
|
QDict *cryptoopts;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Preallocation mode doesn't affect size requirements but we must consume
|
||||||
|
* the option.
|
||||||
|
*/
|
||||||
|
g_free(qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC));
|
||||||
|
|
||||||
|
size = qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0);
|
||||||
|
|
||||||
|
if (in_bs) {
|
||||||
|
int64_t ssize = bdrv_getlength(in_bs);
|
||||||
|
|
||||||
|
if (ssize < 0) {
|
||||||
|
error_setg_errno(&local_err, -ssize,
|
||||||
|
"Unable to get image virtual_size");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
size = ssize;
|
||||||
|
}
|
||||||
|
|
||||||
|
cryptoopts = qemu_opts_to_qdict_filtered(opts, NULL,
|
||||||
|
&block_crypto_create_opts_luks, true);
|
||||||
|
qdict_put_str(cryptoopts, "format", "luks");
|
||||||
|
create_opts = block_crypto_create_opts_init(cryptoopts, &local_err);
|
||||||
|
qobject_unref(cryptoopts);
|
||||||
|
if (!create_opts) {
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!qcrypto_block_calculate_payload_offset(create_opts, NULL,
|
||||||
|
&luks_payload_size,
|
||||||
|
&local_err)) {
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Unallocated blocks are still encrypted so allocation status makes no
|
||||||
|
* difference to the file size.
|
||||||
|
*/
|
||||||
|
info = g_new(BlockMeasureInfo, 1);
|
||||||
|
info->fully_allocated = luks_payload_size + size;
|
||||||
|
info->required = luks_payload_size + size;
|
||||||
|
return info;
|
||||||
|
|
||||||
|
err:
|
||||||
|
error_propagate(errp, local_err);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int block_crypto_probe_luks(const uint8_t *buf,
|
static int block_crypto_probe_luks(const uint8_t *buf,
|
||||||
int buf_size,
|
int buf_size,
|
||||||
const char *filename) {
|
const char *filename) {
|
||||||
|
@ -670,6 +731,7 @@ static BlockDriver bdrv_crypto_luks = {
|
||||||
.bdrv_co_preadv = block_crypto_co_preadv,
|
.bdrv_co_preadv = block_crypto_co_preadv,
|
||||||
.bdrv_co_pwritev = block_crypto_co_pwritev,
|
.bdrv_co_pwritev = block_crypto_co_pwritev,
|
||||||
.bdrv_getlength = block_crypto_getlength,
|
.bdrv_getlength = block_crypto_getlength,
|
||||||
|
.bdrv_measure = block_crypto_measure,
|
||||||
.bdrv_get_info = block_crypto_get_info_luks,
|
.bdrv_get_info = block_crypto_get_info_luks,
|
||||||
.bdrv_get_specific_info = block_crypto_get_specific_info_luks,
|
.bdrv_get_specific_info = block_crypto_get_specific_info_luks,
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue