61 lines
2.1 KiB
Diff
61 lines
2.1 KiB
Diff
|
From d580b83d9eda7802ffa3890ea8641793fe78937c Mon Sep 17 00:00:00 2001
|
||
|
From: Kevin Wolf <kwolf@redhat.com>
|
||
|
Date: Wed, 31 Jul 2024 14:32:05 +0200
|
||
|
Subject: [PATCH 094/100] scsi-block: Don't skip callback for sgio error
|
||
|
status/driver_status
|
||
|
|
||
|
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||
|
RH-MergeRequest: 261: scsi-block: Fix error handling with r/werror=stop
|
||
|
RH-Jira: RHEL-50000
|
||
|
RH-Acked-by: Hanna Czenczek <hreitz@redhat.com>
|
||
|
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||
|
RH-Commit: [2/4] 1fee1b21dae314f4f34c88f2d2fabd7af011404a (kmwolf/centos-qemu-kvm)
|
||
|
|
||
|
Instead of calling into scsi_handle_rw_error() directly from
|
||
|
scsi_block_sgio_complete() and skipping the normal callback, go through
|
||
|
the normal cleanup path by calling the callback with a positive error
|
||
|
value.
|
||
|
|
||
|
The important difference here is not only that the code path is cleaner,
|
||
|
but that the callbacks set r->req.aiocb = NULL. If we skip setting this
|
||
|
and the error action is BLOCK_ERROR_ACTION_STOP, resuming the VM runs
|
||
|
into an assertion failure in scsi_read_data() or scsi_write_data()
|
||
|
because the dangling aiocb pointer is unexpected.
|
||
|
|
||
|
Fixes: a108557bbf ("scsi: inline sg_io_sense_from_errno() into the callers.")
|
||
|
Buglink: https://issues.redhat.com/browse/RHEL-50000
|
||
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||
|
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
||
|
Message-ID: <20240731123207.27636-3-kwolf@redhat.com>
|
||
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||
|
(cherry picked from commit 622a70161ac258e4a166a7dca4b5be267e0652d9)
|
||
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||
|
---
|
||
|
hw/scsi/scsi-disk.c | 10 ----------
|
||
|
1 file changed, 10 deletions(-)
|
||
|
|
||
|
diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
|
||
|
index bed2c8746c..e7f57f3230 100644
|
||
|
--- a/hw/scsi/scsi-disk.c
|
||
|
+++ b/hw/scsi/scsi-disk.c
|
||
|
@@ -2804,16 +2804,6 @@ static void scsi_block_sgio_complete(void *opaque, int ret)
|
||
|
} else {
|
||
|
ret = io_hdr->status;
|
||
|
}
|
||
|
-
|
||
|
- if (ret > 0) {
|
||
|
- if (scsi_handle_rw_error(r, ret, true)) {
|
||
|
- scsi_req_unref(&r->req);
|
||
|
- return;
|
||
|
- }
|
||
|
-
|
||
|
- /* Ignore error. */
|
||
|
- ret = 0;
|
||
|
- }
|
||
|
}
|
||
|
|
||
|
req->cb(req->cb_opaque, ret);
|
||
|
--
|
||
|
2.39.3
|
||
|
|