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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 = {
 | 
			
		||||
    .format_name        = "luks",
 | 
			
		||||
    .instance_size      = sizeof(BlockCrypto),
 | 
			
		||||
| 
						 | 
				
			
			@ -576,6 +623,8 @@ BlockDriver bdrv_crypto_luks = {
 | 
			
		|||
    .bdrv_co_readv      = block_crypto_co_readv,
 | 
			
		||||
    .bdrv_co_writev     = block_crypto_co_writev,
 | 
			
		||||
    .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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -85,7 +85,11 @@
 | 
			
		|||
{ 'union': 'ImageInfoSpecific',
 | 
			
		||||
  'data': {
 | 
			
		||||
      '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