On 08/01/2021 01:53, Bijan Mottahedeh wrote: > >> Forgot to mention, I failed to find where you do >> io_set_resource_node() in v4 for fixed reads/writes. >> Also, it should be done during submission, io_prep_rw() >> is the right place for that. > > Would something like below be ok? I renamed io_set_resource_node() to io_get_fixed_rsrc_ref() to make its function more clear and also distinguish it from io_sqe_rsrc_set_node(). looks good > > diff --git a/fs/io_uring.c b/fs/io_uring.c > index bd55d11..a9b9881 100644 > --- a/fs/io_uring.c > +++ b/fs/io_uring.c > @@ -1083,12 +1083,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); > } > } > @@ -2928,6 +2927,9 @@ static int io_prep_rw(struct io_kiocb *req, const struct i > 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; > } > > @@ -6452,7 +6454,7 @@ static struct file *io_file_get(struct io_submit_state *st > 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); > -- Pavel Begunkov