[PATCH 4/6] scsi: bsg: report synchronous data copyback failures
From: Wang Yingjie
Date: Sun Oct 18 2026 - 11:43:15 EST
From: Yingjie Wang <x-professor@xxxxxxxxxxx>
scsi_bsg_sg_io_fn() ignores the result of blk_rq_unmap_user(). A
successful command can therefore return success even though copying READ
bounce data to userspace failed.
Preserve an earlier sense-buffer copy error and otherwise return the
data unmap error.
A virtio-scsi INQUIRY with an unaligned PROT_NONE destination returned
false success in 20/20 runs before this change and -EFAULT in 20/20 runs
afterward. Writable controls continued to succeed.
Fixes: 10e8855b9451 ("bsg: add SG_IO to SG v4")
Cc: stable@xxxxxxxxxxxxxxx
Assisted-by: LLM
Signed-off-by: Yingjie Wang <x-professor@xxxxxxxxxxx>
---
drivers/scsi/scsi_bsg.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/scsi/scsi_bsg.c b/drivers/scsi/scsi_bsg.c
index 4937bc494f79..f95dc5da7480 100644
--- a/drivers/scsi/scsi_bsg.c
+++ b/drivers/scsi/scsi_bsg.c
@@ -203,7 +203,7 @@ static int scsi_bsg_sg_io_fn(struct request_queue *q, struct sg_io_v4 *hdr,
u32 scsi_result, resid_len;
u8 sense_len;
bool is_read;
- int ret;
+ int ret, unmap_ret;
if (hdr->protocol != BSG_PROTOCOL_SCSI ||
hdr->subprotocol != BSG_SUB_PROTOCOL_SCSI_CMD)
@@ -285,7 +285,9 @@ static int scsi_bsg_sg_io_fn(struct request_queue *q, struct sg_io_v4 *hdr,
else
hdr->dout_resid = resid_len;
- blk_rq_unmap_user(bio);
+ unmap_ret = blk_rq_unmap_user(bio);
+ if (!ret)
+ ret = unmap_ret;
return ret;
out_put_request:
--
2.43.0