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); > + } > +}