block: export LUKS specific data to qemu-img info
The qemu-img info command has the ability to expose format specific metadata about volumes. Wire up this facility for the LUKS driver to report on cipher configuration and key slot usage. $ qemu-img info ~/VirtualMachines/demo.luks image: /home/berrange/VirtualMachines/demo.luks file format: luks virtual size: 98M (102760448 bytes) disk size: 100M encrypted: yes Format specific information: ivgen alg: plain64 hash alg: sha1 cipher alg: aes-128 uuid: 6ddee74b-3a22-408c-8909-6789d4fa2594 cipher mode: xts slots: [0]: active: true iters: 572706 key offset: 4096 stripes: 4000 [1]: active: false key offset: 135168 [2]: active: false key offset: 266240 [3]: active: false key offset: 397312 [4]: active: false key offset: 528384 [5]: active: false key offset: 659456 [6]: active: false key offset: 790528 [7]: active: false key offset: 921600 payload offset: 2097152 master key iters: 142375 One somewhat undesirable artifact is that the data fields are printed out in (apparently) random order. This will be addressed later by changing the way the block layer pretty-prints the image specific data. Signed-off-by: Daniel P. Berrange <berrange@redhat.com> Message-id: 1469192015-16487-3-git-send-email-berrange@redhat.com Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
40c8502822
commit
c7c4cf498f
@ -563,6 +563,53 @@ static int block_crypto_create_luks(const char *filename,
|
|||||||
filename, opts, errp);
|
filename, opts, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int block_crypto_get_info_luks(BlockDriverState *bs,
|
||||||
|
BlockDriverInfo *bdi)
|
||||||
|
{
|
||||||
|
BlockDriverInfo subbdi;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = bdrv_get_info(bs->file->bs, &subbdi);
|
||||||
|
if (ret != 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bdi->unallocated_blocks_are_zero = false;
|
||||||
|
bdi->can_write_zeroes_with_unmap = false;
|
||||||
|
bdi->cluster_size = subbdi.cluster_size;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ImageInfoSpecific *
|
||||||
|
block_crypto_get_specific_info_luks(BlockDriverState *bs)
|
||||||
|
{
|
||||||
|
BlockCrypto *crypto = bs->opaque;
|
||||||
|
ImageInfoSpecific *spec_info;
|
||||||
|
QCryptoBlockInfo *info;
|
||||||
|
|
||||||
|
info = qcrypto_block_get_info(crypto->block, NULL);
|
||||||
|
if (!info) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (info->format != Q_CRYPTO_BLOCK_FORMAT_LUKS) {
|
||||||
|
qapi_free_QCryptoBlockInfo(info);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
spec_info = g_new(ImageInfoSpecific, 1);
|
||||||
|
spec_info->type = IMAGE_INFO_SPECIFIC_KIND_LUKS;
|
||||||
|
spec_info->u.luks.data = g_new(QCryptoBlockInfoLUKS, 1);
|
||||||
|
*spec_info->u.luks.data = info->u.luks;
|
||||||
|
|
||||||
|
/* Blank out pointers we've just stolen to avoid double free */
|
||||||
|
memset(&info->u.luks, 0, sizeof(info->u.luks));
|
||||||
|
|
||||||
|
qapi_free_QCryptoBlockInfo(info);
|
||||||
|
|
||||||
|
return spec_info;
|
||||||
|
}
|
||||||
|
|
||||||
BlockDriver bdrv_crypto_luks = {
|
BlockDriver bdrv_crypto_luks = {
|
||||||
.format_name = "luks",
|
.format_name = "luks",
|
||||||
.instance_size = sizeof(BlockCrypto),
|
.instance_size = sizeof(BlockCrypto),
|
||||||
@ -576,6 +623,8 @@ BlockDriver bdrv_crypto_luks = {
|
|||||||
.bdrv_co_readv = block_crypto_co_readv,
|
.bdrv_co_readv = block_crypto_co_readv,
|
||||||
.bdrv_co_writev = block_crypto_co_writev,
|
.bdrv_co_writev = block_crypto_co_writev,
|
||||||
.bdrv_getlength = block_crypto_getlength,
|
.bdrv_getlength = block_crypto_getlength,
|
||||||
|
.bdrv_get_info = block_crypto_get_info_luks,
|
||||||
|
.bdrv_get_specific_info = block_crypto_get_specific_info_luks,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void block_crypto_init(void)
|
static void block_crypto_init(void)
|
||||||
|
@ -85,7 +85,11 @@
|
|||||||
{ 'union': 'ImageInfoSpecific',
|
{ 'union': 'ImageInfoSpecific',
|
||||||
'data': {
|
'data': {
|
||||||
'qcow2': 'ImageInfoSpecificQCow2',
|
'qcow2': 'ImageInfoSpecificQCow2',
|
||||||
'vmdk': 'ImageInfoSpecificVmdk'
|
'vmdk': 'ImageInfoSpecificVmdk',
|
||||||
|
# If we need to add block driver specific parameters for
|
||||||
|
# LUKS in future, then we'll subclass QCryptoBlockInfoLUKS
|
||||||
|
# to define a ImageInfoSpecificLUKS
|
||||||
|
'luks': 'QCryptoBlockInfoLUKS'
|
||||||
} }
|
} }
|
||||||
|
|
||||||
##
|
##
|
||||||
|
Loading…
Reference in New Issue
Block a user