On Mon, Dec 9, 2024 at 6:57 AM Bernd Schubert <bschubert@xxxxxxx> wrote: > > Add special fuse-io-uring into the fuse argument > copy handler. > > Signed-off-by: Bernd Schubert <bschubert@xxxxxxx> > --- > fs/fuse/dev.c | 12 +++++++++++- > fs/fuse/fuse_dev_i.h | 5 +++++ > 2 files changed, 16 insertions(+), 1 deletion(-) > > diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c > index 6ee7e28a84c80a3e7c8dc933986c0388371ff6cd..2ba153054f7ba61a870c847cb87d81168220661f 100644 > --- a/fs/fuse/dev.c > +++ b/fs/fuse/dev.c > @@ -786,6 +786,9 @@ static int fuse_copy_do(struct fuse_copy_state *cs, void **val, unsigned *size) > *size -= ncpy; > cs->len -= ncpy; > cs->offset += ncpy; > + if (cs->is_uring) > + cs->ring.offset += ncpy; > + > return ncpy; > } > > @@ -1922,7 +1925,14 @@ static struct fuse_req *request_find(struct fuse_pqueue *fpq, u64 unique) > int fuse_copy_out_args(struct fuse_copy_state *cs, struct fuse_args *args, > unsigned nbytes) > { > - unsigned reqsize = sizeof(struct fuse_out_header); > + > + unsigned int reqsize = 0; > + > + /* > + * Uring has all headers separated from args - args is payload only > + */ > + if (!cs->is_uring) > + reqsize = sizeof(struct fuse_out_header); > > reqsize += fuse_len_args(args->out_numargs, args->out_args); > > diff --git a/fs/fuse/fuse_dev_i.h b/fs/fuse/fuse_dev_i.h > index 21eb1bdb492d04f0a406d25bb8d300b34244dce2..0708730b656b97071de9a5331ef4d51a112c602c 100644 > --- a/fs/fuse/fuse_dev_i.h > +++ b/fs/fuse/fuse_dev_i.h > @@ -27,6 +27,11 @@ struct fuse_copy_state { > unsigned int len; > unsigned int offset; > unsigned int move_pages:1; > + unsigned int is_uring:1; > + struct { > + /* overall offset with the user buffer */ > + unsigned int offset; > + } ring; I find it a bit unintuitive that this is named offset when it's used only to keep track of the payload size. Maybe this should be renamed? Thanks, Joanne > }; > > static inline struct fuse_dev *fuse_get_dev(struct file *file) > > -- > 2.43.0 >