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)
(Mjt: also remove locking code which has been removed by
v8.2.0-126-g1404226804 "scsi: don't lock AioContext in I/O code path")
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
} else {
ret = io_hdr->status;
}
-
- if (ret > 0) {
- aio_context_acquire(blk_get_aio_context(s->conf.blk));
- if (scsi_handle_rw_error(r, ret, true)) {
- aio_context_release(blk_get_aio_context(s->conf.blk));
- scsi_req_unref(&r->req);
- return;
- }
- aio_context_release(blk_get_aio_context(s->conf.blk));
-
- /* Ignore error. */
- ret = 0;
- }
}
req->cb(req->cb_opaque, ret);