From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59784) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XRx8p-0002W5-La for qemu-devel@nongnu.org; Thu, 11 Sep 2014 01:42:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XRx8h-0005sH-HN for qemu-devel@nongnu.org; Thu, 11 Sep 2014 01:41:57 -0400 Received: from mx1.redhat.com ([209.132.183.28]:55272) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XRx8h-0005s9-9P for qemu-devel@nongnu.org; Thu, 11 Sep 2014 01:41:51 -0400 From: Fam Zheng Date: Thu, 11 Sep 2014 13:41:07 +0800 Message-Id: <1410414088-4419-2-git-send-email-famz@redhat.com> In-Reply-To: <1410414088-4419-1-git-send-email-famz@redhat.com> References: <1410414088-4419-1-git-send-email-famz@redhat.com> Subject: [Qemu-devel] [PATCH v6 01/22] ide/ahci: Check for -ECANCELED in aio callbacks List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Benoit Canet , Peter Lieven , Stefan Hajnoczi , Liu Yuan , Paolo Bonzini 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 Signed-off-by: Fam Zheng --- 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