Add a new helper called io_install_buffer(), which will be used later for operations willing to install buffers into the registered buffer table. Signed-off-by: Pavel Begunkov <asml.silence@xxxxxxxxx> --- io_uring/rsrc.c | 15 +++++++++++++++ io_uring/rsrc.h | 3 +++ 2 files changed, 18 insertions(+) diff --git a/io_uring/rsrc.c b/io_uring/rsrc.c index 3799470fd45e..db4286b42dce 100644 --- a/io_uring/rsrc.c +++ b/io_uring/rsrc.c @@ -517,6 +517,21 @@ static int __io_sqe_buffers_update(struct io_ring_ctx *ctx, return done ? done : err; } +int io_install_buffer(struct io_ring_ctx *ctx, + struct io_mapped_ubuf *imu, + unsigned i) +{ + if (unlikely(i >= ctx->nr_user_bufs)) + return -EFAULT; + + i = array_index_nospec(i, ctx->nr_user_bufs); + if (unlikely(ctx->user_bufs[i] != ctx->dummy_ubuf)) + return -EINVAL; + + ctx->user_bufs[i] = imu; + return 0; +} + static int __io_register_rsrc_update(struct io_ring_ctx *ctx, unsigned type, struct io_uring_rsrc_update2 *up, unsigned nr_args) diff --git a/io_uring/rsrc.h b/io_uring/rsrc.h index 29ce9a8a2277..aba95bdd060e 100644 --- a/io_uring/rsrc.h +++ b/io_uring/rsrc.h @@ -75,6 +75,9 @@ void __io_sqe_buffers_unregister(struct io_ring_ctx *ctx); int io_sqe_buffers_unregister(struct io_ring_ctx *ctx); int io_sqe_buffers_register(struct io_ring_ctx *ctx, void __user *arg, unsigned int nr_args, u64 __user *tags); +int io_install_buffer(struct io_ring_ctx *ctx, struct io_mapped_ubuf *imu, + unsigned i); + void __io_sqe_files_unregister(struct io_ring_ctx *ctx); int io_sqe_files_unregister(struct io_ring_ctx *ctx); int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg, -- 2.40.0