]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
fuse-uring: refactor io-uring header copying to ring
authorJoanne Koong <joannelkoong@gmail.com>
Fri, 12 Jun 2026 21:05:05 +0000 (14:05 -0700)
committerMiklos Szeredi <mszeredi@redhat.com>
Mon, 15 Jun 2026 12:06:20 +0000 (14:06 +0200)
Move header copying to ring logic into a new copy_header_to_ring()
function. This makes the copy_to_user() logic more clear and centralizes
error handling / rate-limited logging.

Reviewed-by: Bernd Schubert <bschubert@ddn.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: Baokun Li <libaokun@linux.alibaba.com>
Signed-off-by: Joanne Koong <joannelkoong@gmail.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/fuse/dev_uring.c

index 0b66fe3a5da0921fdddc559d860ac4d283b425be..1d37a2ee5532729cbe23cbd1e9ab5b375ac0caf8 100644 (file)
@@ -578,6 +578,18 @@ err:
        return err;
 }
 
+static __always_inline int copy_header_to_ring(void __user *ring,
+                                              const void *header,
+                                              size_t header_size)
+{
+       if (copy_to_user(ring, header, header_size)) {
+               pr_info_ratelimited("Copying header to ring failed.\n");
+               return -EFAULT;
+       }
+
+       return 0;
+}
+
 static int fuse_uring_copy_from_ring(struct fuse_ring *ring,
                                     struct fuse_req *req,
                                     struct fuse_ring_ent *ent)
@@ -640,13 +652,11 @@ static int fuse_uring_args_to_ring(struct fuse_ring *ring, struct fuse_req *req,
                 * Some op code have that as zero size.
                 */
                if (args->in_args[0].size > 0) {
-                       err = copy_to_user(&ent->headers->op_in, in_args->value,
-                                          in_args->size);
-                       if (err) {
-                               pr_info_ratelimited(
-                                       "Copying the header failed.\n");
-                               return -EFAULT;
-                       }
+                       err = copy_header_to_ring(&ent->headers->op_in,
+                                                 in_args->value,
+                                                 in_args->size);
+                       if (err)
+                               return err;
                }
                in_args++;
                num_args--;
@@ -662,9 +672,8 @@ static int fuse_uring_args_to_ring(struct fuse_ring *ring, struct fuse_req *req,
        }
 
        ent_in_out.payload_sz = cs.ring.copied_sz;
-       err = copy_to_user(&ent->headers->ring_ent_in_out, &ent_in_out,
-                          sizeof(ent_in_out));
-       return err ? -EFAULT : 0;
+       return copy_header_to_ring(&ent->headers->ring_ent_in_out, &ent_in_out,
+                                  sizeof(ent_in_out));
 }
 
 static int fuse_uring_copy_to_ring(struct fuse_ring_ent *ent,
@@ -693,14 +702,8 @@ static int fuse_uring_copy_to_ring(struct fuse_ring_ent *ent,
        }
 
        /* copy fuse_in_header */
-       err = copy_to_user(&ent->headers->in_out, &req->in.h,
-                          sizeof(req->in.h));
-       if (err) {
-               err = -EFAULT;
-               return err;
-       }
-
-       return 0;
+       return copy_header_to_ring(&ent->headers->in_out, &req->in.h,
+                                  sizeof(req->in.h));
 }
 
 static int fuse_uring_prepare_send(struct fuse_ring_ent *ent,