summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoanne Koong <joannelkoong@gmail.com>2026-03-06 04:05:25 +0300
committerMiklos Szeredi <mszeredi@redhat.com>2026-06-15 15:06:20 +0300
commitac7304fa1de49e4663307dc92f34e455daa15a74 (patch)
treed8322805250269dd4f4be6e2af7884dd12b5a56a
parent1ca4b8b32e511654d5bb89da6c3d850f541e789e (diff)
downloadlinux-ac7304fa1de49e4663307dc92f34e455daa15a74.tar.xz
fuse: clean up interrupt reading
Clean up interrupt reading logic. Remove passing the pointer to the fuse request as an arg and make the header initializations more readable. Signed-off-by: Joanne Koong <joannelkoong@gmail.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
-rw-r--r--fs/fuse/dev.c32
1 files changed, 13 insertions, 19 deletions
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index 4405b956c115..5763a7cd3b37 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -1372,24 +1372,21 @@ static int request_pending(struct fuse_iqueue *fiq)
*
* Called with fiq->lock held, releases it
*/
-static int fuse_read_interrupt(struct fuse_iqueue *fiq,
- struct fuse_copy_state *cs,
- struct fuse_req *req)
+static int fuse_read_interrupt(struct fuse_iqueue *fiq, struct fuse_copy_state *cs)
__releases(fiq->lock)
{
- struct fuse_in_header ih;
- struct fuse_interrupt_in arg;
- unsigned reqsize = sizeof(ih) + sizeof(arg);
+ struct fuse_req *req = list_first_entry(&fiq->interrupts, struct fuse_req, intr_entry);
+ struct fuse_interrupt_in arg = {
+ .unique = req->in.h.unique,
+ };
+ struct fuse_in_header ih = {
+ .opcode = FUSE_INTERRUPT,
+ .unique = (req->in.h.unique | FUSE_INT_REQ_BIT),
+ .len = sizeof(ih) + sizeof(arg),
+ };
int err;
list_del_init(&req->intr_entry);
- memset(&ih, 0, sizeof(ih));
- memset(&arg, 0, sizeof(arg));
- ih.len = reqsize;
- ih.opcode = FUSE_INTERRUPT;
- ih.unique = (req->in.h.unique | FUSE_INT_REQ_BIT);
- arg.unique = req->in.h.unique;
-
spin_unlock(&fiq->lock);
err = fuse_copy_one(cs, &ih, sizeof(ih));
@@ -1397,7 +1394,7 @@ __releases(fiq->lock)
err = fuse_copy_one(cs, &arg, sizeof(arg));
fuse_copy_finish(cs);
- return err ? err : reqsize;
+ return err ? err : ih.len;
}
static struct fuse_forget_link *fuse_dequeue_forget(struct fuse_iqueue *fiq,
@@ -1566,11 +1563,8 @@ static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file,
goto err_unlock;
}
- if (!list_empty(&fiq->interrupts)) {
- req = list_entry(fiq->interrupts.next, struct fuse_req,
- intr_entry);
- return fuse_read_interrupt(fiq, cs, req);
- }
+ if (!list_empty(&fiq->interrupts))
+ return fuse_read_interrupt(fiq, cs);
if (forget_pending(fiq)) {
if (list_empty(&fiq->pending) || fiq->forget_batch-- > 0)