Message ID | 20241209-fuse-uring-for-6-10-rfc4-v8-8-d9f9f2642be3@ddn.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | fuse: fuse-over-io-uring | expand |
On Mon, Dec 9, 2024 at 6:57 AM Bernd Schubert <bschubert@ddn.com> wrote: > > Add special fuse-io-uring into the fuse argument > copy handler. > > Signed-off-by: Bernd Schubert <bschubert@ddn.com> > --- > 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 >
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; }; static inline struct fuse_dev *fuse_get_dev(struct file *file)
Add special fuse-io-uring into the fuse argument copy handler. Signed-off-by: Bernd Schubert <bschubert@ddn.com> --- fs/fuse/dev.c | 12 +++++++++++- fs/fuse/fuse_dev_i.h | 5 +++++ 2 files changed, 16 insertions(+), 1 deletion(-)