summaryrefslogtreecommitdiff
path: root/io_uring
diff options
context:
space:
mode:
authorPavel Begunkov2025-02-10 17:27:56 +0000
committerGreg Kroah-Hartman2025-02-21 13:49:53 +0100
commit58d38d324589ea99bcdba1b5f085ef3a3310ccb8 (patch)
treeb31e42b9cf8ae35fe1d02f78c1009646533c2b3c /io_uring
parenta1b17713b32c75a90132ea2f92b1257f3bbc20f3 (diff)
io_uring/rw: commit provided buffer state on async
When we get -EIOCBQUEUED, we need to ensure that the buffer is consumed from the provided buffer ring, which can be done with io_kbuf_recycle() + REQ_F_PARTIAL_IO. Reported-by: Muhammad Ramdhan <ramdhan@starlabs.sg> Reported-by: Bing-Jhong Billy Jheng <billy@starlabs.sg> Reported-by: Jacob Soo <jacob.soo@starlabs.sg> Fixes: c7fb19428d67d ("io_uring: add support for ring mapped supplied buffers") Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'io_uring')
-rw-r--r--io_uring/rw.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/io_uring/rw.c b/io_uring/rw.c
index 692663bd864f..b75f62dccce6 100644
--- a/io_uring/rw.c
+++ b/io_uring/rw.c
@@ -772,6 +772,8 @@ static int __io_read(struct io_kiocb *req, unsigned int issue_flags)
goto done;
ret = 0;
} else if (ret == -EIOCBQUEUED) {
+ req->flags |= REQ_F_PARTIAL_IO;
+ io_kbuf_recycle(req, issue_flags);
if (iovec)
kfree(iovec);
return IOU_ISSUE_SKIP_COMPLETE;
@@ -795,6 +797,9 @@ static int __io_read(struct io_kiocb *req, unsigned int issue_flags)
goto done;
}
+ req->flags |= REQ_F_PARTIAL_IO;
+ io_kbuf_recycle(req, issue_flags);
+
io = req->async_data;
s = &io->s;
/*
@@ -935,6 +940,11 @@ int io_write(struct io_kiocb *req, unsigned int issue_flags)
else
ret2 = -EINVAL;
+ if (ret2 == -EIOCBQUEUED) {
+ req->flags |= REQ_F_PARTIAL_IO;
+ io_kbuf_recycle(req, issue_flags);
+ }
+
if (req->flags & REQ_F_REISSUE) {
req->flags &= ~REQ_F_REISSUE;
ret2 = -EAGAIN;