]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
fuse: clean up interrupt reading
authorJoanne Koong <joannelkoong@gmail.com>
Fri, 6 Mar 2026 01:05:25 +0000 (17:05 -0800)
committerMiklos Szeredi <mszeredi@redhat.com>
Mon, 15 Jun 2026 12:06:20 +0000 (14:06 +0200)
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>
fs/fuse/dev.c

index 4405b956c11596b9d08c833f244adb35fe26d71f..5763a7cd3b37faac71c016eee224d0c180a9b36c 100644 (file)
@@ -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)