[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 04/59] ide/ahci: Check for -ECANCELED in aio callback
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PULL 04/59] ide/ahci: Check for -ECANCELED in aio callbacks |
Date: |
Fri, 19 Sep 2014 15:41:23 +0100 |
From: Fam Zheng <address@hidden>
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>
Signed-off-by: Stefan Hajnoczi <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 ba69de3..9e1a265 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 6fba056..f15c026 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;
+ }
block_acct_done(bdrv_get_stats(s->bs), &s->acct);
if (ret != 0) {
if (ide_handle_rw_error(s, -ret, IDE_RETRY_PIO |
@@ -678,6 +681,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;
@@ -803,6 +809,9 @@ static void ide_sector_write_cb(void *opaque, int ret)
IDEState *s = opaque;
int n;
+ if (ret == -ECANCELED) {
+ return;
+ }
block_acct_done(bdrv_get_stats(s->bs), &s->acct);
s->pio_aiocb = NULL;
@@ -882,6 +891,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] [PULL 00/59] Block patches, Stefan Hajnoczi, 2014/09/19
- [Qemu-devel] [PULL 01/59] block/vhdx.c: Mark parent_vhdx_guid variable as unused, Stefan Hajnoczi, 2014/09/19
- [Qemu-devel] [PULL 02/59] ide/atapi: Mark non-data commands as complete, Stefan Hajnoczi, 2014/09/19
- [Qemu-devel] [PULL 03/59] aio-win32: fix uninitialized use of have_select_revents, Stefan Hajnoczi, 2014/09/19
- [Qemu-devel] [PULL 04/59] ide/ahci: Check for -ECANCELED in aio callbacks,
Stefan Hajnoczi <=
- [Qemu-devel] [PULL 05/59] block: Add refcnt in BlockDriverAIOCB, Stefan Hajnoczi, 2014/09/19
- [Qemu-devel] [PULL 06/59] block: Add bdrv_aio_cancel_async, Stefan Hajnoczi, 2014/09/19
- [Qemu-devel] [PULL 07/59] block: Drop bdrv_em_co_aiocb_info.cancel, Stefan Hajnoczi, 2014/09/19
- [Qemu-devel] [PULL 08/59] block: Drop bdrv_em_aiocb_info.cancel, Stefan Hajnoczi, 2014/09/19
- [Qemu-devel] [PULL 09/59] thread-pool: Convert thread_pool_aiocb_info.cancel to cancel_async, Stefan Hajnoczi, 2014/09/19
- [Qemu-devel] [PULL 10/59] linux-aio: Convert laio_aiocb_info.cancel to .cancel_async, Stefan Hajnoczi, 2014/09/19
- [Qemu-devel] [PULL 11/59] dma: Convert dma_aiocb_info.cancel to .cancel_async, Stefan Hajnoczi, 2014/09/19
- [Qemu-devel] [PULL 12/59] iscsi: Convert iscsi_aiocb_info.cancel to .cancel_async, Stefan Hajnoczi, 2014/09/19
- [Qemu-devel] [PULL 13/59] archipelago: Drop archipelago_aiocb_info.cancel, Stefan Hajnoczi, 2014/09/19
- [Qemu-devel] [PULL 14/59] blkdebug: Drop blkdebug_aiocb_info.cancel, Stefan Hajnoczi, 2014/09/19