Am 25.05.2016 um 00:25 hat Eric Blake geschrieben:
> Another step on our continuing quest to switch to byte-based
> interfaces.
> 
> Kill an abuse of the comma operator while at it (fortunately,
> the semantics were still right).
> 
> Signed-off-by: Eric Blake <ebl...@redhat.com>
> ---
>  block/qed.c | 25 +++++++++++++------------
>  1 file changed, 13 insertions(+), 12 deletions(-)
> 
> diff --git a/block/qed.c b/block/qed.c
> index 0ab5b40..a0be886 100644
> --- a/block/qed.c
> +++ b/block/qed.c
> @@ -1419,7 +1419,7 @@ typedef struct {
>      bool done;
>  } QEDWriteZeroesCB;
> 
> -static void coroutine_fn qed_co_write_zeroes_cb(void *opaque, int ret)
> +static void coroutine_fn qed_co_pwrite_zeroes_cb(void *opaque, int ret)
>  {
>      QEDWriteZeroesCB *cb = opaque;
> 
> @@ -1430,10 +1430,10 @@ static void coroutine_fn qed_co_write_zeroes_cb(void 
> *opaque, int ret)
>      }
>  }
> 
> -static int coroutine_fn bdrv_qed_co_write_zeroes(BlockDriverState *bs,
> -                                                 int64_t sector_num,
> -                                                 int nb_sectors,
> -                                                 BdrvRequestFlags flags)
> +static int coroutine_fn bdrv_qed_co_pwrite_zeroes(BlockDriverState *bs,
> +                                                  int64_t offset,
> +                                                  int count,
> +                                                  BdrvRequestFlags flags)
>  {
>      BlockAIOCB *blockacb;
>      BDRVQEDState *s = bs->opaque;
> @@ -1443,10 +1443,10 @@ static int coroutine_fn 
> bdrv_qed_co_write_zeroes(BlockDriverState *bs,
> 
>      /* Refuse if there are untouched backing file sectors */
>      if (bs->backing) {
> -        if (qed_offset_into_cluster(s, sector_num * BDRV_SECTOR_SIZE) != 0) {
> +        if (qed_offset_into_cluster(s, offset) != 0) {
>              return -ENOTSUP;
>          }
> -        if (qed_offset_into_cluster(s, nb_sectors * BDRV_SECTOR_SIZE) != 0) {
> +        if (qed_offset_into_cluster(s, count) != 0) {
>              return -ENOTSUP;
>          }
>      }

Unaligned requests are only emulated if there is no backing file...

> @@ -1454,12 +1454,13 @@ static int coroutine_fn 
> bdrv_qed_co_write_zeroes(BlockDriverState *bs,
>      /* Zero writes start without an I/O buffer.  If a buffer becomes 
> necessary
>       * then it will be allocated during request processing.
>       */
> -    iov.iov_base = NULL,
> -    iov.iov_len  = nb_sectors * BDRV_SECTOR_SIZE,
> +    iov.iov_base = NULL;
> +    iov.iov_len = count;
> 
>      qemu_iovec_init_external(&qiov, &iov, 1);
> -    blockacb = qed_aio_setup(bs, sector_num, &qiov, nb_sectors,
> -                             qed_co_write_zeroes_cb, &cb,
> +    blockacb = qed_aio_setup(bs, offset >> BDRV_SECTOR_BITS, &qiov,
> +                             count >> BDRV_SECTOR_BITS,

...so offset and count can still be unaligned here and we end up zeroing
out the wrong part of the sector. I guess we need to return -ENOTSUP for
all sub-sector requests, even without a backing file.

> +                             qed_co_pwrite_zeroes_cb, &cb,
>                               QED_AIOCB_WRITE | QED_AIOCB_ZERO);
>      if (!blockacb) {
>          return -EIO;

Kevin

Reply via email to