| From stable+bounces-114700-greg=kroah.com@vger.kernel.org Mon Feb 10 18:27:18 2025 |
| From: Pavel Begunkov <asml.silence@gmail.com> |
| Date: Mon, 10 Feb 2025 17:27:56 +0000 |
| Subject: io_uring/rw: commit provided buffer state on async |
| To: stable@vger.kernel.org |
| Cc: Muhammad Ramdhan <ramdhan@starlabs.sg>, Bing-Jhong Billy Jheng <billy@starlabs.sg>, Jacob Soo <jacob.soo@starlabs.sg>, Jens Axboe <axboe@kernel.dk>, Pavel Begunkov <asml.silence@gmail.com> |
| Message-ID: <71404cdcc823638709aa44ee2137cd444fc708ad.1739208415.git.asml.silence@gmail.com> |
| |
| From: Pavel Begunkov <asml.silence@gmail.com> |
| |
| 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> |
| --- |
| io_uring/rw.c | 10 ++++++++++ |
| 1 file changed, 10 insertions(+) |
| |
| --- a/io_uring/rw.c |
| +++ b/io_uring/rw.c |
| @@ -772,6 +772,8 @@ static int __io_read(struct io_kiocb *re |
| 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 *re |
| 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, unsig |
| 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; |