From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47256) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XMCPD-0005I5-VY for qemu-devel@nongnu.org; Tue, 26 Aug 2014 04:47:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XMCP4-0006ub-Tr for qemu-devel@nongnu.org; Tue, 26 Aug 2014 04:47:07 -0400 Received: from mail-qa0-x229.google.com ([2607:f8b0:400d:c00::229]:60793) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XMCP4-0006uW-OC for qemu-devel@nongnu.org; Tue, 26 Aug 2014 04:46:58 -0400 Received: by mail-qa0-f41.google.com with SMTP id j7so13716034qaq.28 for ; Tue, 26 Aug 2014 01:46:58 -0700 (PDT) Sender: Paolo Bonzini Message-ID: <53FC496C.7020603@redhat.com> Date: Tue, 26 Aug 2014 10:46:36 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: <1409033298-5720-1-git-send-email-famz@redhat.com> <1409033298-5720-7-git-send-email-famz@redhat.com> In-Reply-To: <1409033298-5720-7-git-send-email-famz@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [RFC PATCH v2 6/8] dma: Implement .cancel_async List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Fam Zheng , qemu-devel@nongnu.org Cc: Kevin Wolf , Stefan Hajnoczi Il 26/08/2014 08:08, Fam Zheng ha scritto: > + if (dbs->cancelled) { > + ret = -ECANCELED; > + } Why is dbs->cancelled necessary? > dma_bdrv_unmap(dbs); > if (dbs->common.cb) { > dbs->common.cb(dbs->common.opaque, ret); > @@ -141,6 +148,9 @@ static void dma_bdrv_cb(void *opaque, int ret) > > trace_dma_bdrv_cb(dbs, ret); > > + if (dbs->cancelled) { > + ret = -ECANCELED; > + } > dbs->acb = NULL; > dbs->sector_num += dbs->iov.size / 512; > > @@ -185,6 +195,7 @@ static void dma_aio_cancel(BlockDriverAIOCB *acb) > > trace_dma_aio_cancel(dbs); > > + dbs->cancelled = true; > if (dbs->acb) { > BlockDriverAIOCB *acb = dbs->acb; > dbs->acb = NULL; > @@ -196,9 +207,25 @@ static void dma_aio_cancel(BlockDriverAIOCB *acb) > dma_complete(dbs, 0); > } > > +static void dma_aio_cancel_async(BlockDriverAIOCB *acb) > +{ > + DMAAIOCB *dbs = container_of(acb, DMAAIOCB, common); > + > + trace_dma_aio_cancel(dbs); > + > + dbs->cancelled = true; > + if (dbs->acb) { > + acb = dbs->acb; > + dbs->acb = NULL; Why do you need to set dbs->acb to NULL, since the callback is going to be called? Paolo > + bdrv_aio_cancel_async(acb); > + } > +}