@@ -787,6 +787,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;
}
@@ -1926,7 +1929,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);
@@ -14,13 +14,13 @@
enum fuse_ring_req_state {
FRRS_INVALID = 0,
- /* ring entry received from userspace and it being processed */
+ /* The ring entry received from userspace and it being processed */
FRRS_COMMIT,
- /* The ring request waits for a new fuse request */
+ /* The ring entry is waiting for new fuse requests */
FRRS_WAIT,
- /* request is in or on the way to user space */
+ /* The ring entry is in or on the way to user space */
FRRS_USERSPACE,
};
@@ -28,6 +28,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/dev_uring_i.h | 6 +++--- fs/fuse/fuse_dev_i.h | 5 +++++ 3 files changed, 19 insertions(+), 4 deletions(-)