diff options
author | Kevin Wolf <kwolf@redhat.com> | 2024-07-31 14:32:05 +0200 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2024-08-06 20:12:39 +0200 |
commit | 622a70161ac258e4a166a7dca4b5be267e0652d9 (patch) | |
tree | 9b38aaf40479c9d032c0a172173d9d6738b34892 /hw | |
parent | cfe0880835cd364b590ffd27ef8dbd2ad8838bc5 (diff) | |
download | qemu-622a70161ac258e4a166a7dca4b5be267e0652d9.zip qemu-622a70161ac258e4a166a7dca4b5be267e0652d9.tar.gz qemu-622a70161ac258e4a166a7dca4b5be267e0652d9.tar.bz2 |
scsi-block: Don't skip callback for sgio error status/driver_status
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>
Diffstat (limited to 'hw')
-rw-r--r-- | hw/scsi/scsi-disk.c | 10 |
1 files changed, 0 insertions, 10 deletions
diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c index 3ff6798..6e1a5c9 100644 --- a/hw/scsi/scsi-disk.c +++ b/hw/scsi/scsi-disk.c @@ -2832,16 +2832,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); |