]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
virtio_fs: fix the hash table using in virtio_fs_enqueue_req()
authorLi RongQing <lirongqing@baidu.com>
Thu, 3 Jul 2025 06:47:38 +0000 (14:47 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Nov 2025 20:37:07 +0000 (15:37 -0500)
[ Upstream commit 7dbe6442487743ad492d9143f1f404c1f4a05e0e ]

The original commit be2ff42c5d6e ("fuse: Use hash table to link
processing request") converted fuse_pqueue->processing to a hash table,
but virtio_fs_enqueue_req() was not updated to use it correctly.
So use fuse_pqueue->processing as a hash table, this make the code
more coherent

Co-developed-by: Fushuai Wang <wangfushuai@baidu.com>
Signed-off-by: Fushuai Wang <wangfushuai@baidu.com>
Signed-off-by: Li RongQing <lirongqing@baidu.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/fuse/dev.c
fs/fuse/virtio_fs.c

index dbf53c7bc85354bb51d2903be6980d8cbca30e3d..612d4da6d7d91463bd9e5c923be3844cfe0e725e 100644 (file)
@@ -322,6 +322,7 @@ unsigned int fuse_req_hash(u64 unique)
 {
        return hash_long(unique & ~FUSE_INT_REQ_BIT, FUSE_PQ_HASH_BITS);
 }
+EXPORT_SYMBOL_GPL(fuse_req_hash);
 
 /*
  * A new request is available, wake fiq->waitq
index 76c8fd0bfc75d5089258e3bf57e1071702aacde7..1751cd6e3d42b4ded6240054cfe62e4158540690 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/cleanup.h>
 #include <linux/uio.h>
 #include "fuse_i.h"
+#include "fuse_dev_i.h"
 
 /* Used to help calculate the FUSE connection's max_pages limit for a request's
  * size. Parts of the struct fuse_req are sliced into scattergather lists in
@@ -1384,7 +1385,7 @@ static int virtio_fs_enqueue_req(struct virtio_fs_vq *fsvq,
        unsigned int out_sgs = 0;
        unsigned int in_sgs = 0;
        unsigned int total_sgs;
-       unsigned int i;
+       unsigned int i, hash;
        int ret;
        bool notify;
        struct fuse_pqueue *fpq;
@@ -1444,8 +1445,9 @@ static int virtio_fs_enqueue_req(struct virtio_fs_vq *fsvq,
 
        /* Request successfully sent. */
        fpq = &fsvq->fud->pq;
+       hash = fuse_req_hash(req->in.h.unique);
        spin_lock(&fpq->lock);
-       list_add_tail(&req->list, fpq->processing);
+       list_add_tail(&req->list, &fpq->processing[hash]);
        spin_unlock(&fpq->lock);
        set_bit(FR_SENT, &req->flags);
        /* matches barrier in request_wait_answer() */