[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v6 01/22] ide/ahci: Check for -ECANCELED in aio call
From: |
Fam Zheng |
Subject: |
[Qemu-devel] [PATCH v6 01/22] ide/ahci: Check for -ECANCELED in aio callbacks |
Date: |
Thu, 11 Sep 2014 13:41:07 +0800 |
Before, bdrv_aio_cancel will either complete the request (like normal)
and call CB with an actual return code, or skip calling the request (for
example when the IO req is not submitted by thread pool yet).
We will change bdrv_aio_cancel to do it differently: always call CB
before return, with either [1] a normal req completion ret code, or [2]
ret == -ECANCELED. So the callers' callback must accept both cases. The
existing logic works with case [1], but not [2].
The simplest transition of callback code is do nothing in case [2], just
as if the CB is not called by the bdrv_aio_cancel() call.
Suggested-by: Paolo Bonzini <address@hidden>
Signed-off-by: Fam Zheng <address@hidden>
---
hw/ide/ahci.c | 3 +++
hw/ide/core.c | 12 ++++++++++++
2 files changed, 15 insertions(+)
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index 0ee713b..3067aa2 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -791,6 +791,9 @@ static void ncq_cb(void *opaque, int ret)
NCQTransferState *ncq_tfs = (NCQTransferState *)opaque;
IDEState *ide_state = &ncq_tfs->drive->port.ifs[0];
+ if (ret == -ECANCELED) {
+ return;
+ }
/* Clear bit for this tag in SActive */
ncq_tfs->drive->port_regs.scr_act &= ~(1 << ncq_tfs->tag);
diff --git a/hw/ide/core.c b/hw/ide/core.c
index 191f893..2f2d3b4 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
@@ -568,6 +568,9 @@ static void ide_sector_read_cb(void *opaque, int ret)
s->pio_aiocb = NULL;
s->status &= ~BUSY_STAT;
+ if (ret == -ECANCELED) {
+ return;
+ }
bdrv_acct_done(s->bs, &s->acct);
if (ret != 0) {
if (ide_handle_rw_error(s, -ret, IDE_RETRY_PIO |
@@ -677,6 +680,9 @@ void ide_dma_cb(void *opaque, int ret)
int64_t sector_num;
bool stay_active = false;
+ if (ret == -ECANCELED) {
+ return;
+ }
if (ret < 0) {
int op = IDE_RETRY_DMA;
@@ -802,6 +808,9 @@ static void ide_sector_write_cb(void *opaque, int ret)
IDEState *s = opaque;
int n;
+ if (ret == -ECANCELED) {
+ return;
+ }
bdrv_acct_done(s->bs, &s->acct);
s->pio_aiocb = NULL;
@@ -880,6 +889,9 @@ static void ide_flush_cb(void *opaque, int ret)
s->pio_aiocb = NULL;
+ if (ret == -ECANCELED) {
+ return;
+ }
if (ret < 0) {
/* XXX: What sector number to set here? */
if (ide_handle_rw_error(s, -ret, IDE_RETRY_FLUSH)) {
--
1.9.3
- [Qemu-devel] [PATCH v6 00/22] block: Asynchronous request cancellation, Fam Zheng, 2014/09/11
- [Qemu-devel] [PATCH v6 01/22] ide/ahci: Check for -ECANCELED in aio callbacks,
Fam Zheng <=
- [Qemu-devel] [PATCH v6 02/22] block: Add refcnt in BlockDriverAIOCB, Fam Zheng, 2014/09/11
- [Qemu-devel] [PATCH v6 03/22] block: Add bdrv_aio_cancel_async, Fam Zheng, 2014/09/11
- [Qemu-devel] [PATCH v6 04/22] block: Drop bdrv_em_co_aiocb_info.cancel, Fam Zheng, 2014/09/11
- [Qemu-devel] [PATCH v6 05/22] block: Drop bdrv_em_aiocb_info.cancel, Fam Zheng, 2014/09/11
- [Qemu-devel] [PATCH v6 06/22] thread-pool: Convert thread_pool_aiocb_info.cancel to cancel_async, Fam Zheng, 2014/09/11
- [Qemu-devel] [PATCH v6 07/22] linux-aio: Convert laio_aiocb_info.cancel to .cancel_async, Fam Zheng, 2014/09/11
- [Qemu-devel] [PATCH v6 08/22] dma: Convert dma_aiocb_info.cancel to .cancel_async, Fam Zheng, 2014/09/11
- [Qemu-devel] [PATCH v6 09/22] iscsi: Convert iscsi_aiocb_info.cancel to .cancel_async, Fam Zheng, 2014/09/11
- [Qemu-devel] [PATCH v6 10/22] archipelago: Drop archipelago_aiocb_info.cancel, Fam Zheng, 2014/09/11
- [Qemu-devel] [PATCH v6 11/22] blkdebug: Drop blkdebug_aiocb_info.cancel, Fam Zheng, 2014/09/11