Add a helper function to grab the fixed file at a given offset. Will be useful for retarget op handlers. Signed-off-by: Dylan Yudaken <dylany@xxxxxxxx> --- io_uring/io_uring.c | 26 ++++++++++++++++++++------ io_uring/io_uring.h | 1 + 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c index 32eb305c4ce7..a052653fc65e 100644 --- a/io_uring/io_uring.c +++ b/io_uring/io_uring.c @@ -1841,6 +1841,23 @@ void io_wq_submit_work(struct io_wq_work *work) io_req_task_queue_fail(req, ret); } +static unsigned long __io_file_peek_fixed(struct io_kiocb *req, int fd) + __must_hold(&req->ctx->uring_lock) +{ + struct io_ring_ctx *ctx = req->ctx; + + if (unlikely((unsigned int)fd >= ctx->nr_user_files)) + return 0; + fd = array_index_nospec(fd, ctx->nr_user_files); + return io_fixed_file_slot(&ctx->file_table, fd)->file_ptr; +} + +struct file *io_file_peek_fixed(struct io_kiocb *req, int fd) + __must_hold(&req->ctx->uring_lock) +{ + return (struct file *) (__io_file_peek_fixed(req, fd) & FFS_MASK); +} + inline struct file *io_file_get_fixed(struct io_kiocb *req, int fd, unsigned int issue_flags) { @@ -1849,17 +1866,14 @@ inline struct file *io_file_get_fixed(struct io_kiocb *req, int fd, unsigned long file_ptr; io_ring_submit_lock(ctx, issue_flags); - - if (unlikely((unsigned int)fd >= ctx->nr_user_files)) - goto out; - fd = array_index_nospec(fd, ctx->nr_user_files); - file_ptr = io_fixed_file_slot(&ctx->file_table, fd)->file_ptr; + file_ptr = __io_file_peek_fixed(req, fd); file = (struct file *) (file_ptr & FFS_MASK); file_ptr &= ~FFS_MASK; /* mask in overlapping REQ_F and FFS bits */ req->flags |= (file_ptr << REQ_F_SUPPORT_NOWAIT_BIT); io_req_set_rsrc_node(req, ctx, 0); -out: + WARN_ON_ONCE(file && !test_bit(fd, ctx->file_table.bitmap)); + io_ring_submit_unlock(ctx, issue_flags); return file; } diff --git a/io_uring/io_uring.h b/io_uring/io_uring.h index ef77d2aa3172..781471bfba12 100644 --- a/io_uring/io_uring.h +++ b/io_uring/io_uring.h @@ -44,6 +44,7 @@ struct page **io_pin_pages(unsigned long ubuf, unsigned long len, int *npages); struct file *io_file_get_normal(struct io_kiocb *req, int fd); struct file *io_file_get_fixed(struct io_kiocb *req, int fd, unsigned issue_flags); +struct file *io_file_peek_fixed(struct io_kiocb *req, int fd); static inline bool io_req_ffs_set(struct io_kiocb *req) { -- 2.30.2