[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH 4/9] linux-aio: Implement .cancel_async
From: |
Fam Zheng |
Subject: |
[Qemu-devel] [RFC PATCH 4/9] linux-aio: Implement .cancel_async |
Date: |
Thu, 21 Aug 2014 19:56:51 +0800 |
Just call io_cancel (2), if it fails, it means the request is not
canceled, so the event loop will eventually call
qemu_laio_process_completion.
In qemu_laio_process_completion, change to call the cb unconditionally.
It is required by .cancel_async, and also acceptable by .cancel.
Signed-off-by: Fam Zheng <address@hidden>
---
block/linux-aio.c | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/block/linux-aio.c b/block/linux-aio.c
index 7ac7e8c..adf3b2e 100644
--- a/block/linux-aio.c
+++ b/block/linux-aio.c
@@ -79,9 +79,8 @@ static void qemu_laio_process_completion(struct
qemu_laio_state *s,
ret = -EINVAL;
}
}
-
- laiocb->common.cb(laiocb->common.opaque, ret);
}
+ laiocb->common.cb(laiocb->common.opaque, ret);
qemu_aio_release(laiocb);
}
@@ -110,6 +109,22 @@ static void qemu_laio_completion_cb(EventNotifier *e)
}
}
+static void laio_cancel_async(BlockDriverAIOCB *blockacb)
+{
+ struct qemu_laiocb *laiocb = (struct qemu_laiocb *)blockacb;
+ struct io_event event;
+ int ret;
+
+ ret = io_cancel(laiocb->ctx->ctx, &laiocb->iocb, &event);
+ laiocb->ret = -ECANCELED;
+ if (!ret) {
+ /* iocb is not cancelled, cb will be called by the event loop later */
+ return;
+ }
+
+ laiocb->common.cb(laiocb->common.opaque, laiocb->ret);
+}
+
static void laio_cancel(BlockDriverAIOCB *blockacb)
{
struct qemu_laiocb *laiocb = (struct qemu_laiocb *)blockacb;
@@ -145,6 +160,7 @@ static void laio_cancel(BlockDriverAIOCB *blockacb)
static const AIOCBInfo laio_aiocb_info = {
.aiocb_size = sizeof(struct qemu_laiocb),
.cancel = laio_cancel,
+ .cancel_async = laio_cancel_async,
};
static void ioq_init(LaioQueue *io_q)
--
2.0.3
- [Qemu-devel] [RFC PATCH 0/9] scsi, block: Asynchronous request cancellation, Fam Zheng, 2014/08/21
- [Qemu-devel] [RFC PATCH 1/9] block: Add bdrv_aio_cancel_async, Fam Zheng, 2014/08/21
- [Qemu-devel] [RFC PATCH 2/9] tests: Add testing code for bdrv_aio_cancel_async, Fam Zheng, 2014/08/21
- [Qemu-devel] [RFC PATCH 3/9] iscsi: Implement .cancel_async in acb info, Fam Zheng, 2014/08/21
- [Qemu-devel] [RFC PATCH 4/9] linux-aio: Implement .cancel_async,
Fam Zheng <=
- [Qemu-devel] [RFC PATCH 5/9] thread-pool: Implement .cancel_async, Fam Zheng, 2014/08/21
- [Qemu-devel] [RFC PATCH 7/9] dma: Implement .cancel_async, Fam Zheng, 2014/08/21
- [Qemu-devel] [RFC PATCH 8/9] block: Implement stub bdrv_em_co_aiocb_info.cancel_async, Fam Zheng, 2014/08/21
- [Qemu-devel] [RFC PATCH 6/9] blkdebug: Implement .cancel_async, Fam Zheng, 2014/08/21