[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH v4 11/38] block: Fix BB AIOCB AioContext without BDS
From: |
Max Reitz |
Subject: |
[Qemu-block] [PATCH v4 11/38] block: Fix BB AIOCB AioContext without BDS |
Date: |
Mon, 20 Jul 2015 19:45:38 +0200 |
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 <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
Reviewed-by: Alberto Garcia <address@hidden>
---
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 c2ac2b9..b45f617 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),
};
@@ -541,6 +545,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);
@@ -814,7 +819,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.4.6
- [Qemu-block] [PATCH v4 01/38] block: Remove host floppy support, (continued)
- [Qemu-block] [PATCH v4 01/38] block: Remove host floppy support, Max Reitz, 2015/07/20
- [Qemu-block] [PATCH v4 02/38] blockdev: Allow creation of BDS trees without BB, Max Reitz, 2015/07/20
- [Qemu-block] [PATCH v4 03/38] iotests: Only create BB if necessary, Max Reitz, 2015/07/20
- [Qemu-block] [PATCH v4 04/38] block: Make bdrv_is_inserted() return a bool, Max Reitz, 2015/07/20
- [Qemu-block] [PATCH v4 05/38] block: Add blk_is_available(), Max Reitz, 2015/07/20
- [Qemu-block] [PATCH v4 06/38] block: Make bdrv_is_inserted() recursive, Max Reitz, 2015/07/20
- [Qemu-block] [PATCH v4 07/38] block/quorum: Implement bdrv_is_inserted(), Max Reitz, 2015/07/20
- [Qemu-block] [PATCH v4 08/38] block: Invoke change media CB before NULLing drv, Max Reitz, 2015/07/20
- [Qemu-block] [PATCH v4 10/38] hw/usb-storage: Check whether BB is inserted, Max Reitz, 2015/07/20
- [Qemu-block] [PATCH v4 09/38] hw/block/fdc: Implement tray status, Max Reitz, 2015/07/20
- [Qemu-block] [PATCH v4 11/38] block: Fix BB AIOCB AioContext without BDS,
Max Reitz <=
- [Qemu-block] [PATCH v4 12/38] block: Move guest_block_size into BlockBackend, Max Reitz, 2015/07/20
- [Qemu-block] [PATCH v4 13/38] block: Remove wr_highest_sector from BlockAcctStats, Max Reitz, 2015/07/20
- [Qemu-block] [PATCH v4 14/38] block: Move BlockAcctStats into BlockBackend, Max Reitz, 2015/07/20
- [Qemu-block] [PATCH v4 16/38] block: Add BlockBackendRootState, Max Reitz, 2015/07/20
- [Qemu-block] [PATCH v4 15/38] block: Move I/O status and error actions into BB, Max Reitz, 2015/07/20
- [Qemu-block] [PATCH v4 17/38] block: Make some BB functions fall back to BBRS, Max Reitz, 2015/07/20
- [Qemu-block] [PATCH v4 18/38] block: Fail requests to empty BlockBackend, Max Reitz, 2015/07/20
- [Qemu-block] [PATCH v4 20/38] block: Add blk_insert_bs(), Max Reitz, 2015/07/20
- [Qemu-block] [PATCH v4 21/38] block: Prepare for NULL BDS, Max Reitz, 2015/07/20
- [Qemu-block] [PATCH v4 22/38] blockdev: Do not create BDS for empty drive, Max Reitz, 2015/07/20