[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 06/13] scsi-disk: Add warning comments that host_status errors tak
From: |
Kevin Wolf |
Subject: |
[PULL 06/13] scsi-disk: Add warning comments that host_status errors take a shortcut |
Date: |
Mon, 5 Aug 2024 23:08:44 +0200 |
scsi_block_sgio_complete() has surprising behaviour in that there are
error cases in which it directly completes the request and never calls
the passed callback. In the current state of the code, this doesn't seem
to result in bugs, but with future code changes, we must be careful to
never rely on the callback doing some cleanup until this code smell is
fixed. For now, just add warnings to make people aware of the trap.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
Message-ID: <20240731123207.27636-4-kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
hw/scsi/scsi-disk.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
index 6e1a5c98df..69a195177e 100644
--- a/hw/scsi/scsi-disk.c
+++ b/hw/scsi/scsi-disk.c
@@ -68,6 +68,9 @@ struct SCSIDiskClass {
/*
* Callbacks receive ret == 0 for success. Errors are represented either as
* negative errno values, or as positive SAM status codes.
+ *
+ * Beware: For errors returned in host_status, the function may directly
+ * complete the request and never call the callback.
*/
DMAIOFunc *dma_readv;
DMAIOFunc *dma_writev;
@@ -381,6 +384,7 @@ done:
scsi_req_unref(&r->req);
}
+/* May not be called in all error cases, don't rely on cleanup here */
static void scsi_dma_complete(void *opaque, int ret)
{
SCSIDiskReq *r = (SCSIDiskReq *)opaque;
@@ -421,6 +425,7 @@ done:
scsi_req_unref(&r->req);
}
+/* May not be called in all error cases, don't rely on cleanup here */
static void scsi_read_complete(void *opaque, int ret)
{
SCSIDiskReq *r = (SCSIDiskReq *)opaque;
@@ -560,6 +565,7 @@ done:
scsi_req_unref(&r->req);
}
+/* May not be called in all error cases, don't rely on cleanup here */
static void scsi_write_complete(void * opaque, int ret)
{
SCSIDiskReq *r = (SCSIDiskReq *)opaque;
@@ -2821,6 +2827,7 @@ static void scsi_block_sgio_complete(void *opaque, int
ret)
sg_io_hdr_t *io_hdr = &req->io_header;
if (ret == 0) {
+ /* FIXME This skips calling req->cb() and any cleanup in it */
if (io_hdr->host_status != SCSI_HOST_OK) {
scsi_req_complete_failed(&r->req, io_hdr->host_status);
scsi_req_unref(&r->req);
--
2.45.2
- [PULL 00/13] Block layer patches, Kevin Wolf, 2024/08/05
- [PULL 01/13] qapi-block-core: Clean up blockdev-snapshot-internal-sync doc, Kevin Wolf, 2024/08/05
- [PULL 02/13] block-copy: Fix missing graph lock, Kevin Wolf, 2024/08/05
- [PULL 05/13] scsi-block: Don't skip callback for sgio error status/driver_status, Kevin Wolf, 2024/08/05
- [PULL 06/13] scsi-disk: Add warning comments that host_status errors take a shortcut,
Kevin Wolf <=
- [PULL 03/13] block/graph-lock: Make WITH_GRAPH_RDLOCK_GUARD() fully checked, Kevin Wolf, 2024/08/05
- [PULL 04/13] scsi-disk: Use positive return value for status in dma_readv/writev, Kevin Wolf, 2024/08/05
- [PULL 08/13] vvfat: Fix bug in writing to middle of file, Kevin Wolf, 2024/08/05
- [PULL 07/13] scsi-disk: Always report RESERVATION_CONFLICT to guest, Kevin Wolf, 2024/08/05
- [PULL 10/13] vvfat: Fix wrong checks for cluster mappings invariant, Kevin Wolf, 2024/08/05
- [PULL 09/13] vvfat: Fix usage of `info.file.offset`, Kevin Wolf, 2024/08/05
- [PULL 13/13] iotests/024: exclude 'backing file format' field from the output, Kevin Wolf, 2024/08/05
- [PULL 11/13] vvfat: Fix reading files with non-continuous clusters, Kevin Wolf, 2024/08/05
- [PULL 12/13] iotests: Add `vvfat` tests, Kevin Wolf, 2024/08/05
- Re: [PULL 00/13] Block layer patches, Richard Henderson, 2024/08/06