@@ -27,7 +27,7 @@ struct io_rsrc_update {
};
static struct io_rsrc_node *io_sqe_buffer_register(struct io_ring_ctx *ctx,
- struct iovec *iov, struct page **last_hpage);
+ struct iovec *iov, struct page **last_hpage, u64 tag);
/* only define max */
#define IORING_MAX_FIXED_FILES (1U << 20)
@@ -311,18 +311,11 @@ static int __io_sqe_buffers_update(struct io_ring_ctx *ctx,
err = io_buffer_validate(iov);
if (err)
break;
- node = io_sqe_buffer_register(ctx, iov, &last_hpage);
+ node = io_sqe_buffer_register(ctx, iov, &last_hpage, tag);
if (IS_ERR(node)) {
err = PTR_ERR(node);
break;
}
- if (tag) {
- if (!node) {
- err = -EINVAL;
- break;
- }
- node->tag = tag;
- }
i = array_index_nospec(up->offset + done, ctx->buf_table.nr);
io_reset_rsrc_node(ctx, &ctx->buf_table, i);
ctx->buf_table.nodes[i] = node;
@@ -771,7 +764,8 @@ bool io_check_coalesce_buffer(struct page **page_array, int nr_pages,
static struct io_rsrc_node *io_sqe_buffer_register(struct io_ring_ctx *ctx,
struct iovec *iov,
- struct page **last_hpage)
+ struct page **last_hpage,
+ u64 tag)
{
struct io_mapped_ubuf *imu = NULL;
struct page **pages = NULL;
@@ -782,12 +776,16 @@ static struct io_rsrc_node *io_sqe_buffer_register(struct io_ring_ctx *ctx,
struct io_imu_folio_data data;
bool coalesced = false;
- if (!iov->iov_base)
+ if (!iov->iov_base) {
+ if (tag)
+ return ERR_PTR(-EINVAL);
return NULL;
+ }
node = io_rsrc_node_alloc(ctx, IORING_RSRC_BUFFER);
if (!node)
return ERR_PTR(-ENOMEM);
+ node->tag = tag;
ret = -ENOMEM;
pages = io_pin_pages((unsigned long) iov->iov_base, iov->iov_len,
@@ -899,18 +897,11 @@ int io_sqe_buffers_register(struct io_ring_ctx *ctx, void __user *arg,
}
}
- node = io_sqe_buffer_register(ctx, iov, &last_hpage);
+ node = io_sqe_buffer_register(ctx, iov, &last_hpage, tag);
if (IS_ERR(node)) {
ret = PTR_ERR(node);
break;
}
- if (tag) {
- if (!node) {
- ret = -EINVAL;
- break;
- }
- node->tag = tag;
- }
data.nodes[i] = node;
}
Move tag handling into io_sqe_buffer_register() so that we don't need to duplicate it. Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> --- io_uring/rsrc.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-)