Re: [Qemu-devel] [PATCH 05/50] block: Fix BB AIOCB AioContext without BDS

2015-01-27 Thread Eric Blake
On 01/26/2015 09:02 AM, Max Reitz wrote:
 Fix the BlockBackend's AIOCB AioContext for aborting AIO in case there
 is no BDS. If there is no implementation of AIOCBInfo::get_aio_context()
 the AioContext is derived from the BDS the AIOCB belongs to. If that BDS
 is NULL (because it has been removed from the BB) this will not work.
 
 This patch makes blk_get_aio_context() fall back to the main loop
 context if the BDS pointer is NULL and implements
 AIOCBInfo::get_aio_context() (blk_aiocb_get_aio_context()) which invokes
 blk_get_aio_context().
 
 Signed-off-by: Max Reitz mre...@redhat.com
 ---
  block/block-backend.c | 17 -
  1 file changed, 16 insertions(+), 1 deletion(-)
 

Reviewed-by: Eric Blake ebl...@redhat.com

-- 
Eric Blake   eblake redhat com+1-919-301-3266
Libvirt virtualization library http://libvirt.org



signature.asc
Description: OpenPGP digital signature


[Qemu-devel] [PATCH 05/50] block: Fix BB AIOCB AioContext without BDS

2015-01-26 Thread Max Reitz
Fix the BlockBackend's AIOCB AioContext for aborting AIO in case there
is no BDS. If there is no implementation of AIOCBInfo::get_aio_context()
the AioContext is derived from the BDS the AIOCB belongs to. If that BDS
is NULL (because it has been removed from the BB) this will not work.

This patch makes blk_get_aio_context() fall back to the main loop
context if the BDS pointer is NULL and implements
AIOCBInfo::get_aio_context() (blk_aiocb_get_aio_context()) which invokes
blk_get_aio_context().

Signed-off-by: Max Reitz mre...@redhat.com
---
 block/block-backend.c | 17 -
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/block/block-backend.c b/block/block-backend.c
index 96a5bc6..4c40747 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -18,6 +18,8 @@
 /* Number of coroutines to reserve per attached device model */
 #define COROUTINE_POOL_RESERVATION 64
 
+static AioContext *blk_aiocb_get_aio_context(BlockAIOCB *acb);
+
 struct BlockBackend {
 char *name;
 int refcnt;
@@ -34,10 +36,12 @@ struct BlockBackend {
 typedef struct BlockBackendAIOCB {
 BlockAIOCB common;
 QEMUBH *bh;
+BlockBackend *blk;
 int ret;
 } BlockBackendAIOCB;
 
 static const AIOCBInfo block_backend_aiocb_info = {
+.get_aio_context = blk_aiocb_get_aio_context,
 .aiocb_size = sizeof(BlockBackendAIOCB),
 };
 
@@ -530,6 +534,7 @@ static BlockAIOCB *abort_aio_request(BlockBackend *blk, 
BlockCompletionFunc *cb,
 QEMUBH *bh;
 
 acb = blk_aio_get(block_backend_aiocb_info, blk, cb, opaque);
+acb-blk = blk;
 acb-ret = ret;
 
 bh = aio_bh_new(blk_get_aio_context(blk), error_callback_bh, acb);
@@ -783,7 +788,17 @@ void blk_op_unblock_all(BlockBackend *blk, Error *reason)
 
 AioContext *blk_get_aio_context(BlockBackend *blk)
 {
-return bdrv_get_aio_context(blk-bs);
+if (blk-bs) {
+return bdrv_get_aio_context(blk-bs);
+} else {
+return qemu_get_aio_context();
+}
+}
+
+static AioContext *blk_aiocb_get_aio_context(BlockAIOCB *acb)
+{
+BlockBackendAIOCB *blk_acb = DO_UPCAST(BlockBackendAIOCB, common, acb);
+return blk_get_aio_context(blk_acb-blk);
 }
 
 void blk_set_aio_context(BlockBackend *blk, AioContext *new_context)
-- 
2.1.0