9ae3a8
From 4fbb16d71e7e9a893c665926642122b165c63425 Mon Sep 17 00:00:00 2001
9ae3a8
From: John Snow <jsnow@redhat.com>
9ae3a8
Date: Wed, 26 Apr 2017 23:49:07 +0200
9ae3a8
Subject: [PATCH] ide: fix halted IO segfault at reset
9ae3a8
9ae3a8
RH-Author: John Snow <jsnow@redhat.com>
9ae3a8
Message-id: <20170426234907.21151-2-jsnow@redhat.com>
9ae3a8
Patchwork-id: 74905
9ae3a8
O-Subject: [RHEL-7.4 qemu-kvm PATCH v2 1/1] ide: fix halted IO segfault at reset
9ae3a8
Bugzilla: 1299875
9ae3a8
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
9ae3a8
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
9ae3a8
RH-Acked-by: Markus Armbruster <armbru@redhat.com>
9ae3a8
9ae3a8
If one attempts to perform a system_reset after a failed IO request
9ae3a8
that causes the VM to enter a paused state, QEMU will segfault trying
9ae3a8
to free up the pending IO requests.
9ae3a8
9ae3a8
These requests have already been completed and freed, though, so all
9ae3a8
we need to do is NULL them before we enter the paused state.
9ae3a8
9ae3a8
Existing AHCI tests verify that halted requests are still resumed
9ae3a8
successfully after a STOP event.
9ae3a8
9ae3a8
Analyzed-by: Laszlo Ersek <lersek@redhat.com>
9ae3a8
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
9ae3a8
Signed-off-by: John Snow <jsnow@redhat.com>
9ae3a8
Message-id: 1469635201-11918-2-git-send-email-jsnow@redhat.com
9ae3a8
Signed-off-by: John Snow <jsnow@redhat.com>
9ae3a8
(cherry picked from commit 87ac25fd1fed05a30a93d27dbeb2a4c4b83ec95f)
9ae3a8
Signed-off-by: John Snow <jsnow@redhat.com>
9ae3a8
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
9ae3a8
Conflicts:
9ae3a8
  hw/ide/core.c: Context and formatting of handle_rw_error
9ae3a8
---
9ae3a8
 hw/ide/core.c | 1 +
9ae3a8
 1 file changed, 1 insertion(+)
9ae3a8
9ae3a8
diff --git a/hw/ide/core.c b/hw/ide/core.c
9ae3a8
index 5d40093..5c33735 100644
9ae3a8
--- a/hw/ide/core.c
9ae3a8
+++ b/hw/ide/core.c
9ae3a8
@@ -658,6 +658,7 @@ void ide_dma_cb(void *opaque, int ret)
9ae3a8
             op |= BM_STATUS_RETRY_TRIM;
9ae3a8
 
9ae3a8
         if (ide_handle_rw_error(s, -ret, op)) {
9ae3a8
+            s->bus->dma->aiocb = NULL;
9ae3a8
             return;
9ae3a8
         }
9ae3a8
     }
9ae3a8
-- 
9ae3a8
1.8.3.1
9ae3a8