From: Keith Busch <kbusch@xxxxxxxxxx> Releasing the pre-registered file follows a repeated pattern. Introduce a helper to make it easier to add more complexity to this resource in the future. Signed-off-by: Keith Busch <kbusch@xxxxxxxxxx> --- io_uring/filetable.c | 33 +++++++++++++++++++++------------ io_uring/filetable.h | 3 +++ io_uring/rsrc.c | 5 +---- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/io_uring/filetable.c b/io_uring/filetable.c index 7b473259f3f4..1b8db1918678 100644 --- a/io_uring/filetable.c +++ b/io_uring/filetable.c @@ -76,19 +76,13 @@ static int io_install_fixed_file(struct io_ring_ctx *ctx, struct file *file, file_slot = io_fixed_file_slot(&ctx->file_table, slot_index); if (file_slot->file_ptr) { - struct file *old_file; - ret = io_rsrc_node_switch_start(ctx); if (ret) goto err; - old_file = (struct file *)(file_slot->file_ptr & FFS_MASK); - ret = io_queue_rsrc_removal(ctx->file_data, slot_index, - ctx->rsrc_node, old_file); + ret = io_file_slot_queue_removal(ctx, file_slot); if (ret) goto err; - file_slot->file_ptr = 0; - io_file_bitmap_clear(&ctx->file_table, slot_index); needs_switch = true; } @@ -148,7 +142,6 @@ int io_fixed_fd_install(struct io_kiocb *req, unsigned int issue_flags, int io_fixed_fd_remove(struct io_ring_ctx *ctx, unsigned int offset) { struct io_fixed_file *file_slot; - struct file *file; int ret; if (unlikely(!ctx->file_data)) @@ -164,13 +157,10 @@ int io_fixed_fd_remove(struct io_ring_ctx *ctx, unsigned int offset) if (!file_slot->file_ptr) return -EBADF; - file = (struct file *)(file_slot->file_ptr & FFS_MASK); - ret = io_queue_rsrc_removal(ctx->file_data, offset, ctx->rsrc_node, file); + ret = io_file_slot_queue_removal(ctx, file_slot); if (ret) return ret; - file_slot->file_ptr = 0; - io_file_bitmap_clear(&ctx->file_table, offset); io_rsrc_node_switch(ctx, ctx->file_data); return 0; } @@ -191,3 +181,22 @@ int io_register_file_alloc_range(struct io_ring_ctx *ctx, io_file_table_set_alloc_range(ctx, range.off, range.len); return 0; } + +int io_file_slot_queue_removal(struct io_ring_ctx *ctx, + struct io_fixed_file *file_slot) +{ + u32 slot_index = file_slot - ctx->file_table.files; + struct file *file; + int ret; + + file = (struct file *)(file_slot->file_ptr & FFS_MASK); + ret = io_queue_rsrc_removal(ctx->file_data, slot_index, + ctx->rsrc_node, file); + if (ret) + return ret; + + file_slot->file_ptr = 0; + io_file_bitmap_clear(&ctx->file_table, slot_index); + + return 0; +} diff --git a/io_uring/filetable.h b/io_uring/filetable.h index ff3a712e11bf..e52ecf359199 100644 --- a/io_uring/filetable.h +++ b/io_uring/filetable.h @@ -34,6 +34,9 @@ int io_fixed_fd_remove(struct io_ring_ctx *ctx, unsigned int offset); int io_register_file_alloc_range(struct io_ring_ctx *ctx, struct io_uring_file_index_range __user *arg); +int io_file_slot_queue_removal(struct io_ring_ctx *ctx, + struct io_fixed_file *file_slot); + unsigned int io_file_get_flags(struct file *file); static inline void io_file_bitmap_clear(struct io_file_table *table, int bit) diff --git a/io_uring/rsrc.c b/io_uring/rsrc.c index 59704b9ac537..1f10eecad4d7 100644 --- a/io_uring/rsrc.c +++ b/io_uring/rsrc.c @@ -469,12 +469,9 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx, file_slot = io_fixed_file_slot(&ctx->file_table, i); if (file_slot->file_ptr) { - file = (struct file *)(file_slot->file_ptr & FFS_MASK); - err = io_queue_rsrc_removal(data, i, ctx->rsrc_node, file); + err = io_file_slot_queue_removal(ctx, file_slot); if (err) break; - file_slot->file_ptr = 0; - io_file_bitmap_clear(&ctx->file_table, i); needs_switch = true; } if (fd != -1) { -- 2.30.2