Add io_uring_cmd_get_buffer_info() to fetch buffer information that will be necessary for constructing an iov iter for it. Signed-off-by: Joanne Koong --- include/linux/io_uring/cmd.h | 2 ++ io_uring/rsrc.c | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/include/linux/io_uring/cmd.h b/include/linux/io_uring/cmd.h index 7509025b4071..a92e810f37f9 100644 --- a/include/linux/io_uring/cmd.h +++ b/include/linux/io_uring/cmd.h @@ -177,4 +177,6 @@ int io_buffer_register_bvec(struct io_uring_cmd *cmd, struct request *rq, int io_buffer_unregister_bvec(struct io_uring_cmd *cmd, unsigned int index, unsigned int issue_flags); +int io_uring_cmd_get_buffer_info(struct io_uring_cmd *cmd, u64 *ubuf, + unsigned int *len); #endif /* _LINUX_IO_URING_CMD_H */ diff --git a/io_uring/rsrc.c b/io_uring/rsrc.c index d787c16dc1c3..8554cdad8abc 100644 --- a/io_uring/rsrc.c +++ b/io_uring/rsrc.c @@ -1569,3 +1569,24 @@ int io_prep_reg_iovec(struct io_kiocb *req, struct iou_vec *iv, req->flags |= REQ_F_IMPORT_BUFFER; return 0; } + +int io_uring_cmd_get_buffer_info(struct io_uring_cmd *cmd, u64 *ubuf, + unsigned int *len) +{ + struct io_ring_ctx *ctx = cmd_to_io_kiocb(cmd)->ctx; + struct io_rsrc_data *data = &ctx->buf_table; + struct io_mapped_ubuf *imu; + unsigned int buf_index; + + if (!data->nr) + return -EINVAL; + + buf_index = cmd->sqe->buf_index; + imu = data->nodes[buf_index]->buf; + + *ubuf = imu->ubuf; + *len = imu->len; + + return 0; +} +EXPORT_SYMBOL_GPL(io_uring_cmd_get_buffer_info); -- 2.47.3