mirror of
https://github.com/torvalds/linux
synced 2026-07-22 10:10:47 +09:00
fuse-uring: refactor io-uring header copying from ring
Move header copying from ring logic into a new copy_header_from_ring() function. This makes the copy_from_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:
committed by
Miklos Szeredi
parent
6582f8a066
commit
ba7d47897f
@@ -590,6 +590,18 @@ static __always_inline int copy_header_to_ring(void __user *ring,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __always_inline int copy_header_from_ring(void *header,
|
||||
const void __user *ring,
|
||||
size_t header_size)
|
||||
{
|
||||
if (copy_from_user(header, ring, header_size)) {
|
||||
pr_info_ratelimited("Copying header from 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)
|
||||
@@ -600,10 +612,10 @@ static int fuse_uring_copy_from_ring(struct fuse_ring *ring,
|
||||
int err;
|
||||
struct fuse_uring_ent_in_out ring_in_out;
|
||||
|
||||
err = copy_from_user(&ring_in_out, &ent->headers->ring_ent_in_out,
|
||||
sizeof(ring_in_out));
|
||||
err = copy_header_from_ring(&ring_in_out, &ent->headers->ring_ent_in_out,
|
||||
sizeof(ring_in_out));
|
||||
if (err)
|
||||
return -EFAULT;
|
||||
return err;
|
||||
|
||||
err = import_ubuf(ITER_SOURCE, ent->payload, ring->max_payload_sz,
|
||||
&iter);
|
||||
@@ -810,8 +822,8 @@ static void fuse_uring_commit(struct fuse_ring_ent *ent, struct fuse_req *req,
|
||||
struct fuse_ring *ring = ent->queue->ring;
|
||||
ssize_t err = -EFAULT;
|
||||
|
||||
if (copy_from_user(&req->out.h, &ent->headers->in_out,
|
||||
sizeof(req->out.h)))
|
||||
if (copy_header_from_ring(&req->out.h, &ent->headers->in_out,
|
||||
sizeof(req->out.h)))
|
||||
goto out;
|
||||
|
||||
err = fuse_uring_out_header_has_err(&req->out.h, req);
|
||||
|
||||
Reference in New Issue
Block a user