On Mon, Jan 6, 2025 at 4:25 PM Bernd Schubert <bschubert@xxxxxxx> wrote: > > Add special fuse-io-uring into the fuse argument > copy handler. > > Signed-off-by: Bernd Schubert <bschubert@xxxxxxx> Reviewed-by: Joanne Koong <joannelkoong@xxxxxxxxx> > --- > fs/fuse/dev.c | 12 +++++++++++- > fs/fuse/fuse_dev_i.h | 4 ++++ > 2 files changed, 15 insertions(+), 1 deletion(-) > > diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c > index 6ee7e28a84c80a3e7c8dc933986c0388371ff6cd..8b03a540e151daa1f62986aa79030e9e7a456059 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.copied_sz += 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..4a8a4feb2df53fb84938a6711e6bcfd0f1b9f615 100644 > --- a/fs/fuse/fuse_dev_i.h > +++ b/fs/fuse/fuse_dev_i.h > @@ -27,6 +27,10 @@ struct fuse_copy_state { > unsigned int len; > unsigned int offset; > unsigned int move_pages:1; > + unsigned int is_uring:1; > + struct { > + unsigned int copied_sz; /* copied size into the user buffer */ > + } ring; > }; > > static inline struct fuse_dev *fuse_get_dev(struct file *file) > > -- > 2.43.0 >