lkml.org 
[lkml]   [2022]   [Jun]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 13/53] io_uring: dont re-import iovecs from callbacks
    Date
    From: Pavel Begunkov <asml.silence@gmail.com>

    We can't re-import or modify iterators from iocb callbacks, it's not
    safe as it might be reverted and/or reexpanded while unwinding stack.
    It's also not safe to resubmit as io-wq thread will race with stack
    undwinding for the iterator and other data.

    Disallow resubmission from callbacks, it can fail some cases that were
    handled before, but the possibility of such a failure was a part of the
    API from the beginning and so it should be fine.

    Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    fs/io_uring.c | 39 ---------------------------------------
    1 file changed, 39 deletions(-)

    --- a/fs/io_uring.c
    +++ b/fs/io_uring.c
    @@ -2579,45 +2579,6 @@ static void io_complete_rw_common(struct
    #ifdef CONFIG_BLOCK
    static bool io_resubmit_prep(struct io_kiocb *req, int error)
    {
    - struct iovec inline_vecs[UIO_FASTIOV], *iovec = inline_vecs;
    - ssize_t ret = -ECANCELED;
    - struct iov_iter iter;
    - int rw;
    -
    - if (error) {
    - ret = error;
    - goto end_req;
    - }
    -
    - switch (req->opcode) {
    - case IORING_OP_READV:
    - case IORING_OP_READ_FIXED:
    - case IORING_OP_READ:
    - rw = READ;
    - break;
    - case IORING_OP_WRITEV:
    - case IORING_OP_WRITE_FIXED:
    - case IORING_OP_WRITE:
    - rw = WRITE;
    - break;
    - default:
    - printk_once(KERN_WARNING "io_uring: bad opcode in resubmit %d\n",
    - req->opcode);
    - goto end_req;
    - }
    -
    - if (!req->async_data) {
    - ret = io_import_iovec(rw, req, &iovec, &iter, false);
    - if (ret < 0)
    - goto end_req;
    - ret = io_setup_async_rw(req, iovec, inline_vecs, &iter, false);
    - if (!ret)
    - return true;
    - kfree(iovec);
    - } else {
    - return true;
    - }
    -end_req:
    req_set_fail_links(req);
    return false;
    }

    \
     
     \ /
      Last update: 2022-06-03 19:55    [W:4.273 / U:0.960 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site