qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 1/2] block: Fix too early free in multiwrite


From: Stefan Hajnoczi
Subject: Re: [Qemu-devel] [PATCH 1/2] block: Fix too early free in multiwrite
Date: Fri, 2 Jul 2010 09:10:34 +0100

On Thu, Jul 1, 2010 at 3:31 PM, Kevin Wolf <address@hidden> wrote:
> bdrv_aio_writev may call the callback immediately (and it will commonly do so
> in error cases). If num_requests doesn't have its final value yet,
> multiwrite_cb will falsely detect that all requests are completed and frees
> the mcb. However, the mcb is still used by other requests that are started 
> only
> afterwards. When all requests are completed, it is freed for the second time.
>
> Fix this by setting the right num_requests from the beginning.

Looks good to me.

>
> Signed-off-by: Kevin Wolf <address@hidden>
> ---
>  block.c |    6 ++----
>  1 files changed, 2 insertions(+), 4 deletions(-)
>
> diff --git a/block.c b/block.c
> index c40dd2c..9719649 100644
> --- a/block.c
> +++ b/block.c
> @@ -2198,6 +2198,7 @@ int bdrv_aio_multiwrite(BlockDriverState *bs, 
> BlockRequest *reqs, int num_reqs)
>     num_reqs = multiwrite_merge(bs, reqs, num_reqs, mcb);
>
>     // Run the aio requests
> +    mcb->num_requests = num_reqs;
>     for (i = 0; i < num_reqs; i++) {
>         acb = bdrv_aio_writev(bs, reqs[i].sector, reqs[i].qiov,
>             reqs[i].nb_sectors, multiwrite_cb, mcb);
> @@ -2206,16 +2207,13 @@ int bdrv_aio_multiwrite(BlockDriverState *bs, 
> BlockRequest *reqs, int num_reqs)
>             // We can only fail the whole thing if no request has been
>             // submitted yet. Otherwise we'll wait for the submitted AIOs to
>             // complete and report the error in the callback.
> -            if (mcb->num_requests == 0) {
> +            if (i == 0) {
>                 reqs[i].error = -EIO;
>                 goto fail;
>             } else {
> -                mcb->num_requests++;
>                 multiwrite_cb(mcb, -EIO);
>                 break;
>             }
> -        } else {
> -            mcb->num_requests++;
>         }
>     }
>
> --
> 1.6.6.1
>
>
>

Stefan



reply via email to

[Prev in Thread] Current Thread [Next in Thread]