Re: [Qemu-block] [PATCH v3 4/7] block: don't use constant 512 as sector size in crypto driver

2017-09-18 Thread Daniel P. Berrange
On Sat, Sep 16, 2017 at 06:24:56PM +0200, Max Reitz wrote:
> On 2017-09-12 13:28, Daniel P. Berrange wrote:
> > Use the qcrypto_block_get_sector_size() value in the block
> > crypto driver instead of hardcoding 512 as the sector size.
> > 
> > Signed-off-by: Daniel P. Berrange 
> > ---
> >  block/crypto.c | 34 ++
> >  1 file changed, 18 insertions(+), 16 deletions(-)
> > 
> > diff --git a/block/crypto.c b/block/crypto.c
> > index d68cbac2ac..49d6d4c058 100644
> > --- a/block/crypto.c
> > +++ b/block/crypto.c
> > @@ -392,8 +392,9 @@ block_crypto_co_readv(BlockDriverState *bs, int64_t 
> > sector_num,
> >  uint8_t *cipher_data = NULL;
> >  QEMUIOVector hd_qiov;
> >  int ret = 0;
> > +uint64_t sector_size = qcrypto_block_get_sector_size(crypto->block);
> >  uint64_t payload_offset =
> > -qcrypto_block_get_payload_offset(crypto->block) / 512;
> > +qcrypto_block_get_payload_offset(crypto->block) / sector_size;
> >  assert(payload_offset < (INT64_MAX / 512));
> >  
> >  qemu_iovec_init(_qiov, qiov->niov);
> > @@ -401,9 +402,9 @@ block_crypto_co_readv(BlockDriverState *bs, int64_t 
> > sector_num,
> >  /* 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_SECTORS * 
> > 512,
> > -  qiov->size));
> > +cipher_data = qemu_try_blockalign(
> > +bs->file->bs, MIN(BLOCK_CRYPTO_MAX_SECTORS * sector_size,
> > +  qiov->size));
> >  if (cipher_data == NULL) {
> >  ret = -ENOMEM;
> >  goto cleanup;
> > @@ -417,7 +418,7 @@ block_crypto_co_readv(BlockDriverState *bs, int64_t 
> > sector_num,
> >  }
> >  
> >  qemu_iovec_reset(_qiov);
> > -qemu_iovec_add(_qiov, cipher_data, cur_nr_sectors * 512);
> > +qemu_iovec_add(_qiov, cipher_data, cur_nr_sectors * 
> > sector_size);
> 
> cur_nr_sectors is based on remaining_sectors; which in turn is a
> parameter to this function and comes from the block layer.  Therefore
> its unit is BDRV_SECTOR_SIZE and not the crypto driver's sector size.
> 
> Same in the hunk below, and in block_crypto_co_writev().
> 
> >  
> >  ret = bdrv_co_readv(bs->file,
> >  payload_offset + sector_num,
> 
> Same thing here, albeit in a different variation: The unit of this
> parameter of bdrv_co_readv() (start sector index) is a block layer
> sector, whose size is always BDRV_SECTOR_SIZE.
> 
> Therefore you cannot divide the result from
> qcrypto_block_get_payload_offset() by the crypto driver's sector size
> and then use it as a sector index here.
> 
> Same in block_crypto_co_writev().
> 
> 
> I assume that you fix this in the next patch, but for now it's just wrong.

Yeah, in retrospect I should have kept this patch using BDRV_SECTOR_SIZE
throughout as previous versions had it, so I'm going to go back to doing
that. Only use the encryption sector size in a later patch where we have
already switched to doing byte based I/O.


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 :|



Re: [Qemu-block] [PATCH v3 4/7] block: don't use constant 512 as sector size in crypto driver

2017-09-18 Thread Eric Blake
On 09/12/2017 06:28 AM, Daniel P. Berrange wrote:
> Use the qcrypto_block_get_sector_size() value in the block
> crypto driver instead of hardcoding 512 as the sector size.
> 
> Signed-off-by: Daniel P. Berrange 
> ---
>  block/crypto.c | 34 ++
>  1 file changed, 18 insertions(+), 16 deletions(-)
> 
> diff --git a/block/crypto.c b/block/crypto.c
> index d68cbac2ac..49d6d4c058 100644
> --- a/block/crypto.c
> +++ b/block/crypto.c
> @@ -392,8 +392,9 @@ block_crypto_co_readv(BlockDriverState *bs, int64_t 
> sector_num,
>  uint8_t *cipher_data = NULL;
>  QEMUIOVector hd_qiov;
>  int ret = 0;
> +uint64_t sector_size = qcrypto_block_get_sector_size(crypto->block);
>  uint64_t payload_offset =
> -qcrypto_block_get_payload_offset(crypto->block) / 512;
> +qcrypto_block_get_payload_offset(crypto->block) / sector_size;
>  assert(payload_offset < (INT64_MAX / 512));

In addition to Max's comments, should the assert be dividing by
sector_size instead of 512?

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.   +1-919-301-3266
Virtualization:  qemu.org | libvirt.org



signature.asc
Description: OpenPGP digital signature


Re: [Qemu-block] [PATCH v3 4/7] block: don't use constant 512 as sector size in crypto driver

2017-09-16 Thread Max Reitz
On 2017-09-12 13:28, Daniel P. Berrange wrote:
> Use the qcrypto_block_get_sector_size() value in the block
> crypto driver instead of hardcoding 512 as the sector size.
> 
> Signed-off-by: Daniel P. Berrange 
> ---
>  block/crypto.c | 34 ++
>  1 file changed, 18 insertions(+), 16 deletions(-)
> 
> diff --git a/block/crypto.c b/block/crypto.c
> index d68cbac2ac..49d6d4c058 100644
> --- a/block/crypto.c
> +++ b/block/crypto.c
> @@ -392,8 +392,9 @@ block_crypto_co_readv(BlockDriverState *bs, int64_t 
> sector_num,
>  uint8_t *cipher_data = NULL;
>  QEMUIOVector hd_qiov;
>  int ret = 0;
> +uint64_t sector_size = qcrypto_block_get_sector_size(crypto->block);
>  uint64_t payload_offset =
> -qcrypto_block_get_payload_offset(crypto->block) / 512;
> +qcrypto_block_get_payload_offset(crypto->block) / sector_size;
>  assert(payload_offset < (INT64_MAX / 512));
>  
>  qemu_iovec_init(_qiov, qiov->niov);
> @@ -401,9 +402,9 @@ block_crypto_co_readv(BlockDriverState *bs, int64_t 
> sector_num,
>  /* 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_SECTORS * 512,
> -  qiov->size));
> +cipher_data = qemu_try_blockalign(
> +bs->file->bs, MIN(BLOCK_CRYPTO_MAX_SECTORS * sector_size,
> +  qiov->size));
>  if (cipher_data == NULL) {
>  ret = -ENOMEM;
>  goto cleanup;
> @@ -417,7 +418,7 @@ block_crypto_co_readv(BlockDriverState *bs, int64_t 
> sector_num,
>  }
>  
>  qemu_iovec_reset(_qiov);
> -qemu_iovec_add(_qiov, cipher_data, cur_nr_sectors * 512);
> +qemu_iovec_add(_qiov, cipher_data, cur_nr_sectors * sector_size);

cur_nr_sectors is based on remaining_sectors; which in turn is a
parameter to this function and comes from the block layer.  Therefore
its unit is BDRV_SECTOR_SIZE and not the crypto driver's sector size.

Same in the hunk below, and in block_crypto_co_writev().

>  
>  ret = bdrv_co_readv(bs->file,
>  payload_offset + sector_num,

Same thing here, albeit in a different variation: The unit of this
parameter of bdrv_co_readv() (start sector index) is a block layer
sector, whose size is always BDRV_SECTOR_SIZE.

Therefore you cannot divide the result from
qcrypto_block_get_payload_offset() by the crypto driver's sector size
and then use it as a sector index here.

Same in block_crypto_co_writev().


I assume that you fix this in the next patch, but for now it's just wrong.

Max



signature.asc
Description: OpenPGP digital signature