From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Eric Blake <eblake@redhat.com>
Cc: qemu-devel@nongnu.org, kwolf@redhat.com, qemu-block@nongnu.org,
Max Reitz <mreitz@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v2 09/13] RFC: crypto: Rely on block layer for fragmentation
Date: Thu, 15 Nov 2018 18:31:41 +0000 [thread overview]
Message-ID: <20181115183141.GA27179@redhat.com> (raw)
In-Reply-To: <20181115020334.1189829-10-eblake@redhat.com>
On Wed, Nov 14, 2018 at 08:03:30PM -0600, Eric Blake wrote:
> No need to reimplement fragmentation to BLOCK_CRYPTO_MAX_IO_SIZE
> ourselves when we can ask the block layer to do it for us.
>
> Signed-off-by: Eric Blake <eblake@redhat.com>
>
> ---
> Question - is this patch for 'crypto' acceptable, or should we stick
> with just the previous one that marks things as 64-bit clean?
Unless I'm missing something, this is functionally equivalent to
the existing code, and is simpler to read, so I don't see any
obvious downside to this patch.
Assuming that you've run 'qemu-iotests/check -luks' on it to
validate it then ...
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
> block/crypto.c | 80 +++++++++++++++++++-------------------------------
> 1 file changed, 30 insertions(+), 50 deletions(-)
>
> diff --git a/block/crypto.c b/block/crypto.c
> index 259ef2649e1..b004cef22c2 100644
> --- a/block/crypto.c
> +++ b/block/crypto.c
> @@ -328,8 +328,6 @@ block_crypto_co_preadv(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
> QEMUIOVector *qiov, int flags)
> {
> BlockCrypto *crypto = bs->opaque;
> - uint64_t cur_bytes; /* number of bytes in current iteration */
> - uint64_t bytes_done = 0;
> uint8_t *cipher_data = NULL;
> QEMUIOVector hd_qiov;
> int ret = 0;
> @@ -346,38 +344,30 @@ block_crypto_co_preadv(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
> /* Bounce buffer because we don't wish to expose cipher text
> * in qiov which points to guest memory.
> */
> - cipher_data =
> - qemu_try_blockalign(bs->file->bs, MIN(BLOCK_CRYPTO_MAX_IO_SIZE,
> - qiov->size));
> + assert(qiov->size <= BLOCK_CRYPTO_MAX_IO_SIZE);
> + cipher_data = qemu_try_blockalign(bs->file->bs, qiov->size);
> if (cipher_data == NULL) {
> ret = -ENOMEM;
> goto cleanup;
> }
>
> - while (bytes) {
> - cur_bytes = MIN(bytes, BLOCK_CRYPTO_MAX_IO_SIZE);
> + qemu_iovec_reset(&hd_qiov);
> + qemu_iovec_add(&hd_qiov, cipher_data, bytes);
>
> - qemu_iovec_reset(&hd_qiov);
> - qemu_iovec_add(&hd_qiov, cipher_data, cur_bytes);
> -
> - ret = bdrv_co_preadv(bs->file, payload_offset + offset + bytes_done,
> - cur_bytes, &hd_qiov, 0);
> - if (ret < 0) {
> - goto cleanup;
> - }
> -
> - if (qcrypto_block_decrypt(crypto->block, offset + bytes_done,
> - cipher_data, cur_bytes, NULL) < 0) {
> - ret = -EIO;
> - goto cleanup;
> - }
> -
> - qemu_iovec_from_buf(qiov, bytes_done, cipher_data, cur_bytes);
> + ret = bdrv_co_preadv(bs->file, payload_offset + offset, bytes,
> + &hd_qiov, 0);
> + if (ret < 0) {
> + goto cleanup;
> + }
>
> - bytes -= cur_bytes;
> - bytes_done += cur_bytes;
> + if (qcrypto_block_decrypt(crypto->block, offset,
> + cipher_data, bytes, NULL) < 0) {
> + ret = -EIO;
> + goto cleanup;
> }
>
> + qemu_iovec_from_buf(qiov, 0, cipher_data, bytes);
> +
> cleanup:
> qemu_iovec_destroy(&hd_qiov);
> qemu_vfree(cipher_data);
> @@ -391,8 +381,6 @@ block_crypto_co_pwritev(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
> QEMUIOVector *qiov, int flags)
> {
> BlockCrypto *crypto = bs->opaque;
> - uint64_t cur_bytes; /* number of bytes in current iteration */
> - uint64_t bytes_done = 0;
> uint8_t *cipher_data = NULL;
> QEMUIOVector hd_qiov;
> int ret = 0;
> @@ -409,36 +397,28 @@ block_crypto_co_pwritev(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
> /* Bounce buffer because we're not permitted to touch
> * contents of qiov - it points to guest memory.
> */
> - cipher_data =
> - qemu_try_blockalign(bs->file->bs, MIN(BLOCK_CRYPTO_MAX_IO_SIZE,
> - qiov->size));
> + assert(qiov->size <= BLOCK_CRYPTO_MAX_IO_SIZE);
> + cipher_data = qemu_try_blockalign(bs->file->bs, qiov->size);
> if (cipher_data == NULL) {
> ret = -ENOMEM;
> goto cleanup;
> }
>
> - while (bytes) {
> - cur_bytes = MIN(bytes, BLOCK_CRYPTO_MAX_IO_SIZE);
> + qemu_iovec_to_buf(qiov, 0, cipher_data, bytes);
>
> - qemu_iovec_to_buf(qiov, bytes_done, cipher_data, cur_bytes);
> + if (qcrypto_block_encrypt(crypto->block, offset,
> + cipher_data, bytes, NULL) < 0) {
> + ret = -EIO;
> + goto cleanup;
> + }
>
> - if (qcrypto_block_encrypt(crypto->block, offset + bytes_done,
> - cipher_data, cur_bytes, NULL) < 0) {
> - ret = -EIO;
> - goto cleanup;
> - }
> + qemu_iovec_reset(&hd_qiov);
> + qemu_iovec_add(&hd_qiov, cipher_data, bytes);
>
> - qemu_iovec_reset(&hd_qiov);
> - qemu_iovec_add(&hd_qiov, cipher_data, cur_bytes);
> -
> - ret = bdrv_co_pwritev(bs->file, payload_offset + offset + bytes_done,
> - cur_bytes, &hd_qiov, flags);
> - if (ret < 0) {
> - goto cleanup;
> - }
> -
> - bytes -= cur_bytes;
> - bytes_done += cur_bytes;
> + ret = bdrv_co_pwritev(bs->file, payload_offset + offset,
> + bytes, &hd_qiov, flags);
> + if (ret < 0) {
> + goto cleanup;
> }
>
> cleanup:
> @@ -453,7 +433,7 @@ static void block_crypto_refresh_limits(BlockDriverState *bs, Error **errp)
> BlockCrypto *crypto = bs->opaque;
> uint64_t sector_size = qcrypto_block_get_sector_size(crypto->block);
> bs->bl.request_alignment = sector_size; /* No sub-sector I/O */
> - bs->bl.max_transfer = INT64_MAX;
> + bs->bl.max_transfer = BLOCK_CRYPTO_MAX_IO_SIZE;
> }
>
>
> --
> 2.17.2
>
>
Regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
next prev parent reply other threads:[~2018-11-15 18:32 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-15 2:03 [Qemu-devel] [PATCH v2 for-4.0 00/13] block: byte-based blocking read/write Eric Blake
2018-11-15 2:03 ` [Qemu-devel] [PATCH v2 01/13] qcow2: Prefer byte-based calls into bs->file Eric Blake
2018-11-15 2:03 ` [Qemu-devel] [PATCH v2 02/13] vdi: Switch to byte-based calls Eric Blake
2018-11-15 2:03 ` [Qemu-devel] [PATCH v2 03/13] vvfat: " Eric Blake
2018-11-15 2:03 ` [Qemu-devel] [PATCH v2 04/13] block: Removed unused sector-based blocking I/O Eric Blake
2018-11-15 2:03 ` [Qemu-devel] [PATCH v2 05/13] block: Switch to 64-bit bl.max_transfer Eric Blake
2018-11-15 15:45 ` Kevin Wolf
2018-11-15 16:28 ` Eric Blake
2018-11-16 15:32 ` Kevin Wolf
2018-11-16 15:54 ` Eric Blake
2018-11-16 16:32 ` Kevin Wolf
2018-11-15 2:03 ` [Qemu-devel] [PATCH v2 06/13] blkdebug: Audit for read/write 64-bit cleanness Eric Blake
2018-11-15 2:03 ` [Qemu-devel] [PATCH v2 07/13] blklogwrites: " Eric Blake
2018-11-15 2:03 ` [Qemu-devel] [PATCH v2 08/13] crypto: " Eric Blake
2018-11-15 2:03 ` [Qemu-devel] [PATCH v2 09/13] RFC: crypto: Rely on block layer for fragmentation Eric Blake
2018-11-15 16:05 ` Kevin Wolf
2018-11-15 18:31 ` Daniel P. Berrangé [this message]
2018-11-15 2:03 ` [Qemu-devel] [PATCH v2 10/13] file-posix: Audit for read/write 64-bit cleanness Eric Blake
2018-11-15 2:03 ` [Qemu-devel] [PATCH v2 11/13] qcow2: " Eric Blake
2018-11-15 2:03 ` [Qemu-devel] [PATCH v2 12/13] block: Document need for audit of " Eric Blake
2018-11-15 2:03 ` [Qemu-devel] [PATCH v2 13/13] block: Enforce non-zero bl.max_transfer Eric Blake
2018-11-15 16:24 ` Kevin Wolf
2018-11-15 16:34 ` Eric Blake
2018-11-15 9:02 ` [Qemu-devel] [PATCH v2 for-4.0 00/13] block: byte-based blocking read/write no-reply
2018-11-15 13:09 ` Eric Blake
2018-11-15 9:04 ` no-reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181115183141.GA27179@redhat.com \
--to=berrange@redhat.com \
--cc=eblake@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.