Message ID | 1466451417-27988-1-git-send-email-stefanha@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, 06/20 20:36, Stefan Hajnoczi wrote: > Attempting to cancel a dma_blk_io() request causes an abort(3): > > void bdrv_aio_cancel(BlockAIOCB *acb) > { > ... > while (acb->refcnt > 1) { > if (acb->aiocb_info->get_aio_context) { > aio_poll(acb->aiocb_info->get_aio_context(acb), true); > } else if (acb->bs) { > aio_poll(bdrv_get_aio_context(acb->bs), true); > } else { > abort(); > } > } > ... > } > > This happens because DMAAIOCB->bs is NULL and > dma_aiocb_info.get_aio_context() is also NULL. > > This patch trivially implements dma_aiocb_info.get_aio_context() by > fetching the DMAAIOCB->ctx field. > > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > dma-helpers.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/dma-helpers.c b/dma-helpers.c > index b521d84..9defc10 100644 > --- a/dma-helpers.c > +++ b/dma-helpers.c > @@ -185,10 +185,17 @@ static void dma_aio_cancel(BlockAIOCB *acb) > } > } > > +static AioContext *dma_get_aio_context(BlockAIOCB *acb) > +{ > + DMAAIOCB *dbs = container_of(acb, DMAAIOCB, common); > + > + return dbs->ctx; > +} > > static const AIOCBInfo dma_aiocb_info = { > .aiocb_size = sizeof(DMAAIOCB), > .cancel_async = dma_aio_cancel, > + .get_aio_context = dma_get_aio_context, > }; > > BlockAIOCB *dma_blk_io(AioContext *ctx, > -- > 2.5.5 > > Reviewed-by: Fam Zheng <famz@redhat.com>
On Mon, Jun 20, 2016 at 08:36:57PM +0100, Stefan Hajnoczi wrote: > Attempting to cancel a dma_blk_io() request causes an abort(3): > > void bdrv_aio_cancel(BlockAIOCB *acb) > { > ... > while (acb->refcnt > 1) { > if (acb->aiocb_info->get_aio_context) { > aio_poll(acb->aiocb_info->get_aio_context(acb), true); > } else if (acb->bs) { > aio_poll(bdrv_get_aio_context(acb->bs), true); > } else { > abort(); > } > } > ... > } > > This happens because DMAAIOCB->bs is NULL and > dma_aiocb_info.get_aio_context() is also NULL. > > This patch trivially implements dma_aiocb_info.get_aio_context() by > fetching the DMAAIOCB->ctx field. > > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > dma-helpers.c | 7 +++++++ > 1 file changed, 7 insertions(+) dma-helpers.c has no maintainer, I'll take this through my tree. Thanks, applied to my block tree: https://github.com/stefanha/qemu/commits/block Stefan
diff --git a/dma-helpers.c b/dma-helpers.c index b521d84..9defc10 100644 --- a/dma-helpers.c +++ b/dma-helpers.c @@ -185,10 +185,17 @@ static void dma_aio_cancel(BlockAIOCB *acb) } } +static AioContext *dma_get_aio_context(BlockAIOCB *acb) +{ + DMAAIOCB *dbs = container_of(acb, DMAAIOCB, common); + + return dbs->ctx; +} static const AIOCBInfo dma_aiocb_info = { .aiocb_size = sizeof(DMAAIOCB), .cancel_async = dma_aio_cancel, + .get_aio_context = dma_get_aio_context, }; BlockAIOCB *dma_blk_io(AioContext *ctx,
Attempting to cancel a dma_blk_io() request causes an abort(3): void bdrv_aio_cancel(BlockAIOCB *acb) { ... while (acb->refcnt > 1) { if (acb->aiocb_info->get_aio_context) { aio_poll(acb->aiocb_info->get_aio_context(acb), true); } else if (acb->bs) { aio_poll(bdrv_get_aio_context(acb->bs), true); } else { abort(); } } ... } This happens because DMAAIOCB->bs is NULL and dma_aiocb_info.get_aio_context() is also NULL. This patch trivially implements dma_aiocb_info.get_aio_context() by fetching the DMAAIOCB->ctx field. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> --- dma-helpers.c | 7 +++++++ 1 file changed, 7 insertions(+)