summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorPavel Begunkov <asml.silence@gmail.com>2021-01-15 17:37:49 +0000
committerJens Axboe <axboe@kernel.dk>2021-02-01 10:02:42 -0700
commitbc9744cd162b2f6c38d75dc49c310677dc13afa8 (patch)
treea751ee35d7dd531f90d11765f37a2c2b194ae337 /fs
parent6802535df7bf807c94de32a9d0bf0401d3109671 (diff)
downloadlinux-bc9744cd162b2f6c38d75dc49c310677dc13afa8.tar.bz2
io_uring: split ref_node alloc and init
A simple prep patch allowing to set refnode callbacks after it was allocated. This needed to 1) keep ourself off of hi-level functions where it's not pretty and they are not necessary 2) amortise ref_node allocation in the future, e.g. for updates. Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs')
-rw-r--r--fs/io_uring.c24
1 files changed, 11 insertions, 13 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c
index ab5bf1bf0779..bb51f2abd009 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -1009,8 +1009,10 @@ static void __io_uring_cancel_task_requests(struct io_ring_ctx *ctx,
struct task_struct *task);
static void destroy_fixed_rsrc_ref_node(struct fixed_rsrc_ref_node *ref_node);
-static struct fixed_rsrc_ref_node *alloc_fixed_file_ref_node(
+static struct fixed_rsrc_ref_node *alloc_fixed_rsrc_ref_node(
struct io_ring_ctx *ctx);
+static void init_fixed_file_ref_node(struct io_ring_ctx *ctx,
+ struct fixed_rsrc_ref_node *ref_node);
static void __io_complete_rw(struct io_kiocb *req, long res, long res2,
struct io_comp_state *cs);
@@ -7380,9 +7382,10 @@ static int io_sqe_files_unregister(struct io_ring_ctx *ctx)
if (!data)
return -ENXIO;
- backup_node = alloc_fixed_file_ref_node(ctx);
+ backup_node = alloc_fixed_rsrc_ref_node(ctx);
if (!backup_node)
return -ENOMEM;
+ init_fixed_file_ref_node(ctx, backup_node);
io_rsrc_ref_lock(ctx);
ref_node = data->node;
@@ -7819,18 +7822,11 @@ static struct fixed_rsrc_ref_node *alloc_fixed_rsrc_ref_node(
return ref_node;
}
-static struct fixed_rsrc_ref_node *alloc_fixed_file_ref_node(
- struct io_ring_ctx *ctx)
+static void init_fixed_file_ref_node(struct io_ring_ctx *ctx,
+ struct fixed_rsrc_ref_node *ref_node)
{
- struct fixed_rsrc_ref_node *ref_node;
-
- ref_node = alloc_fixed_rsrc_ref_node(ctx);
- if (!ref_node)
- return NULL;
-
ref_node->rsrc_data = ctx->file_data;
ref_node->rsrc_put = io_ring_file_put;
- return ref_node;
}
static void destroy_fixed_rsrc_ref_node(struct fixed_rsrc_ref_node *ref_node)
@@ -7915,11 +7911,12 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
return ret;
}
- ref_node = alloc_fixed_file_ref_node(ctx);
+ ref_node = alloc_fixed_rsrc_ref_node(ctx);
if (!ref_node) {
io_sqe_files_unregister(ctx);
return -ENOMEM;
}
+ init_fixed_file_ref_node(ctx, ref_node);
io_sqe_rsrc_set_node(ctx, file_data, ref_node);
return ret;
@@ -8022,9 +8019,10 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,
if (done > ctx->nr_user_files)
return -EINVAL;
- ref_node = alloc_fixed_file_ref_node(ctx);
+ ref_node = alloc_fixed_rsrc_ref_node(ctx);
if (!ref_node)
return -ENOMEM;
+ init_fixed_file_ref_node(ctx, ref_node);
done = 0;
fds = u64_to_user_ptr(up->data);