qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

block/crypto: implement blockdev-amend

Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Message-Id: <20200608094030.670121-13-mlevitsk@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>

authored by

Maxim Levitsky and committed by
Max Reitz
30da9dd8 ced914d0

+66 -20
+53 -19
block/crypto.c
··· 791 791 } 792 792 793 793 static int 794 - block_crypto_amend_options_luks(BlockDriverState *bs, 795 - QemuOpts *opts, 796 - BlockDriverAmendStatusCB *status_cb, 797 - void *cb_opaque, 798 - bool force, 799 - Error **errp) 794 + block_crypto_amend_options_generic_luks(BlockDriverState *bs, 795 + QCryptoBlockAmendOptions *amend_options, 796 + bool force, 797 + Error **errp) 800 798 { 801 799 BlockCrypto *crypto = bs->opaque; 802 - QDict *cryptoopts = NULL; 803 - QCryptoBlockAmendOptions *amend_options = NULL; 804 800 int ret; 805 801 806 802 assert(crypto); 807 803 assert(crypto->block); 804 + 805 + /* apply for exclusive read/write permissions to the underlying file*/ 808 806 crypto->updating_keys = true; 809 - 810 807 ret = bdrv_child_refresh_perms(bs, bs->file, errp); 811 - if (ret < 0) { 812 - goto cleanup; 813 - } 814 - 815 - cryptoopts = qemu_opts_to_qdict(opts, NULL); 816 - qdict_put_str(cryptoopts, "format", "luks"); 817 - amend_options = block_crypto_amend_opts_init(cryptoopts, errp); 818 - if (!amend_options) { 819 - ret = -EINVAL; 808 + if (ret) { 820 809 goto cleanup; 821 810 } 822 811 ··· 828 817 force, 829 818 errp); 830 819 cleanup: 820 + /* release exclusive read/write permissions to the underlying file*/ 831 821 crypto->updating_keys = false; 832 822 bdrv_child_refresh_perms(bs, bs->file, errp); 833 - qapi_free_QCryptoBlockAmendOptions(amend_options); 823 + return ret; 824 + } 825 + 826 + static int 827 + block_crypto_amend_options_luks(BlockDriverState *bs, 828 + QemuOpts *opts, 829 + BlockDriverAmendStatusCB *status_cb, 830 + void *cb_opaque, 831 + bool force, 832 + Error **errp) 833 + { 834 + BlockCrypto *crypto = bs->opaque; 835 + QDict *cryptoopts = NULL; 836 + QCryptoBlockAmendOptions *amend_options = NULL; 837 + int ret = -EINVAL; 838 + 839 + assert(crypto); 840 + assert(crypto->block); 841 + 842 + cryptoopts = qemu_opts_to_qdict(opts, NULL); 843 + qdict_put_str(cryptoopts, "format", "luks"); 844 + amend_options = block_crypto_amend_opts_init(cryptoopts, errp); 834 845 qobject_unref(cryptoopts); 846 + if (!amend_options) { 847 + goto cleanup; 848 + } 849 + ret = block_crypto_amend_options_generic_luks(bs, amend_options, 850 + force, errp); 851 + cleanup: 852 + qapi_free_QCryptoBlockAmendOptions(amend_options); 835 853 return ret; 836 854 } 837 855 856 + static int 857 + coroutine_fn block_crypto_co_amend_luks(BlockDriverState *bs, 858 + BlockdevAmendOptions *opts, 859 + bool force, 860 + Error **errp) 861 + { 862 + QCryptoBlockAmendOptions amend_opts; 863 + 864 + amend_opts = (QCryptoBlockAmendOptions) { 865 + .format = Q_CRYPTO_BLOCK_FORMAT_LUKS, 866 + .u.luks = *qapi_BlockdevAmendOptionsLUKS_base(&opts->u.luks), 867 + }; 868 + return block_crypto_amend_options_generic_luks(bs, &amend_opts, 869 + force, errp); 870 + } 838 871 839 872 static void 840 873 block_crypto_child_perms(BlockDriverState *bs, BdrvChild *c, ··· 910 943 .bdrv_get_info = block_crypto_get_info_luks, 911 944 .bdrv_get_specific_info = block_crypto_get_specific_info_luks, 912 945 .bdrv_amend_options = block_crypto_amend_options_luks, 946 + .bdrv_co_amend = block_crypto_co_amend_luks, 913 947 914 948 .is_format = true, 915 949
+13 -1
qapi/block-core.json
··· 4675 4675 'options': 'BlockdevCreateOptions' } } 4676 4676 4677 4677 ## 4678 + # @BlockdevAmendOptionsLUKS: 4679 + # 4680 + # Driver specific image amend options for LUKS. 4681 + # 4682 + # Since: 5.1 4683 + ## 4684 + { 'struct': 'BlockdevAmendOptionsLUKS', 4685 + 'base': 'QCryptoBlockAmendOptionsLUKS', 4686 + 'data': { } 4687 + } 4688 + 4689 + ## 4678 4690 # @BlockdevAmendOptions: 4679 4691 # 4680 4692 # Options for amending an image format ··· 4688 4700 'driver': 'BlockdevDriver' }, 4689 4701 'discriminator': 'driver', 4690 4702 'data': { 4691 - } } 4703 + 'luks': 'BlockdevAmendOptionsLUKS' } } 4692 4704 4693 4705 ## 4694 4706 # @x-blockdev-amend: