]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
io_uring/rw: commit provided buffer state on async
authorPavel Begunkov <asml.silence@gmail.com>
Mon, 10 Feb 2025 17:27:56 +0000 (17:27 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Feb 2025 12:49:53 +0000 (13:49 +0100)
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

index 692663bd864fbd01d813b11a615fb6219d45774a..b75f62dccce6c9a62c4f330ae59dfe91eb057f9d 100644 (file)
@@ -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;