io_get_fixed_rsrc_ref() must be called for both buffers and files. Signed-off-by: Bijan Mottahedeh <bijan.mottahedeh@xxxxxxxxxx> --- fs/io_uring.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/fs/io_uring.c b/fs/io_uring.c index 5ab0ff1..37639b9 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -1079,12 +1079,11 @@ static inline void io_clean_op(struct io_kiocb *req) __io_clean_op(req); } -static inline void io_set_resource_node(struct io_kiocb *req) +static inline void io_get_fixed_rsrc_ref(struct io_kiocb *req, + struct fixed_rsrc_data *rsrc_data) { - struct io_ring_ctx *ctx = req->ctx; - if (!req->fixed_rsrc_refs) { - req->fixed_rsrc_refs = &ctx->file_data->node->refs; + req->fixed_rsrc_refs = &rsrc_data->node->refs; percpu_ref_get(req->fixed_rsrc_refs); } } @@ -2921,6 +2920,9 @@ static int io_prep_rw(struct io_kiocb *req, const struct io_uring_sqe *sqe) req->rw.addr = READ_ONCE(sqe->addr); req->rw.len = READ_ONCE(sqe->len); req->buf_index = READ_ONCE(sqe->buf_index); + if (req->opcode == IORING_OP_READ_FIXED || + req->opcode == IORING_OP_WRITE_FIXED) + io_get_fixed_rsrc_ref(req, ctx->buf_data); return 0; } @@ -6453,7 +6455,7 @@ static struct file *io_file_get(struct io_submit_state *state, return NULL; fd = array_index_nospec(fd, ctx->nr_user_files); file = io_file_from_index(ctx, fd); - io_set_resource_node(req); + io_get_fixed_rsrc_ref(req, ctx->file_data); } else { trace_io_uring_file_get(ctx, fd); file = __io_file_get(state, fd); -- 1.8.3.1