Loading fs/io_uring.c +23 −11 Original line number Diff line number Diff line Loading @@ -3448,17 +3448,15 @@ static int io_buffer_add_list(struct io_ring_ctx *ctx, return xa_err(xa_store(&ctx->io_bl_xa, bgid, bl, GFP_KERNEL)); } static void __user *io_buffer_select(struct io_kiocb *req, size_t *len, static void __user *io_provided_buffer_select(struct io_kiocb *req, size_t *len, struct io_buffer_list *bl, unsigned int issue_flags) { struct io_buffer *kbuf = req->kbuf; struct io_ring_ctx *ctx = req->ctx; struct io_buffer_list *bl; struct io_buffer *kbuf; io_ring_submit_lock(req->ctx, issue_flags); if (list_empty(&bl->buf_list)) return ERR_PTR(-ENOBUFS); bl = io_buffer_get_list(ctx, req->buf_index); if (bl && !list_empty(&bl->buf_list)) { kbuf = list_first_entry(&bl->buf_list, struct io_buffer, list); list_del(&kbuf->list); if (*len > kbuf->len) Loading @@ -3469,10 +3467,24 @@ static void __user *io_buffer_select(struct io_kiocb *req, size_t *len, return u64_to_user_ptr(kbuf->addr); } static void __user *io_buffer_select(struct io_kiocb *req, size_t *len, unsigned int issue_flags) { struct io_ring_ctx *ctx = req->ctx; struct io_buffer_list *bl; io_ring_submit_lock(req->ctx, issue_flags); bl = io_buffer_get_list(ctx, req->buf_index); if (unlikely(!bl)) { io_ring_submit_unlock(req->ctx, issue_flags); return ERR_PTR(-ENOBUFS); } /* selection helpers drop the submit lock again, if needed */ return io_provided_buffer_select(req, len, bl, issue_flags); } #ifdef CONFIG_COMPAT static ssize_t io_compat_import(struct io_kiocb *req, struct iovec *iov, unsigned int issue_flags) Loading Loading
fs/io_uring.c +23 −11 Original line number Diff line number Diff line Loading @@ -3448,17 +3448,15 @@ static int io_buffer_add_list(struct io_ring_ctx *ctx, return xa_err(xa_store(&ctx->io_bl_xa, bgid, bl, GFP_KERNEL)); } static void __user *io_buffer_select(struct io_kiocb *req, size_t *len, static void __user *io_provided_buffer_select(struct io_kiocb *req, size_t *len, struct io_buffer_list *bl, unsigned int issue_flags) { struct io_buffer *kbuf = req->kbuf; struct io_ring_ctx *ctx = req->ctx; struct io_buffer_list *bl; struct io_buffer *kbuf; io_ring_submit_lock(req->ctx, issue_flags); if (list_empty(&bl->buf_list)) return ERR_PTR(-ENOBUFS); bl = io_buffer_get_list(ctx, req->buf_index); if (bl && !list_empty(&bl->buf_list)) { kbuf = list_first_entry(&bl->buf_list, struct io_buffer, list); list_del(&kbuf->list); if (*len > kbuf->len) Loading @@ -3469,10 +3467,24 @@ static void __user *io_buffer_select(struct io_kiocb *req, size_t *len, return u64_to_user_ptr(kbuf->addr); } static void __user *io_buffer_select(struct io_kiocb *req, size_t *len, unsigned int issue_flags) { struct io_ring_ctx *ctx = req->ctx; struct io_buffer_list *bl; io_ring_submit_lock(req->ctx, issue_flags); bl = io_buffer_get_list(ctx, req->buf_index); if (unlikely(!bl)) { io_ring_submit_unlock(req->ctx, issue_flags); return ERR_PTR(-ENOBUFS); } /* selection helpers drop the submit lock again, if needed */ return io_provided_buffer_select(req, len, bl, issue_flags); } #ifdef CONFIG_COMPAT static ssize_t io_compat_import(struct io_kiocb *req, struct iovec *iov, unsigned int issue_flags) Loading