[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 01/11] block: generalize BlockLimits handling to
From: |
Peter Lieven |
Subject: |
Re: [Qemu-devel] [PATCH 01/11] block: generalize BlockLimits handling to cover bdrv_aio_discard too |
Date: |
Wed, 13 Nov 2013 07:07:01 +0100 |
Am 12.11.2013 um 16:49 schrieb Paolo Bonzini <address@hidden>:
> bdrv_co_discard is only covering drivers which have a .bdrv_co_discard()
> implementation, but not those with .bdrv_aio_discard(). Not very nice,
> and easy to avoid.
>
> Suggested-by: Kevin Wolf <address@hidden>
> Signed-off-by: Paolo Bonzini <address@hidden>
> ---
> block.c | 80 +++++++++++++++++++++++++++++++++--------------------------------
> 1 file changed, 41 insertions(+), 39 deletions(-)
>
> diff --git a/block.c b/block.c
> index aba6a19..ba6872e 100644
> --- a/block.c
> +++ b/block.c
> @@ -4281,6 +4281,8 @@ static void coroutine_fn bdrv_discard_co_entry(void
> *opaque)
> int coroutine_fn bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
> int nb_sectors)
> {
> + int max_discard;
> +
> if (!bs->drv) {
> return -ENOMEDIUM;
> } else if (bdrv_check_request(bs, sector_num, nb_sectors)) {
> @@ -4298,55 +4300,55 @@ int coroutine_fn bdrv_co_discard(BlockDriverState
> *bs, int64_t sector_num,
> return 0;
> }
>
> - if (bs->drv->bdrv_co_discard) {
> - int max_discard = bs->bl.max_discard ?
> - bs->bl.max_discard : MAX_DISCARD_DEFAULT;
> + if (!bs->drv->bdrv_co_discard && !bs->drv->bdrv_aio_discard) {
> + return 0;
> + }
>
> - while (nb_sectors > 0) {
> - int ret;
> - int num = nb_sectors;
> + max_discard = bs->bl.max_discard ? bs->bl.max_discard :
> MAX_DISCARD_DEFAULT;
> + while (nb_sectors > 0) {
> + int ret;
> + int num = nb_sectors;
>
> - /* align request */
> - if (bs->bl.discard_alignment &&
> - num >= bs->bl.discard_alignment &&
> - sector_num % bs->bl.discard_alignment) {
> - if (num > bs->bl.discard_alignment) {
> - num = bs->bl.discard_alignment;
> - }
> - num -= sector_num % bs->bl.discard_alignment;
> + /* align request */
> + if (bs->bl.discard_alignment &&
> + num >= bs->bl.discard_alignment &&
> + sector_num % bs->bl.discard_alignment) {
> + if (num > bs->bl.discard_alignment) {
> + num = bs->bl.discard_alignment;
> }
> + num -= sector_num % bs->bl.discard_alignment;
> + }
>
> - /* limit request size */
> - if (num > max_discard) {
> - num = max_discard;
> - }
> + /* limit request size */
> + if (num > max_discard) {
> + num = max_discard;
> + }
>
> + if (bs->drv->bdrv_co_discard) {
> ret = bs->drv->bdrv_co_discard(bs, sector_num, num);
> - if (ret) {
> - return ret;
> + } else {
> + BlockDriverAIOCB *acb;
> + CoroutineIOCompletion co = {
> + .coroutine = qemu_coroutine_self(),
> + };
> +
> + acb = bs->drv->bdrv_aio_discard(bs, sector_num, nb_sectors,
> + bdrv_co_io_em_complete, &co);
> + if (acb == NULL) {
> + return -EIO;
> + } else {
> + qemu_coroutine_yield();
> + ret = co.ret;
> }
> -
> - sector_num += num;
> - nb_sectors -= num;
> }
> - return 0;
> - } else if (bs->drv->bdrv_aio_discard) {
> - BlockDriverAIOCB *acb;
> - CoroutineIOCompletion co = {
> - .coroutine = qemu_coroutine_self(),
> - };
> -
> - acb = bs->drv->bdrv_aio_discard(bs, sector_num, nb_sectors,
> - bdrv_co_io_em_complete, &co);
> - if (acb == NULL) {
> - return -EIO;
> - } else {
> - qemu_coroutine_yield();
> - return co.ret;
> + if (ret) {
> + return ret;
> }
> - } else {
> - return 0;
> +
> + sector_num += num;
> + nb_sectors -= num;
> }
> + return 0;
> }
>
> int bdrv_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors)
> --
> 1.8.4.2
>
>
Thank you.
Reviewed-By: Peter Lieven <address@hidden>
- [Qemu-devel] [PATCH 00/11] block & scsi: write_zeroes support through the whole stack, Paolo Bonzini, 2013/11/12
- [Qemu-devel] [PATCH 03/11] block: add bdrv_aio_write_zeroes, Paolo Bonzini, 2013/11/12
- [Qemu-devel] [PATCH 04/11] scsi-disk: catch write protection errors in UNMAP, Paolo Bonzini, 2013/11/12
- [Qemu-devel] [PATCH 02/11] block: add flags to BlockRequest, Paolo Bonzini, 2013/11/12
- [Qemu-devel] [PATCH 01/11] block: generalize BlockLimits handling to cover bdrv_aio_discard too, Paolo Bonzini, 2013/11/12
- Re: [Qemu-devel] [PATCH 01/11] block: generalize BlockLimits handling to cover bdrv_aio_discard too,
Peter Lieven <=
- [Qemu-devel] [PATCH 06/11] scsi-disk: correctly implement WRITE SAME, Paolo Bonzini, 2013/11/12
- [Qemu-devel] [PATCH 07/11] block: handle ENOTSUP from discard in generic code, Paolo Bonzini, 2013/11/12
- [Qemu-devel] [PATCH 08/11] raw-posix: implement write_zeroes with MAY_UNMAP for files, Paolo Bonzini, 2013/11/12
- [Qemu-devel] [PATCH 10/11] raw-posix: add support for write_zeroes on XFS and block devices, Paolo Bonzini, 2013/11/12
- [Qemu-devel] [PATCH 09/11] raw-posix: implement write_zeroes with MAY_UNMAP for block devices, Paolo Bonzini, 2013/11/12