mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
fuse-uring: refactor io-uring header copying to ring
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>
This commit is contained in:
parent
6813da0950
commit
6582f8a066
|
|
@ -578,6 +578,18 @@ static int fuse_uring_out_header_has_err(struct fuse_out_header *oh,
|
|||
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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user