summaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorDominique Martinet2022-06-30 03:01:37 +0200
committerStefan Hajnoczi2022-07-07 10:04:12 +0200
commitc06fc7ce147e57ab493bad9263f1601b8298484b (patch)
tree11e870f697e622bc13c34846e62892eb7bf168ea /block
parentMerge tag 'pull-ppc-20220706' of https://gitlab.com/danielhb/qemu into staging (diff)
downloadqemu-c06fc7ce147e57ab493bad9263f1601b8298484b.tar.gz
qemu-c06fc7ce147e57ab493bad9263f1601b8298484b.tar.xz
qemu-c06fc7ce147e57ab493bad9263f1601b8298484b.zip
io_uring: fix short read slow path
sqeq.off here is the offset to read within the disk image, so obviously not 'nread' (the amount we just read), but as the author meant to write its current value incremented by the amount we just read. Normally recent versions of linux will not issue short reads, but it can happen so we should fix this. This lead to weird image corruptions when short read happened Fixes: 6663a0a33764 ("block/io_uring: implements interfaces for io_uring") Link: https://lkml.kernel.org/r/YrrFGO4A1jS0GI0G@atmark-techno.com Signed-off-by: Dominique Martinet <dominique.martinet@atmark-techno.com> Message-Id: <20220630010137.2518851-1-dominique.martinet@atmark-techno.com> Reviewed-by: Hanna Reitz <hreitz@redhat.com> Reviewed-by: Stefano Garzarella <sgarzare@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'block')
-rw-r--r--block/io_uring.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/block/io_uring.c b/block/io_uring.c
index d48e472e74..b238661740 100644
--- a/block/io_uring.c
+++ b/block/io_uring.c
@@ -89,7 +89,7 @@ static void luring_resubmit_short_read(LuringState *s, LuringAIOCB *luringcb,
trace_luring_resubmit_short_read(s, luringcb, nread);
/* Update read position */
- luringcb->total_read = nread;
+ luringcb->total_read += nread;
remaining = luringcb->qiov->size - luringcb->total_read;
/* Shorten qiov */
@@ -103,7 +103,7 @@ static void luring_resubmit_short_read(LuringState *s, LuringAIOCB *luringcb,
remaining);
/* Update sqe */
- luringcb->sqeq.off = nread;
+ luringcb->sqeq.off += nread;
luringcb->sqeq.addr = (__u64)(uintptr_t)luringcb->resubmit_qiov.iov;
luringcb->sqeq.len = luringcb->resubmit_qiov.niov;