[{"id":1761097,"web_url":"http://patchwork.ozlabs.org/comment/1761097/","msgid":"<3867f025-5d0b-5bed-d47f-a91c706cd3aa@redhat.com>","list_archive_url":null,"date":"2017-08-31T15:08:00","subject":"Re: [Qemu-devel] [PATCH v2 3/4] block: convert crypto driver to\n\tbdrv_co_preadv|pwritev","submitter":{"id":6591,"url":"http://patchwork.ozlabs.org/api/people/6591/","name":"Eric Blake","email":"eblake@redhat.com"},"content":"On 08/31/2017 06:05 AM, Daniel P. Berrange wrote:\n> Make the crypto driver implement the bdrv_co_preadv|pwritev\n> callbacks,  and also use bdrv_co_preadv|pwritev for I/O\n> with the protocol driver beneath.\n> \n> Signed-off-by: Daniel P. Berrange <berrange@redhat.com>\n> ---\n>  block/crypto.c | 103 +++++++++++++++++++++++++++++----------------------------\n>  1 file changed, 53 insertions(+), 50 deletions(-)\n> \n\n>  static coroutine_fn int\n> -block_crypto_co_readv(BlockDriverState *bs, int64_t sector_num,\n> -                      int remaining_sectors, QEMUIOVector *qiov)\n> +block_crypto_co_preadv(BlockDriverState *bs, uint64_t offset, uint64_t bytes,\n> +                       QEMUIOVector *qiov, int flags)\n\n>  {\n>      BlockCrypto *crypto = bs->opaque;\n> -    int cur_nr_sectors; /* number of sectors in current iteration */\n> +    uint64_t cur_bytes; /* number of bytes in current iteration */\n>      uint64_t bytes_done = 0;\n>      uint8_t *cipher_data = NULL;\n>      QEMUIOVector hd_qiov;\n>      int ret = 0;\n> -    size_t payload_offset =\n> -        qcrypto_block_get_payload_offset(crypto->block) / BDRV_SECTOR_SIZE;\n> +    size_t payload_offset = qcrypto_block_get_payload_offset(crypto->block);\n\nPre-existing: is size_t the right type, or can we overflow a 64-bit\noffset on a 32-bit host?\n\n> +    uint64_t sector_num = offset / BDRV_SECTOR_SIZE;\n> +\n> +    assert((offset % BDRV_SECTOR_SIZE) == 0);\n> +    assert((bytes % BDRV_SECTOR_SIZE) == 0);\n\nThe osdep.h macros might be nicer than open-coding; furthermore, if\ndesired, you could shorten to:\n\nassert(QEMU_IS_ALIGNED(offset | bytes, BDRV_SECTOR_SIZE));\n\n\n>  \n>  static coroutine_fn int\n> -block_crypto_co_writev(BlockDriverState *bs, int64_t sector_num,\n> -                       int remaining_sectors, QEMUIOVector *qiov)\n> +block_crypto_co_pwritev(BlockDriverState *bs, uint64_t offset, uint64_t bytes,\n> +                        QEMUIOVector *qiov, int flags)\n>  {\n\nHmm - you don't set supported_write_flags.  But presumably, if the\nunderlying BDS supports BDRV_REQUEST_FUA, then crypto can likewise\nsupport that flag by passing it through to the underlying device after\nencryption.\n\n>      BlockCrypto *crypto = bs->opaque;\n> -    int cur_nr_sectors; /* number of sectors in current iteration */\n> +    uint64_t cur_bytes; /* number of bytes in current iteration */\n>      uint64_t bytes_done = 0;\n>      uint8_t *cipher_data = NULL;\n>      QEMUIOVector hd_qiov;\n>      int ret = 0;\n> -    size_t payload_offset =\n> -        qcrypto_block_get_payload_offset(crypto->block) / BDRV_SECTOR_SIZE;\n> +    size_t payload_offset = qcrypto_block_get_payload_offset(crypto->block);\n> +    uint64_t sector_num = offset / BDRV_SECTOR_SIZE;\n> +\n> +    assert((offset % BDRV_SECTOR_SIZE) == 0);\n> +    assert((bytes % BDRV_SECTOR_SIZE) == 0);\n\nSame comment as for read.\n\n> @@ -611,8 +613,9 @@ BlockDriver bdrv_crypto_luks = {\n>      .bdrv_truncate      = block_crypto_truncate,\n>      .create_opts        = &block_crypto_create_opts_luks,\n>  \n> -    .bdrv_co_readv      = block_crypto_co_readv,\n> -    .bdrv_co_writev     = block_crypto_co_writev,\n> +    .bdrv_refresh_limits = block_crypto_refresh_limits,\n> +    .bdrv_co_preadv      = block_crypto_co_preadv,\n> +    .bdrv_co_pwritev     = block_crypto_co_pwritev,\n>      .bdrv_getlength     = block_crypto_getlength,\n>      .bdrv_get_info      = block_crypto_get_info_luks,\n>      .bdrv_get_specific_info = block_crypto_get_specific_info_luks,\n\nLooks weird when = isn't consistently aligned, but we use more than one\nspace.  My preference is to just use one space everywhere, as adding a\nlonger name to the list doesn't require a mass re-format of all other\nentries; but I'm not opposed when people like the aligned = for\nlegibility.  So up to you if you do anything in response to my nit.\n\nReviewed-by: Eric Blake <eblake@redhat.com>","headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)","ext-mx06.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com","ext-mx06.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=eblake@redhat.com"],"Received":["from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xjm3p4GRlz9s7M\n\tfor <incoming@patchwork.ozlabs.org>;\n\tFri,  1 Sep 2017 01:08:54 +1000 (AEST)","from localhost ([::1]:56241 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dnR5Q-0000u6-Mq\n\tfor incoming@patchwork.ozlabs.org; Thu, 31 Aug 2017 11:08:52 -0400","from eggs.gnu.org ([2001:4830:134:3::10]:58267)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <eblake@redhat.com>) id 1dnR4s-0000r3-7z\n\tfor qemu-devel@nongnu.org; Thu, 31 Aug 2017 11:08:23 -0400","from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <eblake@redhat.com>) id 1dnR4k-0000u6-4c\n\tfor qemu-devel@nongnu.org; Thu, 31 Aug 2017 11:08:18 -0400","from mx1.redhat.com ([209.132.183.28]:35442)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <eblake@redhat.com>)\n\tid 1dnR4d-0000po-CR; Thu, 31 Aug 2017 11:08:03 -0400","from smtp.corp.redhat.com\n\t(int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id 7377625C29;\n\tThu, 31 Aug 2017 15:08:02 +0000 (UTC)","from [10.10.122.186] (ovpn-122-186.rdu2.redhat.com [10.10.122.186])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id 0E7BAB5153;\n\tThu, 31 Aug 2017 15:08:00 +0000 (UTC)"],"DMARC-Filter":"OpenDMARC Filter v1.3.2 mx1.redhat.com 7377625C29","To":"\"Daniel P. Berrange\" <berrange@redhat.com>, qemu-devel@nongnu.org","References":"<20170831110518.10741-1-berrange@redhat.com>\n\t<20170831110518.10741-4-berrange@redhat.com>","From":"Eric Blake <eblake@redhat.com>","Openpgp":"url=http://people.redhat.com/eblake/eblake.gpg","Organization":"Red Hat, Inc.","Message-ID":"<3867f025-5d0b-5bed-d47f-a91c706cd3aa@redhat.com>","Date":"Thu, 31 Aug 2017 10:08:00 -0500","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101\n\tThunderbird/52.3.0","MIME-Version":"1.0","In-Reply-To":"<20170831110518.10741-4-berrange@redhat.com>","Content-Type":"multipart/signed; micalg=pgp-sha256;\n\tprotocol=\"application/pgp-signature\";\n\tboundary=\"xpqp92n8x5qhVSfq10iU4eOEO8w2jsoPu\"","X-Scanned-By":"MIMEDefang 2.79 on 10.5.11.12","X-Greylist":"Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.30]);\n\tThu, 31 Aug 2017 15:08:02 +0000 (UTC)","X-detected-operating-system":"by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]\n\t[fuzzy]","X-Received-From":"209.132.183.28","X-Content-Filtered-By":"Mailman/MimeDel 2.1.21","Subject":"Re: [Qemu-devel] [PATCH v2 3/4] block: convert crypto driver to\n\tbdrv_co_preadv|pwritev","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.21","Precedence":"list","List-Id":"<qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<http://lists.nongnu.org/archive/html/qemu-devel/>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Cc":"Kevin Wolf <kwolf@redhat.com>, Stefan Hajnoczi <stefanha@gmail.com>,\n\tqemu-block@nongnu.org, Max Reitz <mreitz@redhat.com>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"}},{"id":1766844,"web_url":"http://patchwork.ozlabs.org/comment/1766844/","msgid":"<20170912101455.GD17633@redhat.com>","list_archive_url":null,"date":"2017-09-12T10:14:55","subject":"Re: [Qemu-devel] [PATCH v2 3/4] block: convert crypto driver to\n\tbdrv_co_preadv|pwritev","submitter":{"id":2694,"url":"http://patchwork.ozlabs.org/api/people/2694/","name":"Daniel P. Berrangé","email":"berrange@redhat.com"},"content":"On Thu, Aug 31, 2017 at 10:08:00AM -0500, Eric Blake wrote:\n> On 08/31/2017 06:05 AM, Daniel P. Berrange wrote:\n> > Make the crypto driver implement the bdrv_co_preadv|pwritev\n> > callbacks,  and also use bdrv_co_preadv|pwritev for I/O\n> > with the protocol driver beneath.\n> > \n> > Signed-off-by: Daniel P. Berrange <berrange@redhat.com>\n> > ---\n> >  block/crypto.c | 103 +++++++++++++++++++++++++++++----------------------------\n> >  1 file changed, 53 insertions(+), 50 deletions(-)\n> > \n> \n> >  static coroutine_fn int\n> > -block_crypto_co_readv(BlockDriverState *bs, int64_t sector_num,\n> > -                      int remaining_sectors, QEMUIOVector *qiov)\n> > +block_crypto_co_preadv(BlockDriverState *bs, uint64_t offset, uint64_t bytes,\n> > +                       QEMUIOVector *qiov, int flags)\n> \n> >  {\n> >      BlockCrypto *crypto = bs->opaque;\n> > -    int cur_nr_sectors; /* number of sectors in current iteration */\n> > +    uint64_t cur_bytes; /* number of bytes in current iteration */\n> >      uint64_t bytes_done = 0;\n> >      uint8_t *cipher_data = NULL;\n> >      QEMUIOVector hd_qiov;\n> >      int ret = 0;\n> > -    size_t payload_offset =\n> > -        qcrypto_block_get_payload_offset(crypto->block) / BDRV_SECTOR_SIZE;\n> > +    size_t payload_offset = qcrypto_block_get_payload_offset(crypto->block);\n> \n> Pre-existing: is size_t the right type, or can we overflow a 64-bit\n> offset on a 32-bit host?\n\nNo, it is bad. I'm fixing that as a separate patch, since it is a good\nto cleanup.\n\n> \n> > +    uint64_t sector_num = offset / BDRV_SECTOR_SIZE;\n> > +\n> > +    assert((offset % BDRV_SECTOR_SIZE) == 0);\n> > +    assert((bytes % BDRV_SECTOR_SIZE) == 0);\n> \n> The osdep.h macros might be nicer than open-coding; furthermore, if\n> desired, you could shorten to:\n> \n> assert(QEMU_IS_ALIGNED(offset | bytes, BDRV_SECTOR_SIZE));\n\nYep, makes sense.\n\n> >  static coroutine_fn int\n> > -block_crypto_co_writev(BlockDriverState *bs, int64_t sector_num,\n> > -                       int remaining_sectors, QEMUIOVector *qiov)\n> > +block_crypto_co_pwritev(BlockDriverState *bs, uint64_t offset, uint64_t bytes,\n> > +                        QEMUIOVector *qiov, int flags)\n> >  {\n> \n> Hmm - you don't set supported_write_flags.  But presumably, if the\n> underlying BDS supports BDRV_REQUEST_FUA, then crypto can likewise\n> support that flag by passing it through to the underlying device after\n> encryption.\n\nSomething to be added as a separate patch\n\n> > @@ -611,8 +613,9 @@ BlockDriver bdrv_crypto_luks = {\n> >      .bdrv_truncate      = block_crypto_truncate,\n> >      .create_opts        = &block_crypto_create_opts_luks,\n> >  \n> > -    .bdrv_co_readv      = block_crypto_co_readv,\n> > -    .bdrv_co_writev     = block_crypto_co_writev,\n> > +    .bdrv_refresh_limits = block_crypto_refresh_limits,\n> > +    .bdrv_co_preadv      = block_crypto_co_preadv,\n> > +    .bdrv_co_pwritev     = block_crypto_co_pwritev,\n> >      .bdrv_getlength     = block_crypto_getlength,\n> >      .bdrv_get_info      = block_crypto_get_info_luks,\n> >      .bdrv_get_specific_info = block_crypto_get_specific_info_luks,\n> \n> Looks weird when = isn't consistently aligned, but we use more than one\n> space.  My preference is to just use one space everywhere, as adding a\n> longer name to the list doesn't require a mass re-format of all other\n> entries; but I'm not opposed when people like the aligned = for\n> legibility.  So up to you if you do anything in response to my nit.\n\nNormally I stick with one space, so don't know what I was thinking\nwhen i wrote this.\n\nRegards,\nDaniel","headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)","ext-mx05.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com","ext-mx05.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=berrange@redhat.com"],"Received":["from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xs10G06vsz9s7B\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 12 Sep 2017 20:15:57 +1000 (AEST)","from localhost ([::1]:34694 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1driEV-0008BT-NR\n\tfor incoming@patchwork.ozlabs.org; Tue, 12 Sep 2017 06:15:55 -0400","from eggs.gnu.org ([2001:4830:134:3::10]:59847)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <berrange@redhat.com>) id 1driDs-00087x-Gn\n\tfor qemu-devel@nongnu.org; Tue, 12 Sep 2017 06:15:22 -0400","from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <berrange@redhat.com>) id 1driDm-0006Su-Mu\n\tfor qemu-devel@nongnu.org; Tue, 12 Sep 2017 06:15:16 -0400","from mx1.redhat.com ([209.132.183.28]:38454)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <berrange@redhat.com>)\n\tid 1driDc-0006By-5E; Tue, 12 Sep 2017 06:15:00 -0400","from smtp.corp.redhat.com\n\t(int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id 1576B37E67;\n\tTue, 12 Sep 2017 10:14:59 +0000 (UTC)","from redhat.com (unknown [10.42.22.189])\n\tby smtp.corp.redhat.com (Postfix) with ESMTPS id E0FA077D59;\n\tTue, 12 Sep 2017 10:14:57 +0000 (UTC)"],"DMARC-Filter":"OpenDMARC Filter v1.3.2 mx1.redhat.com 1576B37E67","Date":"Tue, 12 Sep 2017 11:14:55 +0100","From":"\"Daniel P. Berrange\" <berrange@redhat.com>","To":"Eric Blake <eblake@redhat.com>","Message-ID":"<20170912101455.GD17633@redhat.com>","References":"<20170831110518.10741-1-berrange@redhat.com>\n\t<20170831110518.10741-4-berrange@redhat.com>\n\t<3867f025-5d0b-5bed-d47f-a91c706cd3aa@redhat.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<3867f025-5d0b-5bed-d47f-a91c706cd3aa@redhat.com>","User-Agent":"Mutt/1.8.3 (2017-05-23)","X-Scanned-By":"MIMEDefang 2.79 on 10.5.11.12","X-Greylist":"Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.29]);\n\tTue, 12 Sep 2017 10:14:59 +0000 (UTC)","X-detected-operating-system":"by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]\n\t[fuzzy]","X-Received-From":"209.132.183.28","Subject":"Re: [Qemu-devel] [PATCH v2 3/4] block: convert crypto driver to\n\tbdrv_co_preadv|pwritev","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.21","Precedence":"list","List-Id":"<qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<http://lists.nongnu.org/archive/html/qemu-devel/>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Reply-To":"\"Daniel P. Berrange\" <berrange@redhat.com>","Cc":"Kevin Wolf <kwolf@redhat.com>, Stefan Hajnoczi <stefanha@gmail.com>,\n\tqemu-devel@nongnu.org, qemu-block@nongnu.org,\n\tMax Reitz <mreitz@redhat.com>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"}}]